diff --git a/clone-agent/.gitmodules b/clone-agent/.gitmodules new file mode 100644 index 00000000..f45c9dc3 --- /dev/null +++ b/clone-agent/.gitmodules @@ -0,0 +1,21 @@ +[submodule "contracts/lib/forge-std"] + path = contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "contracts/lib/openzeppelin-contracts"] + path = contracts/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "contracts/lib/v2-periphery"] + path = contracts/lib/v2-periphery + url = https://github.com/Uniswap/v2-periphery +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "lib/v2-periphery"] + path = lib/v2-periphery + url = https://github.com/Uniswap/v2-periphery +[submodule "lib/create3"] + path = lib/create3 + url = https://github.com/0xsequence/create3 +[submodule "contracts/lib/create3"] + path = contracts/lib/create3 + url = https://github.com/0xsequence/create3 diff --git a/clone-agent/README.md b/clone-agent/README.md new file mode 100644 index 00000000..f5703d6f --- /dev/null +++ b/clone-agent/README.md @@ -0,0 +1,32 @@ +# 🤖 Clone + +Clone is a **no-code agent deployer** that makes it easy to create and launch agents on **Telegram** in just a few clicks. Built for the **Agentic Ethereum Hackathon**, it integrates with multiple protocols to enable seamless automation. + +## 🚀 Features + +- **One-click agent deployment** – No technical knowledge required. +- **Cross-chain execution** – Powered by **Warden Agent Kit** for interoperability. +- **Data verification** – Uses **EigenLayer** to ensure trusted data sources. +- **Optimized liquidity allocation** – Utilizes **Warden Orderbook Smart Contracts** to track and allocate funds efficiently. + +## 🔗 Integrations + +- **Eliza on Flow SDK** – Supports `pump.flow` and VRF actions. +- **Warden Protocol** – Enables cross-chain interactions and liquidity optimization. +- **EigenLayer** – Ensures data integrity with trust-minimized verification. + +## 📂 Project Links + +- **GitHub:** [Clone Repository](http://github.com/Not-Sarthak/clone-xyz) +- **ETHGlobal Submission:** [View on ETHGlobal](http://ethglobal.com/showcase/clone-y0ucj) +- **Warden Orderbook Smart Contract:** `0xf3451c19a70852533c3416e76e229e15166d5f33` + +## 🛠️ How to Use + +1. Select a **pre-built agent template**. +2. Click **Deploy**, and your bot goes live on Telegram. +3. Manage and interact with your agent—all without writing code. + +## 💡 What's Next? + +We’re excited to continue building and expanding Clone's capabilities. Contributions and feedback are always welcome! 🚀 diff --git a/clone-agent/contracts/.github/workflows/test.yml b/clone-agent/contracts/.github/workflows/test.yml new file mode 100644 index 00000000..762a2966 --- /dev/null +++ b/clone-agent/contracts/.github/workflows/test.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Show Forge version + run: | + forge --version + + - name: Run Forge fmt + run: | + forge fmt --check + id: fmt + + - name: Run Forge build + run: | + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/clone-agent/contracts/.gitignore b/clone-agent/contracts/.gitignore new file mode 100644 index 00000000..8379a1ad --- /dev/null +++ b/clone-agent/contracts/.gitignore @@ -0,0 +1,20 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env + +# Node modules +node_modules/ + +# Libs +lib/ diff --git a/clone-agent/contracts/README.md b/clone-agent/contracts/README.md new file mode 100644 index 00000000..30955c2c --- /dev/null +++ b/clone-agent/contracts/README.md @@ -0,0 +1,9 @@ +# Warden Contracts + +```bash +TX_FIELDS="\ +(100000000000000,\ +11155111,\ +0x387d311e47e80b498169e6fb51d3193167d89F7D,\ +0x38ed17390000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000c7d713b49da000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e000000000000000000000000000000000000000000000000000000006590af000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48)" +``` diff --git a/clone-agent/contracts/broadcast/Deploy.s.sol/10010/run-1739040681.json b/clone-agent/contracts/broadcast/Deploy.s.sol/10010/run-1739040681.json new file mode 100644 index 00000000..d0ce8ac8 --- /dev/null +++ b/clone-agent/contracts/broadcast/Deploy.s.sol/10010/run-1739040681.json @@ -0,0 +1,238 @@ +{ + "transactions": [ + { + "hash": "0xcfcb2d0db51fa9c7cb8d99e09dcd6ac8733094a26c390bc92de8c05443794e61", + "transactionType": "CREATE", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": null, + "arguments": null, + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "gas": "0x3ab04", + "value": "0x0", + "input": "0x60808060405234601557610266908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063481286e6146100375763cdcb760a1461003257600080fd5b6100d4565b346100a05760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a05760043560243560c05260a0523060805260ff608b5360206055608b2073ffffffffffffffffffffffffffffffffffffffff60405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a05760043560243567ffffffffffffffff81116100a057366023820112156100a05780600401359167ffffffffffffffff83116101d157604051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8701160116820182811067ffffffffffffffff8211176101d15760405283825236602485850101116100a05760006020856101cd9660246101a6970183870137840101526101d6565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b6100a5565b9080511561022f5760208151910134f59073ffffffffffffffffffffffffffffffffffffffff82161561020557565b7f741752c20000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4ca249dc0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081c000a", + "nonce": "0x0", + "chainId": "0x271a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x74f818d9e09c6482f38109e1e08fee11dcbbfbd45f4e4af5a9870cc6a500912d", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003e9", + "0x60808060405234601a576001600055610a0890816100208239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630af83b28146107db575080634420e486146105f557806350cfe3c71461057a5763aa733a441461004b57600080fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261057557610082610927565b6024359060026000541461054b57600260005573ffffffffffffffffffffffffffffffffffffffff169081156105215733600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416156104f75780156104cd5781600052600260205260406000208160005260205261010560406000205461094a565b6104a3576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000335af160009181610472575b50610172577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b1561044857604051917f88328a6900000000000000000000000000000000000000000000000000000000835260008360048183335af192831561043c57600093610377575b508060005260026020526040600020826000526020526040600020835167ffffffffffffffff8111610348576101ed825461094a565b601f8111610300575b50602094601f821160011461027d57948192939495600092610272575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b337f4a13f12b0824ee061bfc467b7fc9c0f9505f9290bfc7d773a5909c36d4c22bed600080a46001600055005b015190503880610213565b601f1982169583600052806000209160005b8881106102e8575083600195969798106102b1575b505050811b019055610245565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806102a4565b9192602060018192868501518155019401920161028f565b826000526020600020601f830160051c8101916020841061033e575b601f0160051c01905b81811061033257506101f6565b60008155600101610325565b909150819061031c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90923d8082843e610388818461099d565b8201916020818403126104345780519067ffffffffffffffff8211610438570182601f820112156104345780519167ffffffffffffffff831161040757604051936103dd6020601f19601f870116018661099d565b838552602084840101116104045750906103fd91602080850191016109c0565b91386101b7565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b7fec84b1da0000000000000000000000000000000000000000000000000000000060005260046000fd5b61049591925060203d60201161049c575b61048d818361099d565b8101906109e3565b9038610143565b503d610483565b7f34a849b30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0af806e00000000000000000000000000000000000000000000000000000000060005260046000fd5b7f15dbf9e70000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4595d0750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff6105c6610927565b166000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610641610927565b1680156107b15780600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416610787576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000865af160009181610766575b506106da577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b61073c578060005260016020526040600020337fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055337f0a31ee9d46a828884b81003c8498156ea6aa15b9b54bdd0ef0b533d9eba57e55600080a3005b7f68f46c450000000000000000000000000000000000000000000000000000000060005260046000fd5b61078091925060203d60201161049c5761048d818361099d565b90836106ab565b7f604ad0350000000000000000000000000000000000000000000000000000000060005260046000fd5b7f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610827610927565b1660005260026020526040600020602435600052602052604060002060008154916108518361094a565b9081855260208501936001811690816000146108eb57506001146108ac575b6108a3604086601f19601f88610888848a038561099d565b845195869460208652518092816020880152878701906109c0565b01168101030190f35b6000908152602081209092505b8183106108d15750508201602001601f19601f610870565b6001816020929493945483858901015201910191906108b9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685525050151560051b83016020019050601f19601f610870565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361057557565b90600182811c92168015610993575b602083101461096457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610959565b90601f601f19910116810190811067ffffffffffffffff82111761034857604052565b60005b8381106109d35750506000910152565b81810151838201526020016109c3565b9081602091031261057557518015158103610575579056fea164736f6c634300081c000a" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0xdf9e1", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003e900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000a2860808060405234601a576001600055610a0890816100208239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630af83b28146107db575080634420e486146105f557806350cfe3c71461057a5763aa733a441461004b57600080fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261057557610082610927565b6024359060026000541461054b57600260005573ffffffffffffffffffffffffffffffffffffffff169081156105215733600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416156104f75780156104cd5781600052600260205260406000208160005260205261010560406000205461094a565b6104a3576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000335af160009181610472575b50610172577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b1561044857604051917f88328a6900000000000000000000000000000000000000000000000000000000835260008360048183335af192831561043c57600093610377575b508060005260026020526040600020826000526020526040600020835167ffffffffffffffff8111610348576101ed825461094a565b601f8111610300575b50602094601f821160011461027d57948192939495600092610272575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b337f4a13f12b0824ee061bfc467b7fc9c0f9505f9290bfc7d773a5909c36d4c22bed600080a46001600055005b015190503880610213565b601f1982169583600052806000209160005b8881106102e8575083600195969798106102b1575b505050811b019055610245565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806102a4565b9192602060018192868501518155019401920161028f565b826000526020600020601f830160051c8101916020841061033e575b601f0160051c01905b81811061033257506101f6565b60008155600101610325565b909150819061031c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90923d8082843e610388818461099d565b8201916020818403126104345780519067ffffffffffffffff8211610438570182601f820112156104345780519167ffffffffffffffff831161040757604051936103dd6020601f19601f870116018661099d565b838552602084840101116104045750906103fd91602080850191016109c0565b91386101b7565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b7fec84b1da0000000000000000000000000000000000000000000000000000000060005260046000fd5b61049591925060203d60201161049c575b61048d818361099d565b8101906109e3565b9038610143565b503d610483565b7f34a849b30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0af806e00000000000000000000000000000000000000000000000000000000060005260046000fd5b7f15dbf9e70000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4595d0750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff6105c6610927565b166000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610641610927565b1680156107b15780600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416610787576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000865af160009181610766575b506106da577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b61073c578060005260016020526040600020337fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055337f0a31ee9d46a828884b81003c8498156ea6aa15b9b54bdd0ef0b533d9eba57e55600080a3005b7f68f46c450000000000000000000000000000000000000000000000000000000060005260046000fd5b61078091925060203d60201161049c5761048d818361099d565b90836106ab565b7f604ad0350000000000000000000000000000000000000000000000000000000060005260046000fd5b7f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610827610927565b1660005260026020526040600020602435600052602052604060002060008154916108518361094a565b9081855260208501936001811690816000146108eb57506001146108ac575b6108a3604086601f19601f88610888848a038561099d565b845195869460208652518092816020880152878701906109c0565b01168101030190f35b6000908152602081209092505b8183106108d15750508201602001601f19601f610870565b6001816020929493945483858901015201910191906108b9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685525050151560051b83016020019050601f19601f610870565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361057557565b90600182811c92168015610993575b602083101461096457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610959565b90601f601f19910116810190811067ffffffffffffffff82111761034857604052565b60005b8381106109d35750506000910152565b81810151838201526020016109c3565b9081602091031261057557518015158103610575579056fea164736f6c634300081c000a000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x324faaf2281c7fe53197800d3fde0d2592528987", + "initCode": "0x60808060405234601a576001600055610a0890816100208239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630af83b28146107db575080634420e486146105f557806350cfe3c71461057a5763aa733a441461004b57600080fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261057557610082610927565b6024359060026000541461054b57600260005573ffffffffffffffffffffffffffffffffffffffff169081156105215733600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416156104f75780156104cd5781600052600260205260406000208160005260205261010560406000205461094a565b6104a3576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000335af160009181610472575b50610172577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b1561044857604051917f88328a6900000000000000000000000000000000000000000000000000000000835260008360048183335af192831561043c57600093610377575b508060005260026020526040600020826000526020526040600020835167ffffffffffffffff8111610348576101ed825461094a565b601f8111610300575b50602094601f821160011461027d57948192939495600092610272575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b337f4a13f12b0824ee061bfc467b7fc9c0f9505f9290bfc7d773a5909c36d4c22bed600080a46001600055005b015190503880610213565b601f1982169583600052806000209160005b8881106102e8575083600195969798106102b1575b505050811b019055610245565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806102a4565b9192602060018192868501518155019401920161028f565b826000526020600020601f830160051c8101916020841061033e575b601f0160051c01905b81811061033257506101f6565b60008155600101610325565b909150819061031c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90923d8082843e610388818461099d565b8201916020818403126104345780519067ffffffffffffffff8211610438570182601f820112156104345780519167ffffffffffffffff831161040757604051936103dd6020601f19601f870116018661099d565b838552602084840101116104045750906103fd91602080850191016109c0565b91386101b7565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b7fec84b1da0000000000000000000000000000000000000000000000000000000060005260046000fd5b61049591925060203d60201161049c575b61048d818361099d565b8101906109e3565b9038610143565b503d610483565b7f34a849b30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0af806e00000000000000000000000000000000000000000000000000000000060005260046000fd5b7f15dbf9e70000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4595d0750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff6105c6610927565b166000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610641610927565b1680156107b15780600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416610787576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000865af160009181610766575b506106da577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b61073c578060005260016020526040600020337fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055337f0a31ee9d46a828884b81003c8498156ea6aa15b9b54bdd0ef0b533d9eba57e55600080a3005b7f68f46c450000000000000000000000000000000000000000000000000000000060005260046000fd5b61078091925060203d60201161049c5761048d818361099d565b90836106ab565b7f604ad0350000000000000000000000000000000000000000000000000000000060005260046000fd5b7f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610827610927565b1660005260026020526040600020602435600052602052604060002060008154916108518361094a565b9081855260208501936001811690816000146108eb57506001146108ac575b6108a3604086601f19601f88610888848a038561099d565b845195869460208652518092816020880152878701906109c0565b01168101030190f35b6000908152602081209092505b8183106108d15750508201602001601f19601f610870565b6001816020929493945483858901015201910191906108b9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685525050151560051b83016020019050601f19601f610870565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361057557565b90600182811c92168015610993575b602083101461096457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610959565b90601f601f19910116810190811067ffffffffffffffff82111761034857604052565b60005b8381106109d35750506000910152565b81810151838201526020016109c3565b9081602091031261057557518015158103610575579056fea164736f6c634300081c000a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x8791336ed32c4debdd384b3159101f055bc818463fa680e26de8c130752c1249", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea", + "0x60a034607357601f614ec038819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b038116908190036073576001600055608052604051614e31908161008f823960805181818160b001526103720152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780633dc48a341461004d57637fddd6021461004857600080fd5b610217565b610159565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357606060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff821161008357610213926101d26101ec9336906004016100e4565b906101db610115565b9260843594600401906004016102a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761028960209161027361028160243560405192839187830195869091604092825260208201520190565b03601f1981018352826105db565b519020610aeb565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9293949190916002600054146105825760026000556040516102dd81610273602082019432869091604092825260208201520190565b519020946102ff6102f8876000526001602052604060002090565b5460ff1690565b610558576102736103b4936103a46103c0966102736103ba96328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36140859661034f60208901610603565b97808952610da060208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109ac565b6040519485936020850190610ab4565b90610ab4565b83610c81565b916103ca81610aeb565b73ffffffffffffffffffffffffffffffffffffffff84168015918215610537575b505061050a57813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af1908115610505576104999261046e926104ea575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907f51cd0090f3c14be5310fb02efc5d7f8aa69cff235becdf1d944ee6c420b2deb690602090a2906104e86001600055565b565b806104f960006104ff936105db565b806100d9565b3861045d565b610adf565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff161415905038806103eb565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176105fe57604052565b6105ac565b906104e860405192836105db565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107765750505050505090565b90919293949560208061079e83601f1986600196030188526107988b88610643565b90610693565b9801940194019294939190610766565b6108809167ffffffffffffffff6107c4836106e6565b16815261087261086761080c6107f16107e060208701876106fb565b60e0602088015260e087019161074e565b6107fe6040870187610643565b908683036040880152610693565b61082c61081b606087016106e6565b67ffffffffffffffff166060860152565b61084c61083b608087016106e6565b67ffffffffffffffff166080860152565b61085960a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b90565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761092361091861090784610880960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff6108f760408301610138565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106b4565b9060208184039101526107ae565b90602083828152019260208260051b82010193836000925b8484106109595750505050505090565b90919293949560208082601f1985600195030187526109788a87610611565b9082806109966109888580610643565b604086526040860191610693565b9301359101529801940194019294939190610949565b9190969593949660a08352803560a08401526020810135936004851015610083576104e896610a6b610a9894610a5d6109f4610a799660809a60c08b01526040810190610611565b606060e08a0152610a2c610a218a6101006040610a118680610643565b92909301526101408d0191610693565b916020810190610643565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008b8403016101208c0152610693565b908782036020890152610883565b918583036040870152610931565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610acc575050016000815290565b8060208092840101518185015201610abb565b6040513d6000823e3d90fd5b610c2873ffffffffffffffffffffffffffffffffffffffff806108809360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b766075826105db565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c0c816017840103601f1981018352826105db565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c7c573d9067ffffffffffffffff82116105fe5760405191610c70601f8201601f1916602001846105db565b82523d6000602084013e565b606090565b919060405192610c926040856105db565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610cc581610aeb565b93843b610d75576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d4b5781600092918360208194519301915af1610d09610c41565b50158015610d42575b610d1857565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d12565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe60e080604052346113dd57614085803803809161001c828561147b565b8339810160a0828203126113dd5781516001600160401b0381116113dd578201916060838303126113dd57604051926100548461140f565b80518452602081015160048110156113dd5760208501526040810151906001600160401b0382116113dd5701906040828403126113dd57604051916100988361142a565b80516001600160401b0381116113dd57846100b49183016114c1565b83526020810151906001600160401b0382116113dd576100d6918591016114c1565b602083810191909152604085019283528101516001600160401b0381116113dd578101906040828503126113dd57604051916101118361142a565b80516001600160401b0381116113dd5781016080818703126113dd576040519061013a82611445565b805182526020810151602083015261015460408201611516565b60408301526060810151906001600160401b0382116113dd57610179918891016114c1565b606082015283526020810151906001600160401b0382116113dd570160e0818603126113dd57604051906101ac82611460565b6101b58161152a565b825260208101516001600160401b0381116113dd57810186601f820112156113dd5780516101e28161153e565b916101f0604051938461147b565b81835260208084019260051b820101918983116113dd5760208201905b8382106113e25750505050602083015260408101516001600160401b0381116113dd578661023c9183016114c1565b604083015261024d6060820161152a565b606083015261025e6080820161152a565b608083015260a08101516001600160401b0381116113dd57866102829183016114c1565b60a083015260c0810151906001600160401b0382116113dd576102a7918791016114c1565b60c08201526020830190815260408201516001600160401b0381116113dd57820185601f820112156113dd578051906102df8261153e565b966102ed604051988961147b565b82885260208089019360051b830101918183116113dd5760208101935b83851061137557505050505061032e608061032760608501611516565b9301611516565b815184519094916001600160a01b03851615611364576001600160a01b03169081156113535760a086015151156113425760c0860151511561133157604001516001600160a01b03161561132057610900608052604094855190610392878361147b565b600182526020820191601f19880136843760016103ae8261157a565b526080519151885163338c1f5160e01b81526001600160401b0390911660048201526024810189905290516044820181905290926001600160a01b0390921691839160648301919060005b8181106113045750505091818060009403915afa9081156110ec57600091611119575b5061042d602061043792015161157a565b5151805190611614565b901561110857600080546001600160a01b0319166001600160a01b0392909216919091179055600180558751156110f75761090260a052855160c06104a160208351930151926104b389519485938493631e879a6d60e11b85528c60048601526044850190611555565b83810360031901602485015290611555565b03816109025afa9081156110ec57600091611046575b505060c05260005b865181101561066c5760008751821015610658575060208160051b880101516010546801000000000000000081101561062c5760018101806010558110156106425760106000528151805160019290921b7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019291906001600160401b03821161062c57610569826105638654611587565b866115d8565b602090601f83116001146105bd57926105a48360019796959460209489966000926105b2575b50508160011b916000199060031b1c19161790565b84555b0151910155016104d1565b01519050388061058f565b90601f1983169185600052816000209260005b818110610614575093602093600198979693899693838895106105fb575b505050811b0184556105a7565b015160001960f88460031b161c191690553880806105ee565b929360206001819287860151815501950193016105d0565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b50602087805160025501519460048610156110305760009560ff80196003541691161760035551805180519060018060401b03821161101c576106b0600454611587565b601f8111610fce575b50602090601f8311600114610f665791806106ed92602095948b92610f5b5750508160011b916000199060031b1c19161790565b6004555b01518051906001600160401b038211610f475761070f600554611587565b601f8111610f16575b50602090601f8311600114610eae57918061074c92606095948a92610ea35750508160011b916000199060031b1c19161790565b6005555b518051600655602081015160075584810151600880546001600160a01b0319166001600160a01b039290921691909117905501518051906001600160401b038211610b99576107a0600954611587565b601f8111610e55575b50602090601f8311600114610df0576107d99291879183610bad5750508160011b916000199060031b1c19161790565b6009555b518051600a80546001600160401b0319166001600160401b03929092169190911790556020810151805190680100000000000000008211610b9957600b5482600b55808310610d5c575b50600b865285907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020015b838310610c6b5750505050808301518051906001600160401b038211610b995761087f600c54611587565b601f8111610c1d575b50602090601f8311600114610bb8576108b89291879183610bad5750508160011b916000199060031b1c19161790565b600c555b6060810151600d805460808401516001600160801b03199091166001600160401b039384161790861b6fffffffffffffffff00000000000000001617905560a08201518051918211610b9957610913600e54611587565b601f8111610b4b575b50602090601f8311600114610ae35791806109509260c095948992610ad85750508160011b916000199060031b1c19161790565b600e555b0151805190936001600160401b038211610ac457610973600f54611587565b601f8111610a6b575b50602090601f8311600114610a0857906109ac939495836109fd5750508160011b916000199060031b1c19161790565b600f555b60118054610100600160a81b03191660089290921b610100600160a81b0316919091179055516128ab90816117da823960805181611ffc015260a05181611be6015260c051816107160152f35b01519050858061058f565b90601f198316600f8352818320925b818110610a5357509583600195969710610a3a575b505050811b01600f556109b0565b015160001960f88460031b161c19169055848080610a2c565b9192602060018192868b015181550194019201610a17565b600f8252610ab4907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f850160051c81019160208610610aba575b601f0160051c01906115c1565b8561097c565b9091508190610aa7565b634e487b7160e01b81526041600452602490fd5b01519050888061058f565b600e87528187209190601f198416885b818110610b33575091600193918560c097969410610b1a575b505050811b01600e55610954565b015160001960f88460031b161c19169055878080610b0c565b92936020600181928786015181550195019301610af3565b600e8752610b93907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd601f850160051c81019160208610610aba57601f0160051c01906115c1565b8661091c565b634e487b7160e01b86526041600452602486fd5b01519050878061058f565b600c87528187209190601f198416885b818110610c055750908460019594939210610bec575b505050811b01600c556108bc565b015160001960f88460031b161c19169055868080610bde565b92936020600181928786015181550195019301610bc8565b600c8752610c65907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f850160051c81019160208610610aba57601f0160051c01906115c1565b86610888565b80518051906001600160401b038211610d4857610c8c826105638654611587565b6020908a601f8411600114610cde578360019592946020948796610cc49492610cd35750508160011b916000199060031b1c19161790565b85555b01920192019190610854565b015190508e8061058f565b50848b52818b209190601f1984168c5b818110610d305750936020936001969387969383889510610d17575b505050811b018555610cc7565b015160001960f88460031b161c191690558d8080610d0a565b92936020600181928786015181550195019301610cee565b634e487b7160e01b8a52604160045260248afd5b600b87527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99081019083015b818110610d955750610827565b80610da260019254611587565b80610daf575b5001610d88565b601f81118314610dc457508881555b89610da8565b818a5260208a20610ddf91601f0160051c81019084016115c1565b808952886020812081835555610dbe565b600987528187209190601f198416885b818110610e3d5750908460019594939210610e24575b505050811b016009556107dd565b015160001960f88460031b161c19169055868080610e16565b92936020600181928786015181550195019301610e00565b60098752610e9d907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af601f850160051c81019160208610610aba57601f0160051c01906115c1565b866107a9565b01519050898061058f565b600588528188209190601f198416895b818110610efe5750916001939185606097969410610ee5575b505050811b01600555610750565b015160001960f88460031b161c19169055888080610ed7565b92936020600181928786015181550195019301610ebe565b610f41906005895260208920601f850160051c81019160208610610aba57601f0160051c01906115c1565b87610718565b634e487b7160e01b87526041600452602487fd5b015190508a8061058f565b600489528189209190601f1984168a5b818110610fb65750916001939185602097969410610f9d575b505050811b016004556106f1565b015160001960f88460031b161c19169055898080610f8f565b92936020600181928786015181550195019301610f76565b60048952611016907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610aba57601f0160051c01906115c1565b886106b9565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b600052602160045260246000fd5b8060c03d60c0116110e5575b61105c818361147b565b8101039160c083126110e257606088519361107685611445565b61107f8461152a565b855261108d6020850161152a565b602086015261109d8a850161152a565b858b0152605f1901126110e2575060a08751916110b98361140f565b6110c56060820161152a565b8352608081015160208401520151878201526060820152386104c9565b80fd5b503d611052565b86513d6000823e3d90fd5b63107d9ce760e31b60005260046000fd5b6307456b9160e21b60005260046000fd5b903d8082843e611129818461147b565b8201916020818403126112fc578051906001600160401b03821161130057019187838203126112fc5787519261115e8461142a565b80516001600160401b0381116112f857810160e0818403126112f85789519061118682611460565b61118f8161152a565b825261119d6020820161152a565b60208301526111ad8b820161152a565b8b830152606081015160038110156112f457606083015260808101516001600160401b0381116112f457816111e98660c09361120595016114c1565b60808501526111fa60a0820161152a565b60a08501520161152a565b60c082015284526020810151906001600160401b0382116112f8570181601f820112156113005780516112378161153e565b936112448b51958661147b565b81855260208086019260051b840101928484116112fc5760208101925b84841061127e57505050505060208301919091525061042d61041c565b83516001600160401b0381116112f85782018d601f1982890301126112f8578d51906112a98261142a565b60208101516001600160401b0381116112f457908f918960206112ce928401016114c1565b8352015160038110156112f05791816020938480940152815201930192611261565b8480fd5b8580fd5b8380fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103f9565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116113dd5782016040818503601f1901126113dd57604051916113a28361142a565b6020820151926001600160401b0384116113dd576040836113ca8860208098819801016114c1565b835201518382015281520194019361030a565b600080fd5b81516001600160401b0381116113dd576020916114048d8480948801016114c1565b81520191019061020d565b606081019081106001600160401b0382111761062c57604052565b604081019081106001600160401b0382111761062c57604052565b608081019081106001600160401b0382111761062c57604052565b60e081019081106001600160401b0382111761062c57604052565b601f909101601f19168101906001600160401b0382119082101761062c57604052565b60005b8381106114b15750506000910152565b81810151838201526020016114a1565b81601f820112156113dd5780516020909101906001600160401b03811161062c57604051926114fa601f8301601f19166020018561147b565b818452818301116113dd5761151391602084019061149e565b90565b51906001600160a01b03821682036113dd57565b51906001600160401b03821682036113dd57565b6001600160401b03811161062c5760051b60200190565b9060209161156e8151809281855285808601910161149e565b601f01601f1916010190565b8051156106425760200190565b90600182811c921680156115b7575b60208310146115a157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611596565b8181106115cc575050565b600081556001016115c1565b9190601f81116115e757505050565b611612926000526020600020906020601f840160051c83019310610aba57601f0160051c01906115c1565b565b90600061060f60f31b61ffff60f01b602085015116148060011b90808204600214901517156116895760280190816028116116755750810361166b57600061165b9261169d565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611731576000948101809111611753579192905b8183106116ed5750505060019190565b9092919360ff6117078160f81b6020888601015116611767565b16600f8111611747578160041b9180830460101490151715611731576001910194019192906116dd565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f8111806117cf575b1561178357602f190160ff1690565b60608111806117c5575b1561179c576056190160ff1690565b60408111806117bb575b156117b5576036190160ff1690565b5060ff90565b50604781106117a6565b506067811061178d565b50603a811061177456fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100b7578063229e81fb146100b257806342859ab3146100ad5780635a509280146100a857806362b61c8b146100a357806378b903371461009e578063819ef8ba1461009957806388328a6914610094578063b3d7ad481461008f5763cad31c741461008a57600080fd5b6110de565b610faf565b610ea5565b610d9a565b610b06565b610a8c565b610973565b61057b565b6104ba565b346100d95760006003193601126100d95760ff60115416151560805260206080f35b600080fd5b60009103126100d957565b90600182811c92168015610132575b602083101461010357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916100f8565b6004546000929161014c826100e9565b80825291600181169081156101c15750600114610167575050565b600460009081529293509091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8383106101a7575060209250010190565b600181602092949394548385870101520191019190610196565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6005546000929161020b826100e9565b80825291600181169081156101c15750600114610226575050565b600560009081529293509091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b838310610266575060209250010190565b600181602092949394548385870101520191019190610255565b60009291815491610290836100e9565b80835292600181169081156102e657506001146102ac57505050565b60009081526020812093945091925b8383106102cc575060209250010190565b6001816020929493945483858701015201910191906102bb565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761036d57604052565b610322565b60a0810190811067ffffffffffffffff82111761036d57604052565b6080810190811067ffffffffffffffff82111761036d57604052565b60e0810190811067ffffffffffffffff82111761036d57604052565b6060810190811067ffffffffffffffff82111761036d57604052565b90601f601f19910116810190811067ffffffffffffffff82111761036d57604052565b6040519061041f8261041881600e610280565b03836103e2565b565b6040519061041f8261041881600f610280565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561046d57565b610434565b60005b8381106104855750506000910152565b8181015183820152602001610475565b90601f19601f6020936104b381518092818752878088019101610472565b0116010190565b346100d95760006003193601126100d95760025460ff600354166040516104e081610351565b6040516104f7816104f08161013c565b03826103e2565b8152604051610509816104f0816101fb565b60208201908152604051938452600483101561046d57610546610577928594602086015260606040860152516040606086015260a0850190610495565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0848303016080850152610495565b0390f35b346100d95760a06003193601126100d9576004356024359060643591608435916002600154146108cc57600260015560115473ffffffffffffffffffffffffffffffffffffffff600882901c1633036108a25760ff16610878576105e46105e0611b97565b1590565b61084e5761062b6000936105f6611198565b9060405196879586957f62b61c8b000000000000000000000000000000000000000000000000000000008752600487016112d6565b0381305afa9081156107c857600090600092610826575b5061064c906113a5565b6106a96020604051610676816106688685830160209181520190565b03601f1981018352826103e2565b604051809381927fcad31c74000000000000000000000000000000000000000000000000000000008352600483016115af565b03816000305af180156107c8576106f4916000916107f7575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601154169115151617601155565b60115460ff166107cd575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100d9576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107c8576107ad575b5060115460ff1661079a60018055565b6040805191151582526020820192909252f35b806107bc60006107c2936103e2565b806100de565b3861078a565b611347565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a16106ff565b610819915060203d60201161081f575b61081181836103e2565b8101906114c9565b386106c2565b503d610807565b61064c925061084891503d806000833e61084081836103e2565b810190611266565b91610642565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100d95790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a0608061096a6060850151838386015260c0850190610495565b93015191015290565b346100d95760206003193601126100d95760043567ffffffffffffffff81116100d9576109a76105779136906004016108f6565b6109af6116df565b5073ffffffffffffffffffffffffffffffffffffffff6000541690610a2960408201356109db8161170a565b73ffffffffffffffffffffffffffffffffffffffff6020840135610a058535956060810190611732565b92909360405197610a1589610372565b885216602087015260408601523691611783565b6060830152608082015260405191829182610904565b9181601f840112156100d95782359167ffffffffffffffff83116100d9576020808501948460051b0101116100d957565b929190610a87602091604086526040860190610495565b930152565b346100d95760c06003193601126100d95760243560043560643560443560843567ffffffffffffffff81116100d957610ac9903690600401610a3f565b92909160a4359567ffffffffffffffff87116100d957610af0610af69736906004016108f6565b9561190d565b9061057760405192839283610a70565b346100d95760006003193601126100d9576020610b21611b97565b6040519015158152f35b60095460009291610b3b826100e9565b80825291600181169081156101c15750600114610b56575050565b600960009081529293509091907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b838310610b96575060209250010190565b600181602092949394548385870101520191019190610b85565b6040519061041f8261041881600c610280565b67ffffffffffffffff811161036d5760051b60200190565b600b5490610be882610bc3565b91610bf660405193846103e2565b808352600b60009081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602085015b838310610c335750505050565b600160208192604051610c4a816104f08189610280565b815201920192019190610c26565b9080602083519182815201916020808360051b8301019401926000915b838310610c8457505050505090565b9091929394602080610ca283601f1986600196030187528951610495565b97019301930191939290610c75565b610d026060610d979493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c0830190610495565b90602081830391015267ffffffffffffffff825116815260c0610d86610d4c610d3a602086015160e0602087015260e0860190610c58565b60408601518582036040870152610495565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a0860152610495565b9201519060c0818403910152610495565b90565b346100d95760006003193601126100d957604051610db78161038e565b6006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152604051610df2816104f081610b2b565b606082015260405190610e04826103aa565b67ffffffffffffffff600a54168252610e1b610bdb565b6020830152610e28610bb0565b6040830152610e7c610e6b600d54610e5b610e4a8267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610e84610405565b60a0830152610e91610421565b60c083015261057760405192839283610cb1565b346100d95760006003193601126100d95760ff6011541615610878576040516000601254610ed2816100e9565b8084529060018116908115610f6d5750600114610f0e575b61057783610efa818503826103e2565b604051918291602083526020830190610495565b601260009081527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444939250905b808210610f5357509091508101602001610efa610eea565b919260018160209254838588010152019101909291610f3b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610efa9050610eea565b346100d95760006003193601126100d957610fc86116df565b506040517f5a509280000000000000000000000000000000000000000000000000000000008152602060048201526000818061100660248201611297565b0381305afa9081156107c857600091611028575b604051806105778482610904565b3d8083833e61103781836103e2565b8101906020818303126110d65780519067ffffffffffffffff82116110da570160a0818303126110d6576040519161106e83610372565b81516110798161170a565b835260208201516110898161170a565b602084015260408201516040840152606082015167ffffffffffffffff81116110d257936110bf83926105779660809501611224565b606085015250015160808201529061101a565b8480fd5b8280fd5b8380fd5b346100d95760606003193601126100d95760043567ffffffffffffffff81116100d95760e060031982360301126100d9576024359067ffffffffffffffff82116100d957366023830112156100d95781600401359167ffffffffffffffff83116100d95736602484830101116100d9576044359067ffffffffffffffff82116100d95761057793611186936111796024943690600401610a3f565b9490930190600401611f57565b60405190151581529081906020820190565b604051906111a76020836103e2565b600080835282815b8281106111bb57505050565b8060606020809385010152016111af565b60405161014091906111de83826103e2565b6009815291601f19018260005b8281106111f757505050565b8060606020809385010152016111eb565b67ffffffffffffffff811161036d57601f01601f191660200190565b81601f820112156100d957805161123a81611208565b9261124860405194856103e2565b818452602082840101116100d957610d979160208085019101610472565b91906040838203126100d957825167ffffffffffffffff81116100d957602091611291918501611224565b92015190565b6080610d97916006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b929360809461130593610d979793865260208601526040850152606084015260c08484015260c0830190610c58565b9060a08183039101526006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b6040513d6000823e3d90fd5b601f821161136057505050565b6000526020600020906020601f840160051c8301931061139b575b601f0160051c01905b81811061138f575050565b60008155600101611384565b909150819061137b565b90815167ffffffffffffffff811161036d576113cd816113c66012546100e9565b6012611353565b602092601f821160011461142c5761141c92938291600092611421575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601255565b0151905038806113ea565b6012600052601f198216937fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449160005b8681106114b1575083600195961061147a575b505050811b01601255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061146f565b9192602060018192868501518155019401920161145c565b908160209103126100d9575180151581036100d95790565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061151357505050505090565b90919293946020600161153083601f198684960301875289610280565b97019301930191939290611504565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061157157505050505090565b90919293946020600282601f19856001950301865260408152611597604082018a610280565b9083858b015491015297019301930191939290611562565b6116cf610d9792606083526115e2606084016115d4600a5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e060808401526116c161168f6116326116016101408701600b6114e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600c610280565b600d5467ffffffffffffffff811660c088015261165d9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600e610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa085820301610120860152600f610280565b908382036020850152610495565b906040818303910152601061153f565b604051906116ec82610372565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100d957565b35610d978161170a565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d9576020019181360383136100d957565b92919261178f82611208565b9161179d60405193846103e2565b8294818452818301116100d9578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117f65760200190565b6117ba565b8051600110156117f65760400190565b8051600210156117f65760600190565b8051600310156117f65760800190565b8051600410156117f65760a00190565b8051600510156117f65760c00190565b8051600610156117f65760e00190565b8051600710156117f6576101000190565b8051600810156117f6576101200190565b80518210156117f65760209160051b010190565b92919261189d82610bc3565b936118ab60405195866103e2565b602085848152019260051b8201918183116100d95780935b8385106118d1575050505050565b843567ffffffffffffffff81116100d957820183601f820112156100d9576020916119028583858095359101611783565b8152019401936118c3565b9592909194939461191c6111cc565b9661192a6020860135612066565b611933896117e9565b5261193d886117e9565b50611947906125f9565b611950906120b8565b611959886117fb565b52611963876117fb565b5061196d906125f9565b611976906120b8565b61197f8761180b565b526119898661180b565b50611993906125f9565b61199c906120b8565b6119a58661181b565b526119af8561181b565b506119b9906125f9565b6119c2906120b8565b6119cb8561182b565b526119d58461182b565b506119e260408201611728565b6119eb90612077565b6119f48561183b565b526119fe8461183b565b50611a098135612066565b611a128561184b565b52611a1c8461184b565b5060608101611a2a91611732565b3690611a3592611783565b611a3e906120b8565b611a478461185b565b52611a518361185b565b503690611a5d92611891565b611a669061224c565b611a6f8261186c565b52611a798161186c565b50611a839061224c565b611a8b612520565b611a94906120b8565b90611a9e91612367565b908151602083012090565b67ffffffffffffffff8116036100d957565b8091039060c082126100d95760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611afa8661038e565b8351611b0581611aa9565b86526020840151611b1581611aa9565b60208701526040840151611b2881611aa9565b60408701520112611b6d5760a09060405192611b43846103c6565b6060820151611b5181611aa9565b8452608082015160208501525001516040820152606082015290565b5080fd5b610d979060408152611b87604082016004610280565b9060208183039101526005610280565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611bcd60048201611b71565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156107c857600091611c87575b5060035460ff16611c2781610463565b60018103611c4057506060015160400151600254111590565b611c4981610463565b611c5d576060015160400151600254101590565b7f951a55bf0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ca9915060c03d60c011611caf575b611ca181836103e2565b810190611abb565b38611c17565b503d611c97565b35610d9781611aa9565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d957602001918160051b360383136100d957565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100d957016020813591019167ffffffffffffffff82116100d95781360383136100d957565b90602083828152019160208260051b8501019381936000915b848310611dae5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100d957602080918760019401908280611e13611e058580611d35565b604086526040860191611d14565b9301359101529801930193019194939290611d9e565b90600282101561046d5752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff611e6695941681528160208201520191611d14565b938d6040818703910152808552602085019460208260051b82010195836000925b848410611f1f5750505050505094611ee98c9d60a0611ed861041f9e9f986101209e9c98611eca611f169f9d99611efa99611f079e8e6060818503910152611d14565b918b830360808d0152611d85565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152611d14565b91878303610100890152611d14565b93016001611e29565b909192939497602080611f4783601f198660019603018852611f418d88611d35565b90611d14565b9a01940194019294939190611e87565b9092939193611f6582611cb6565b92611f736020840184611cc0565b939092611f836040830183611732565b91909360608401611f9390611cb6565b91611fa060808601611cb6565b93611fae60a0870187611732565b97909660c08101611fbe91611732565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e611ff89f611e36565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107c85760009161204d575090565b610d97915060203d60201161081f5761081181836103e2565b612072610d97916125f9565b6120b8565b610d97906040519074140000000000000000000000000000000000000000186014820152603481016040526120b8565b9081518110156117f6570160200190565b60008151600181149081612234575b50156120d1575090565b815190603882101561212c5790610d9792917fff000000000000000000000000000000000000000000000000000000000000006121176080612111612408565b946126e4565b60f81b16901a612126826117e9565b53612367565b6001939092835b61213d8685612678565b1561215a5761214e612154916124f3565b956126b1565b94612133565b9092945092909261217261216d826126c8565b612446565b917fff000000000000000000000000000000000000000000000000000000000000006121a76121a26080856126e4565b6126d6565b60f81b16811a6121b6846117e9565b5360015b828111156121d057505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861222f96896124e6565b6126f1565b8b612678565b60ff1690565b60f81b16831a61222982876120a7565b536124f3565b6121ba565b9050156117f6576080602083015160f81c10386120c7565b6122559061278b565b8051600060388210156122965790610d9792917fff0000000000000000000000000000000000000000000000000000000000000061211760c0612111612408565b6001939092835b6122a78685612678565b156122be5761214e6122b8916124f3565b9461229d565b909294509290926122d161216d826126c8565b917fff000000000000000000000000000000000000000000000000000000000000006123016121a260c0856126e4565b60f81b16811a612310846117e9565b5360015b8281111561232a57505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861236296896124e6565b612314565b90604051918051908184526020840191840192602084019260208301905b8481106123d35750508051809386518201875294019360208086019201905b8281106123c35750509051603f92011590920101601f19166040525090565b81518152602091820191016123a4565b8151815260209182019101612385565b604080519091906123f483826103e2565b60208152918290601f190190369060200137565b6040805190919061241983826103e2565b6001815291601f1901366020840137565b604051906124396020836103e2565b6000808352366020840137565b9061245082611208565b61245d60405191826103e2565b828152601f1961246d8294611208565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60200390602082116124b457565b612477565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116124b457565b919082039182116124b457565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124b45760010190565b6125286123e3565b90600260208301526000915b602083106125b0575b61254961216d846124a6565b9060005b82518110156125a95760019061259561256f612568886124f3565b97856120a7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a6125a282866120a7565b530161254d565b5090925050565b916125e66125c161256f83866120a7565b7fff000000000000000000000000000000000000000000000000000000000000001690565b6125f35760010191612534565b9161253d565b906126026123e3565b9160208301526000915b60208310612654575b61262161216d846124a6565b9060005b82518110156125a95760019061264061256f612568886124f3565b60001a61264d82866120a7565b5301612625565b916126656125c161256f83866120a7565b612672576001019161260c565b91612615565b8115612682570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b908160081b9180830461010014901517156124b457565b90600182018092116124b457565b90603782018092116124b457565b919082018092116124b457565b601f81116124b4576101000a90565b1561270757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b9081511561282f57600091825b81518410156127d7576127cf6001916127bd6127b4878661187d565b51511515612700565b6127c7868561187d565b5151906126e4565b930192612798565b6127e391929350612446565b9060208201926000935b825185101561282857612820600191612816612809888761187d565b5160208151910183612839565b6127c7878661187d565b9401936127ed565b5092505090565b9050610d9761242a565b915b602081101561286e57602003602081116124b45761285b612860916126f1565b6124b9565b905182518216911916179052565b909182518152602081018091116124b45791602081018091116124b45790601f1981019081111561283b5761247756fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0x5ca5b1", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000004ee060a034607357601f614ec038819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b038116908190036073576001600055608052604051614e31908161008f823960805181818160b001526103720152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780633dc48a341461004d57637fddd6021461004857600080fd5b610217565b610159565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357606060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff821161008357610213926101d26101ec9336906004016100e4565b906101db610115565b9260843594600401906004016102a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761028960209161027361028160243560405192839187830195869091604092825260208201520190565b03601f1981018352826105db565b519020610aeb565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9293949190916002600054146105825760026000556040516102dd81610273602082019432869091604092825260208201520190565b519020946102ff6102f8876000526001602052604060002090565b5460ff1690565b610558576102736103b4936103a46103c0966102736103ba96328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36140859661034f60208901610603565b97808952610da060208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109ac565b6040519485936020850190610ab4565b90610ab4565b83610c81565b916103ca81610aeb565b73ffffffffffffffffffffffffffffffffffffffff84168015918215610537575b505061050a57813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af1908115610505576104999261046e926104ea575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907f51cd0090f3c14be5310fb02efc5d7f8aa69cff235becdf1d944ee6c420b2deb690602090a2906104e86001600055565b565b806104f960006104ff936105db565b806100d9565b3861045d565b610adf565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff161415905038806103eb565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176105fe57604052565b6105ac565b906104e860405192836105db565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107765750505050505090565b90919293949560208061079e83601f1986600196030188526107988b88610643565b90610693565b9801940194019294939190610766565b6108809167ffffffffffffffff6107c4836106e6565b16815261087261086761080c6107f16107e060208701876106fb565b60e0602088015260e087019161074e565b6107fe6040870187610643565b908683036040880152610693565b61082c61081b606087016106e6565b67ffffffffffffffff166060860152565b61084c61083b608087016106e6565b67ffffffffffffffff166080860152565b61085960a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b90565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761092361091861090784610880960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff6108f760408301610138565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106b4565b9060208184039101526107ae565b90602083828152019260208260051b82010193836000925b8484106109595750505050505090565b90919293949560208082601f1985600195030187526109788a87610611565b9082806109966109888580610643565b604086526040860191610693565b9301359101529801940194019294939190610949565b9190969593949660a08352803560a08401526020810135936004851015610083576104e896610a6b610a9894610a5d6109f4610a799660809a60c08b01526040810190610611565b606060e08a0152610a2c610a218a6101006040610a118680610643565b92909301526101408d0191610693565b916020810190610643565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008b8403016101208c0152610693565b908782036020890152610883565b918583036040870152610931565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610acc575050016000815290565b8060208092840101518185015201610abb565b6040513d6000823e3d90fd5b610c2873ffffffffffffffffffffffffffffffffffffffff806108809360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b766075826105db565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c0c816017840103601f1981018352826105db565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c7c573d9067ffffffffffffffff82116105fe5760405191610c70601f8201601f1916602001846105db565b82523d6000602084013e565b606090565b919060405192610c926040856105db565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610cc581610aeb565b93843b610d75576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d4b5781600092918360208194519301915af1610d09610c41565b50158015610d42575b610d1857565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d12565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe60e080604052346113dd57614085803803809161001c828561147b565b8339810160a0828203126113dd5781516001600160401b0381116113dd578201916060838303126113dd57604051926100548461140f565b80518452602081015160048110156113dd5760208501526040810151906001600160401b0382116113dd5701906040828403126113dd57604051916100988361142a565b80516001600160401b0381116113dd57846100b49183016114c1565b83526020810151906001600160401b0382116113dd576100d6918591016114c1565b602083810191909152604085019283528101516001600160401b0381116113dd578101906040828503126113dd57604051916101118361142a565b80516001600160401b0381116113dd5781016080818703126113dd576040519061013a82611445565b805182526020810151602083015261015460408201611516565b60408301526060810151906001600160401b0382116113dd57610179918891016114c1565b606082015283526020810151906001600160401b0382116113dd570160e0818603126113dd57604051906101ac82611460565b6101b58161152a565b825260208101516001600160401b0381116113dd57810186601f820112156113dd5780516101e28161153e565b916101f0604051938461147b565b81835260208084019260051b820101918983116113dd5760208201905b8382106113e25750505050602083015260408101516001600160401b0381116113dd578661023c9183016114c1565b604083015261024d6060820161152a565b606083015261025e6080820161152a565b608083015260a08101516001600160401b0381116113dd57866102829183016114c1565b60a083015260c0810151906001600160401b0382116113dd576102a7918791016114c1565b60c08201526020830190815260408201516001600160401b0381116113dd57820185601f820112156113dd578051906102df8261153e565b966102ed604051988961147b565b82885260208089019360051b830101918183116113dd5760208101935b83851061137557505050505061032e608061032760608501611516565b9301611516565b815184519094916001600160a01b03851615611364576001600160a01b03169081156113535760a086015151156113425760c0860151511561133157604001516001600160a01b03161561132057610900608052604094855190610392878361147b565b600182526020820191601f19880136843760016103ae8261157a565b526080519151885163338c1f5160e01b81526001600160401b0390911660048201526024810189905290516044820181905290926001600160a01b0390921691839160648301919060005b8181106113045750505091818060009403915afa9081156110ec57600091611119575b5061042d602061043792015161157a565b5151805190611614565b901561110857600080546001600160a01b0319166001600160a01b0392909216919091179055600180558751156110f75761090260a052855160c06104a160208351930151926104b389519485938493631e879a6d60e11b85528c60048601526044850190611555565b83810360031901602485015290611555565b03816109025afa9081156110ec57600091611046575b505060c05260005b865181101561066c5760008751821015610658575060208160051b880101516010546801000000000000000081101561062c5760018101806010558110156106425760106000528151805160019290921b7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019291906001600160401b03821161062c57610569826105638654611587565b866115d8565b602090601f83116001146105bd57926105a48360019796959460209489966000926105b2575b50508160011b916000199060031b1c19161790565b84555b0151910155016104d1565b01519050388061058f565b90601f1983169185600052816000209260005b818110610614575093602093600198979693899693838895106105fb575b505050811b0184556105a7565b015160001960f88460031b161c191690553880806105ee565b929360206001819287860151815501950193016105d0565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b50602087805160025501519460048610156110305760009560ff80196003541691161760035551805180519060018060401b03821161101c576106b0600454611587565b601f8111610fce575b50602090601f8311600114610f665791806106ed92602095948b92610f5b5750508160011b916000199060031b1c19161790565b6004555b01518051906001600160401b038211610f475761070f600554611587565b601f8111610f16575b50602090601f8311600114610eae57918061074c92606095948a92610ea35750508160011b916000199060031b1c19161790565b6005555b518051600655602081015160075584810151600880546001600160a01b0319166001600160a01b039290921691909117905501518051906001600160401b038211610b99576107a0600954611587565b601f8111610e55575b50602090601f8311600114610df0576107d99291879183610bad5750508160011b916000199060031b1c19161790565b6009555b518051600a80546001600160401b0319166001600160401b03929092169190911790556020810151805190680100000000000000008211610b9957600b5482600b55808310610d5c575b50600b865285907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020015b838310610c6b5750505050808301518051906001600160401b038211610b995761087f600c54611587565b601f8111610c1d575b50602090601f8311600114610bb8576108b89291879183610bad5750508160011b916000199060031b1c19161790565b600c555b6060810151600d805460808401516001600160801b03199091166001600160401b039384161790861b6fffffffffffffffff00000000000000001617905560a08201518051918211610b9957610913600e54611587565b601f8111610b4b575b50602090601f8311600114610ae35791806109509260c095948992610ad85750508160011b916000199060031b1c19161790565b600e555b0151805190936001600160401b038211610ac457610973600f54611587565b601f8111610a6b575b50602090601f8311600114610a0857906109ac939495836109fd5750508160011b916000199060031b1c19161790565b600f555b60118054610100600160a81b03191660089290921b610100600160a81b0316919091179055516128ab90816117da823960805181611ffc015260a05181611be6015260c051816107160152f35b01519050858061058f565b90601f198316600f8352818320925b818110610a5357509583600195969710610a3a575b505050811b01600f556109b0565b015160001960f88460031b161c19169055848080610a2c565b9192602060018192868b015181550194019201610a17565b600f8252610ab4907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f850160051c81019160208610610aba575b601f0160051c01906115c1565b8561097c565b9091508190610aa7565b634e487b7160e01b81526041600452602490fd5b01519050888061058f565b600e87528187209190601f198416885b818110610b33575091600193918560c097969410610b1a575b505050811b01600e55610954565b015160001960f88460031b161c19169055878080610b0c565b92936020600181928786015181550195019301610af3565b600e8752610b93907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd601f850160051c81019160208610610aba57601f0160051c01906115c1565b8661091c565b634e487b7160e01b86526041600452602486fd5b01519050878061058f565b600c87528187209190601f198416885b818110610c055750908460019594939210610bec575b505050811b01600c556108bc565b015160001960f88460031b161c19169055868080610bde565b92936020600181928786015181550195019301610bc8565b600c8752610c65907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f850160051c81019160208610610aba57601f0160051c01906115c1565b86610888565b80518051906001600160401b038211610d4857610c8c826105638654611587565b6020908a601f8411600114610cde578360019592946020948796610cc49492610cd35750508160011b916000199060031b1c19161790565b85555b01920192019190610854565b015190508e8061058f565b50848b52818b209190601f1984168c5b818110610d305750936020936001969387969383889510610d17575b505050811b018555610cc7565b015160001960f88460031b161c191690558d8080610d0a565b92936020600181928786015181550195019301610cee565b634e487b7160e01b8a52604160045260248afd5b600b87527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99081019083015b818110610d955750610827565b80610da260019254611587565b80610daf575b5001610d88565b601f81118314610dc457508881555b89610da8565b818a5260208a20610ddf91601f0160051c81019084016115c1565b808952886020812081835555610dbe565b600987528187209190601f198416885b818110610e3d5750908460019594939210610e24575b505050811b016009556107dd565b015160001960f88460031b161c19169055868080610e16565b92936020600181928786015181550195019301610e00565b60098752610e9d907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af601f850160051c81019160208610610aba57601f0160051c01906115c1565b866107a9565b01519050898061058f565b600588528188209190601f198416895b818110610efe5750916001939185606097969410610ee5575b505050811b01600555610750565b015160001960f88460031b161c19169055888080610ed7565b92936020600181928786015181550195019301610ebe565b610f41906005895260208920601f850160051c81019160208610610aba57601f0160051c01906115c1565b87610718565b634e487b7160e01b87526041600452602487fd5b015190508a8061058f565b600489528189209190601f1984168a5b818110610fb65750916001939185602097969410610f9d575b505050811b016004556106f1565b015160001960f88460031b161c19169055898080610f8f565b92936020600181928786015181550195019301610f76565b60048952611016907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610aba57601f0160051c01906115c1565b886106b9565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b600052602160045260246000fd5b8060c03d60c0116110e5575b61105c818361147b565b8101039160c083126110e257606088519361107685611445565b61107f8461152a565b855261108d6020850161152a565b602086015261109d8a850161152a565b858b0152605f1901126110e2575060a08751916110b98361140f565b6110c56060820161152a565b8352608081015160208401520151878201526060820152386104c9565b80fd5b503d611052565b86513d6000823e3d90fd5b63107d9ce760e31b60005260046000fd5b6307456b9160e21b60005260046000fd5b903d8082843e611129818461147b565b8201916020818403126112fc578051906001600160401b03821161130057019187838203126112fc5787519261115e8461142a565b80516001600160401b0381116112f857810160e0818403126112f85789519061118682611460565b61118f8161152a565b825261119d6020820161152a565b60208301526111ad8b820161152a565b8b830152606081015160038110156112f457606083015260808101516001600160401b0381116112f457816111e98660c09361120595016114c1565b60808501526111fa60a0820161152a565b60a08501520161152a565b60c082015284526020810151906001600160401b0382116112f8570181601f820112156113005780516112378161153e565b936112448b51958661147b565b81855260208086019260051b840101928484116112fc5760208101925b84841061127e57505050505060208301919091525061042d61041c565b83516001600160401b0381116112f85782018d601f1982890301126112f8578d51906112a98261142a565b60208101516001600160401b0381116112f457908f918960206112ce928401016114c1565b8352015160038110156112f05791816020938480940152815201930192611261565b8480fd5b8580fd5b8380fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103f9565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116113dd5782016040818503601f1901126113dd57604051916113a28361142a565b6020820151926001600160401b0384116113dd576040836113ca8860208098819801016114c1565b835201518382015281520194019361030a565b600080fd5b81516001600160401b0381116113dd576020916114048d8480948801016114c1565b81520191019061020d565b606081019081106001600160401b0382111761062c57604052565b604081019081106001600160401b0382111761062c57604052565b608081019081106001600160401b0382111761062c57604052565b60e081019081106001600160401b0382111761062c57604052565b601f909101601f19168101906001600160401b0382119082101761062c57604052565b60005b8381106114b15750506000910152565b81810151838201526020016114a1565b81601f820112156113dd5780516020909101906001600160401b03811161062c57604051926114fa601f8301601f19166020018561147b565b818452818301116113dd5761151391602084019061149e565b90565b51906001600160a01b03821682036113dd57565b51906001600160401b03821682036113dd57565b6001600160401b03811161062c5760051b60200190565b9060209161156e8151809281855285808601910161149e565b601f01601f1916010190565b8051156106425760200190565b90600182811c921680156115b7575b60208310146115a157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611596565b8181106115cc575050565b600081556001016115c1565b9190601f81116115e757505050565b611612926000526020600020906020601f840160051c83019310610aba57601f0160051c01906115c1565b565b90600061060f60f31b61ffff60f01b602085015116148060011b90808204600214901517156116895760280190816028116116755750810361166b57600061165b9261169d565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611731576000948101809111611753579192905b8183106116ed5750505060019190565b9092919360ff6117078160f81b6020888601015116611767565b16600f8111611747578160041b9180830460101490151715611731576001910194019192906116dd565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f8111806117cf575b1561178357602f190160ff1690565b60608111806117c5575b1561179c576056190160ff1690565b60408111806117bb575b156117b5576036190160ff1690565b5060ff90565b50604781106117a6565b506067811061178d565b50603a811061177456fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100b7578063229e81fb146100b257806342859ab3146100ad5780635a509280146100a857806362b61c8b146100a357806378b903371461009e578063819ef8ba1461009957806388328a6914610094578063b3d7ad481461008f5763cad31c741461008a57600080fd5b6110de565b610faf565b610ea5565b610d9a565b610b06565b610a8c565b610973565b61057b565b6104ba565b346100d95760006003193601126100d95760ff60115416151560805260206080f35b600080fd5b60009103126100d957565b90600182811c92168015610132575b602083101461010357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916100f8565b6004546000929161014c826100e9565b80825291600181169081156101c15750600114610167575050565b600460009081529293509091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8383106101a7575060209250010190565b600181602092949394548385870101520191019190610196565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6005546000929161020b826100e9565b80825291600181169081156101c15750600114610226575050565b600560009081529293509091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b838310610266575060209250010190565b600181602092949394548385870101520191019190610255565b60009291815491610290836100e9565b80835292600181169081156102e657506001146102ac57505050565b60009081526020812093945091925b8383106102cc575060209250010190565b6001816020929493945483858701015201910191906102bb565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761036d57604052565b610322565b60a0810190811067ffffffffffffffff82111761036d57604052565b6080810190811067ffffffffffffffff82111761036d57604052565b60e0810190811067ffffffffffffffff82111761036d57604052565b6060810190811067ffffffffffffffff82111761036d57604052565b90601f601f19910116810190811067ffffffffffffffff82111761036d57604052565b6040519061041f8261041881600e610280565b03836103e2565b565b6040519061041f8261041881600f610280565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561046d57565b610434565b60005b8381106104855750506000910152565b8181015183820152602001610475565b90601f19601f6020936104b381518092818752878088019101610472565b0116010190565b346100d95760006003193601126100d95760025460ff600354166040516104e081610351565b6040516104f7816104f08161013c565b03826103e2565b8152604051610509816104f0816101fb565b60208201908152604051938452600483101561046d57610546610577928594602086015260606040860152516040606086015260a0850190610495565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0848303016080850152610495565b0390f35b346100d95760a06003193601126100d9576004356024359060643591608435916002600154146108cc57600260015560115473ffffffffffffffffffffffffffffffffffffffff600882901c1633036108a25760ff16610878576105e46105e0611b97565b1590565b61084e5761062b6000936105f6611198565b9060405196879586957f62b61c8b000000000000000000000000000000000000000000000000000000008752600487016112d6565b0381305afa9081156107c857600090600092610826575b5061064c906113a5565b6106a96020604051610676816106688685830160209181520190565b03601f1981018352826103e2565b604051809381927fcad31c74000000000000000000000000000000000000000000000000000000008352600483016115af565b03816000305af180156107c8576106f4916000916107f7575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601154169115151617601155565b60115460ff166107cd575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100d9576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107c8576107ad575b5060115460ff1661079a60018055565b6040805191151582526020820192909252f35b806107bc60006107c2936103e2565b806100de565b3861078a565b611347565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a16106ff565b610819915060203d60201161081f575b61081181836103e2565b8101906114c9565b386106c2565b503d610807565b61064c925061084891503d806000833e61084081836103e2565b810190611266565b91610642565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100d95790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a0608061096a6060850151838386015260c0850190610495565b93015191015290565b346100d95760206003193601126100d95760043567ffffffffffffffff81116100d9576109a76105779136906004016108f6565b6109af6116df565b5073ffffffffffffffffffffffffffffffffffffffff6000541690610a2960408201356109db8161170a565b73ffffffffffffffffffffffffffffffffffffffff6020840135610a058535956060810190611732565b92909360405197610a1589610372565b885216602087015260408601523691611783565b6060830152608082015260405191829182610904565b9181601f840112156100d95782359167ffffffffffffffff83116100d9576020808501948460051b0101116100d957565b929190610a87602091604086526040860190610495565b930152565b346100d95760c06003193601126100d95760243560043560643560443560843567ffffffffffffffff81116100d957610ac9903690600401610a3f565b92909160a4359567ffffffffffffffff87116100d957610af0610af69736906004016108f6565b9561190d565b9061057760405192839283610a70565b346100d95760006003193601126100d9576020610b21611b97565b6040519015158152f35b60095460009291610b3b826100e9565b80825291600181169081156101c15750600114610b56575050565b600960009081529293509091907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b838310610b96575060209250010190565b600181602092949394548385870101520191019190610b85565b6040519061041f8261041881600c610280565b67ffffffffffffffff811161036d5760051b60200190565b600b5490610be882610bc3565b91610bf660405193846103e2565b808352600b60009081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602085015b838310610c335750505050565b600160208192604051610c4a816104f08189610280565b815201920192019190610c26565b9080602083519182815201916020808360051b8301019401926000915b838310610c8457505050505090565b9091929394602080610ca283601f1986600196030187528951610495565b97019301930191939290610c75565b610d026060610d979493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c0830190610495565b90602081830391015267ffffffffffffffff825116815260c0610d86610d4c610d3a602086015160e0602087015260e0860190610c58565b60408601518582036040870152610495565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a0860152610495565b9201519060c0818403910152610495565b90565b346100d95760006003193601126100d957604051610db78161038e565b6006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152604051610df2816104f081610b2b565b606082015260405190610e04826103aa565b67ffffffffffffffff600a54168252610e1b610bdb565b6020830152610e28610bb0565b6040830152610e7c610e6b600d54610e5b610e4a8267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610e84610405565b60a0830152610e91610421565b60c083015261057760405192839283610cb1565b346100d95760006003193601126100d95760ff6011541615610878576040516000601254610ed2816100e9565b8084529060018116908115610f6d5750600114610f0e575b61057783610efa818503826103e2565b604051918291602083526020830190610495565b601260009081527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444939250905b808210610f5357509091508101602001610efa610eea565b919260018160209254838588010152019101909291610f3b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610efa9050610eea565b346100d95760006003193601126100d957610fc86116df565b506040517f5a509280000000000000000000000000000000000000000000000000000000008152602060048201526000818061100660248201611297565b0381305afa9081156107c857600091611028575b604051806105778482610904565b3d8083833e61103781836103e2565b8101906020818303126110d65780519067ffffffffffffffff82116110da570160a0818303126110d6576040519161106e83610372565b81516110798161170a565b835260208201516110898161170a565b602084015260408201516040840152606082015167ffffffffffffffff81116110d257936110bf83926105779660809501611224565b606085015250015160808201529061101a565b8480fd5b8280fd5b8380fd5b346100d95760606003193601126100d95760043567ffffffffffffffff81116100d95760e060031982360301126100d9576024359067ffffffffffffffff82116100d957366023830112156100d95781600401359167ffffffffffffffff83116100d95736602484830101116100d9576044359067ffffffffffffffff82116100d95761057793611186936111796024943690600401610a3f565b9490930190600401611f57565b60405190151581529081906020820190565b604051906111a76020836103e2565b600080835282815b8281106111bb57505050565b8060606020809385010152016111af565b60405161014091906111de83826103e2565b6009815291601f19018260005b8281106111f757505050565b8060606020809385010152016111eb565b67ffffffffffffffff811161036d57601f01601f191660200190565b81601f820112156100d957805161123a81611208565b9261124860405194856103e2565b818452602082840101116100d957610d979160208085019101610472565b91906040838203126100d957825167ffffffffffffffff81116100d957602091611291918501611224565b92015190565b6080610d97916006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b929360809461130593610d979793865260208601526040850152606084015260c08484015260c0830190610c58565b9060a08183039101526006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b6040513d6000823e3d90fd5b601f821161136057505050565b6000526020600020906020601f840160051c8301931061139b575b601f0160051c01905b81811061138f575050565b60008155600101611384565b909150819061137b565b90815167ffffffffffffffff811161036d576113cd816113c66012546100e9565b6012611353565b602092601f821160011461142c5761141c92938291600092611421575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601255565b0151905038806113ea565b6012600052601f198216937fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449160005b8681106114b1575083600195961061147a575b505050811b01601255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061146f565b9192602060018192868501518155019401920161145c565b908160209103126100d9575180151581036100d95790565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061151357505050505090565b90919293946020600161153083601f198684960301875289610280565b97019301930191939290611504565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061157157505050505090565b90919293946020600282601f19856001950301865260408152611597604082018a610280565b9083858b015491015297019301930191939290611562565b6116cf610d9792606083526115e2606084016115d4600a5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e060808401526116c161168f6116326116016101408701600b6114e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600c610280565b600d5467ffffffffffffffff811660c088015261165d9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600e610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa085820301610120860152600f610280565b908382036020850152610495565b906040818303910152601061153f565b604051906116ec82610372565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100d957565b35610d978161170a565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d9576020019181360383136100d957565b92919261178f82611208565b9161179d60405193846103e2565b8294818452818301116100d9578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117f65760200190565b6117ba565b8051600110156117f65760400190565b8051600210156117f65760600190565b8051600310156117f65760800190565b8051600410156117f65760a00190565b8051600510156117f65760c00190565b8051600610156117f65760e00190565b8051600710156117f6576101000190565b8051600810156117f6576101200190565b80518210156117f65760209160051b010190565b92919261189d82610bc3565b936118ab60405195866103e2565b602085848152019260051b8201918183116100d95780935b8385106118d1575050505050565b843567ffffffffffffffff81116100d957820183601f820112156100d9576020916119028583858095359101611783565b8152019401936118c3565b9592909194939461191c6111cc565b9661192a6020860135612066565b611933896117e9565b5261193d886117e9565b50611947906125f9565b611950906120b8565b611959886117fb565b52611963876117fb565b5061196d906125f9565b611976906120b8565b61197f8761180b565b526119898661180b565b50611993906125f9565b61199c906120b8565b6119a58661181b565b526119af8561181b565b506119b9906125f9565b6119c2906120b8565b6119cb8561182b565b526119d58461182b565b506119e260408201611728565b6119eb90612077565b6119f48561183b565b526119fe8461183b565b50611a098135612066565b611a128561184b565b52611a1c8461184b565b5060608101611a2a91611732565b3690611a3592611783565b611a3e906120b8565b611a478461185b565b52611a518361185b565b503690611a5d92611891565b611a669061224c565b611a6f8261186c565b52611a798161186c565b50611a839061224c565b611a8b612520565b611a94906120b8565b90611a9e91612367565b908151602083012090565b67ffffffffffffffff8116036100d957565b8091039060c082126100d95760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611afa8661038e565b8351611b0581611aa9565b86526020840151611b1581611aa9565b60208701526040840151611b2881611aa9565b60408701520112611b6d5760a09060405192611b43846103c6565b6060820151611b5181611aa9565b8452608082015160208501525001516040820152606082015290565b5080fd5b610d979060408152611b87604082016004610280565b9060208183039101526005610280565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611bcd60048201611b71565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156107c857600091611c87575b5060035460ff16611c2781610463565b60018103611c4057506060015160400151600254111590565b611c4981610463565b611c5d576060015160400151600254101590565b7f951a55bf0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ca9915060c03d60c011611caf575b611ca181836103e2565b810190611abb565b38611c17565b503d611c97565b35610d9781611aa9565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d957602001918160051b360383136100d957565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100d957016020813591019167ffffffffffffffff82116100d95781360383136100d957565b90602083828152019160208260051b8501019381936000915b848310611dae5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100d957602080918760019401908280611e13611e058580611d35565b604086526040860191611d14565b9301359101529801930193019194939290611d9e565b90600282101561046d5752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff611e6695941681528160208201520191611d14565b938d6040818703910152808552602085019460208260051b82010195836000925b848410611f1f5750505050505094611ee98c9d60a0611ed861041f9e9f986101209e9c98611eca611f169f9d99611efa99611f079e8e6060818503910152611d14565b918b830360808d0152611d85565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152611d14565b91878303610100890152611d14565b93016001611e29565b909192939497602080611f4783601f198660019603018852611f418d88611d35565b90611d14565b9a01940194019294939190611e87565b9092939193611f6582611cb6565b92611f736020840184611cc0565b939092611f836040830183611732565b91909360608401611f9390611cb6565b91611fa060808601611cb6565b93611fae60a0870187611732565b97909660c08101611fbe91611732565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e611ff89f611e36565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107c85760009161204d575090565b610d97915060203d60201161081f5761081181836103e2565b612072610d97916125f9565b6120b8565b610d97906040519074140000000000000000000000000000000000000000186014820152603481016040526120b8565b9081518110156117f6570160200190565b60008151600181149081612234575b50156120d1575090565b815190603882101561212c5790610d9792917fff000000000000000000000000000000000000000000000000000000000000006121176080612111612408565b946126e4565b60f81b16901a612126826117e9565b53612367565b6001939092835b61213d8685612678565b1561215a5761214e612154916124f3565b956126b1565b94612133565b9092945092909261217261216d826126c8565b612446565b917fff000000000000000000000000000000000000000000000000000000000000006121a76121a26080856126e4565b6126d6565b60f81b16811a6121b6846117e9565b5360015b828111156121d057505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861222f96896124e6565b6126f1565b8b612678565b60ff1690565b60f81b16831a61222982876120a7565b536124f3565b6121ba565b9050156117f6576080602083015160f81c10386120c7565b6122559061278b565b8051600060388210156122965790610d9792917fff0000000000000000000000000000000000000000000000000000000000000061211760c0612111612408565b6001939092835b6122a78685612678565b156122be5761214e6122b8916124f3565b9461229d565b909294509290926122d161216d826126c8565b917fff000000000000000000000000000000000000000000000000000000000000006123016121a260c0856126e4565b60f81b16811a612310846117e9565b5360015b8281111561232a57505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861236296896124e6565b612314565b90604051918051908184526020840191840192602084019260208301905b8481106123d35750508051809386518201875294019360208086019201905b8281106123c35750509051603f92011590920101601f19166040525090565b81518152602091820191016123a4565b8151815260209182019101612385565b604080519091906123f483826103e2565b60208152918290601f190190369060200137565b6040805190919061241983826103e2565b6001815291601f1901366020840137565b604051906124396020836103e2565b6000808352366020840137565b9061245082611208565b61245d60405191826103e2565b828152601f1961246d8294611208565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60200390602082116124b457565b612477565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116124b457565b919082039182116124b457565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124b45760010190565b6125286123e3565b90600260208301526000915b602083106125b0575b61254961216d846124a6565b9060005b82518110156125a95760019061259561256f612568886124f3565b97856120a7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a6125a282866120a7565b530161254d565b5090925050565b916125e66125c161256f83866120a7565b7fff000000000000000000000000000000000000000000000000000000000000001690565b6125f35760010191612534565b9161253d565b906126026123e3565b9160208301526000915b60208310612654575b61262161216d846124a6565b9060005b82518110156125a95760019061264061256f612568886124f3565b60001a61264d82866120a7565b5301612625565b916126656125c161256f83866120a7565b612672576001019161260c565b91612615565b8115612682570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b908160081b9180830461010014901517156124b457565b90600182018092116124b457565b90603782018092116124b457565b919082018092116124b457565b601f81116124b4576101000a90565b1561270757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b9081511561282f57600091825b81518410156127d7576127cf6001916127bd6127b4878661187d565b51511515612700565b6127c7868561187d565b5151906126e4565b930192612798565b6127e391929350612446565b9060208201926000935b825185101561282857612820600191612816612809888761187d565b5160208151910183612839565b6127c7878661187d565b9401936127ed565b5092505090565b9050610d9761242a565b915b602081101561286e57602003602081116124b45761285b612860916126f1565b6124b9565b905182518216911916179052565b909182518152602081018091116124b45791602081018091116124b45790601f1981019081111561283b5761247756fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987", + "nonce": "0x2", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x8f3415f4fed95503e1893ba98714129cc106b172", + "initCode": "0x60a034607357601f614ec038819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b038116908190036073576001600055608052604051614e31908161008f823960805181818160b001526103720152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780633dc48a341461004d57637fddd6021461004857600080fd5b610217565b610159565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357606060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff821161008357610213926101d26101ec9336906004016100e4565b906101db610115565b9260843594600401906004016102a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761028960209161027361028160243560405192839187830195869091604092825260208201520190565b03601f1981018352826105db565b519020610aeb565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9293949190916002600054146105825760026000556040516102dd81610273602082019432869091604092825260208201520190565b519020946102ff6102f8876000526001602052604060002090565b5460ff1690565b610558576102736103b4936103a46103c0966102736103ba96328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36140859661034f60208901610603565b97808952610da060208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109ac565b6040519485936020850190610ab4565b90610ab4565b83610c81565b916103ca81610aeb565b73ffffffffffffffffffffffffffffffffffffffff84168015918215610537575b505061050a57813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af1908115610505576104999261046e926104ea575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907f51cd0090f3c14be5310fb02efc5d7f8aa69cff235becdf1d944ee6c420b2deb690602090a2906104e86001600055565b565b806104f960006104ff936105db565b806100d9565b3861045d565b610adf565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff161415905038806103eb565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176105fe57604052565b6105ac565b906104e860405192836105db565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107765750505050505090565b90919293949560208061079e83601f1986600196030188526107988b88610643565b90610693565b9801940194019294939190610766565b6108809167ffffffffffffffff6107c4836106e6565b16815261087261086761080c6107f16107e060208701876106fb565b60e0602088015260e087019161074e565b6107fe6040870187610643565b908683036040880152610693565b61082c61081b606087016106e6565b67ffffffffffffffff166060860152565b61084c61083b608087016106e6565b67ffffffffffffffff166080860152565b61085960a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b90565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761092361091861090784610880960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff6108f760408301610138565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106b4565b9060208184039101526107ae565b90602083828152019260208260051b82010193836000925b8484106109595750505050505090565b90919293949560208082601f1985600195030187526109788a87610611565b9082806109966109888580610643565b604086526040860191610693565b9301359101529801940194019294939190610949565b9190969593949660a08352803560a08401526020810135936004851015610083576104e896610a6b610a9894610a5d6109f4610a799660809a60c08b01526040810190610611565b606060e08a0152610a2c610a218a6101006040610a118680610643565b92909301526101408d0191610693565b916020810190610643565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008b8403016101208c0152610693565b908782036020890152610883565b918583036040870152610931565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610acc575050016000815290565b8060208092840101518185015201610abb565b6040513d6000823e3d90fd5b610c2873ffffffffffffffffffffffffffffffffffffffff806108809360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b766075826105db565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c0c816017840103601f1981018352826105db565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c7c573d9067ffffffffffffffff82116105fe5760405191610c70601f8201601f1916602001846105db565b82523d6000602084013e565b606090565b919060405192610c926040856105db565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610cc581610aeb565b93843b610d75576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d4b5781600092918360208194519301915af1610d09610c41565b50158015610d42575b610d1857565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d12565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe60e080604052346113dd57614085803803809161001c828561147b565b8339810160a0828203126113dd5781516001600160401b0381116113dd578201916060838303126113dd57604051926100548461140f565b80518452602081015160048110156113dd5760208501526040810151906001600160401b0382116113dd5701906040828403126113dd57604051916100988361142a565b80516001600160401b0381116113dd57846100b49183016114c1565b83526020810151906001600160401b0382116113dd576100d6918591016114c1565b602083810191909152604085019283528101516001600160401b0381116113dd578101906040828503126113dd57604051916101118361142a565b80516001600160401b0381116113dd5781016080818703126113dd576040519061013a82611445565b805182526020810151602083015261015460408201611516565b60408301526060810151906001600160401b0382116113dd57610179918891016114c1565b606082015283526020810151906001600160401b0382116113dd570160e0818603126113dd57604051906101ac82611460565b6101b58161152a565b825260208101516001600160401b0381116113dd57810186601f820112156113dd5780516101e28161153e565b916101f0604051938461147b565b81835260208084019260051b820101918983116113dd5760208201905b8382106113e25750505050602083015260408101516001600160401b0381116113dd578661023c9183016114c1565b604083015261024d6060820161152a565b606083015261025e6080820161152a565b608083015260a08101516001600160401b0381116113dd57866102829183016114c1565b60a083015260c0810151906001600160401b0382116113dd576102a7918791016114c1565b60c08201526020830190815260408201516001600160401b0381116113dd57820185601f820112156113dd578051906102df8261153e565b966102ed604051988961147b565b82885260208089019360051b830101918183116113dd5760208101935b83851061137557505050505061032e608061032760608501611516565b9301611516565b815184519094916001600160a01b03851615611364576001600160a01b03169081156113535760a086015151156113425760c0860151511561133157604001516001600160a01b03161561132057610900608052604094855190610392878361147b565b600182526020820191601f19880136843760016103ae8261157a565b526080519151885163338c1f5160e01b81526001600160401b0390911660048201526024810189905290516044820181905290926001600160a01b0390921691839160648301919060005b8181106113045750505091818060009403915afa9081156110ec57600091611119575b5061042d602061043792015161157a565b5151805190611614565b901561110857600080546001600160a01b0319166001600160a01b0392909216919091179055600180558751156110f75761090260a052855160c06104a160208351930151926104b389519485938493631e879a6d60e11b85528c60048601526044850190611555565b83810360031901602485015290611555565b03816109025afa9081156110ec57600091611046575b505060c05260005b865181101561066c5760008751821015610658575060208160051b880101516010546801000000000000000081101561062c5760018101806010558110156106425760106000528151805160019290921b7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019291906001600160401b03821161062c57610569826105638654611587565b866115d8565b602090601f83116001146105bd57926105a48360019796959460209489966000926105b2575b50508160011b916000199060031b1c19161790565b84555b0151910155016104d1565b01519050388061058f565b90601f1983169185600052816000209260005b818110610614575093602093600198979693899693838895106105fb575b505050811b0184556105a7565b015160001960f88460031b161c191690553880806105ee565b929360206001819287860151815501950193016105d0565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b50602087805160025501519460048610156110305760009560ff80196003541691161760035551805180519060018060401b03821161101c576106b0600454611587565b601f8111610fce575b50602090601f8311600114610f665791806106ed92602095948b92610f5b5750508160011b916000199060031b1c19161790565b6004555b01518051906001600160401b038211610f475761070f600554611587565b601f8111610f16575b50602090601f8311600114610eae57918061074c92606095948a92610ea35750508160011b916000199060031b1c19161790565b6005555b518051600655602081015160075584810151600880546001600160a01b0319166001600160a01b039290921691909117905501518051906001600160401b038211610b99576107a0600954611587565b601f8111610e55575b50602090601f8311600114610df0576107d99291879183610bad5750508160011b916000199060031b1c19161790565b6009555b518051600a80546001600160401b0319166001600160401b03929092169190911790556020810151805190680100000000000000008211610b9957600b5482600b55808310610d5c575b50600b865285907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020015b838310610c6b5750505050808301518051906001600160401b038211610b995761087f600c54611587565b601f8111610c1d575b50602090601f8311600114610bb8576108b89291879183610bad5750508160011b916000199060031b1c19161790565b600c555b6060810151600d805460808401516001600160801b03199091166001600160401b039384161790861b6fffffffffffffffff00000000000000001617905560a08201518051918211610b9957610913600e54611587565b601f8111610b4b575b50602090601f8311600114610ae35791806109509260c095948992610ad85750508160011b916000199060031b1c19161790565b600e555b0151805190936001600160401b038211610ac457610973600f54611587565b601f8111610a6b575b50602090601f8311600114610a0857906109ac939495836109fd5750508160011b916000199060031b1c19161790565b600f555b60118054610100600160a81b03191660089290921b610100600160a81b0316919091179055516128ab90816117da823960805181611ffc015260a05181611be6015260c051816107160152f35b01519050858061058f565b90601f198316600f8352818320925b818110610a5357509583600195969710610a3a575b505050811b01600f556109b0565b015160001960f88460031b161c19169055848080610a2c565b9192602060018192868b015181550194019201610a17565b600f8252610ab4907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f850160051c81019160208610610aba575b601f0160051c01906115c1565b8561097c565b9091508190610aa7565b634e487b7160e01b81526041600452602490fd5b01519050888061058f565b600e87528187209190601f198416885b818110610b33575091600193918560c097969410610b1a575b505050811b01600e55610954565b015160001960f88460031b161c19169055878080610b0c565b92936020600181928786015181550195019301610af3565b600e8752610b93907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd601f850160051c81019160208610610aba57601f0160051c01906115c1565b8661091c565b634e487b7160e01b86526041600452602486fd5b01519050878061058f565b600c87528187209190601f198416885b818110610c055750908460019594939210610bec575b505050811b01600c556108bc565b015160001960f88460031b161c19169055868080610bde565b92936020600181928786015181550195019301610bc8565b600c8752610c65907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f850160051c81019160208610610aba57601f0160051c01906115c1565b86610888565b80518051906001600160401b038211610d4857610c8c826105638654611587565b6020908a601f8411600114610cde578360019592946020948796610cc49492610cd35750508160011b916000199060031b1c19161790565b85555b01920192019190610854565b015190508e8061058f565b50848b52818b209190601f1984168c5b818110610d305750936020936001969387969383889510610d17575b505050811b018555610cc7565b015160001960f88460031b161c191690558d8080610d0a565b92936020600181928786015181550195019301610cee565b634e487b7160e01b8a52604160045260248afd5b600b87527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99081019083015b818110610d955750610827565b80610da260019254611587565b80610daf575b5001610d88565b601f81118314610dc457508881555b89610da8565b818a5260208a20610ddf91601f0160051c81019084016115c1565b808952886020812081835555610dbe565b600987528187209190601f198416885b818110610e3d5750908460019594939210610e24575b505050811b016009556107dd565b015160001960f88460031b161c19169055868080610e16565b92936020600181928786015181550195019301610e00565b60098752610e9d907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af601f850160051c81019160208610610aba57601f0160051c01906115c1565b866107a9565b01519050898061058f565b600588528188209190601f198416895b818110610efe5750916001939185606097969410610ee5575b505050811b01600555610750565b015160001960f88460031b161c19169055888080610ed7565b92936020600181928786015181550195019301610ebe565b610f41906005895260208920601f850160051c81019160208610610aba57601f0160051c01906115c1565b87610718565b634e487b7160e01b87526041600452602487fd5b015190508a8061058f565b600489528189209190601f1984168a5b818110610fb65750916001939185602097969410610f9d575b505050811b016004556106f1565b015160001960f88460031b161c19169055898080610f8f565b92936020600181928786015181550195019301610f76565b60048952611016907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610aba57601f0160051c01906115c1565b886106b9565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b600052602160045260246000fd5b8060c03d60c0116110e5575b61105c818361147b565b8101039160c083126110e257606088519361107685611445565b61107f8461152a565b855261108d6020850161152a565b602086015261109d8a850161152a565b858b0152605f1901126110e2575060a08751916110b98361140f565b6110c56060820161152a565b8352608081015160208401520151878201526060820152386104c9565b80fd5b503d611052565b86513d6000823e3d90fd5b63107d9ce760e31b60005260046000fd5b6307456b9160e21b60005260046000fd5b903d8082843e611129818461147b565b8201916020818403126112fc578051906001600160401b03821161130057019187838203126112fc5787519261115e8461142a565b80516001600160401b0381116112f857810160e0818403126112f85789519061118682611460565b61118f8161152a565b825261119d6020820161152a565b60208301526111ad8b820161152a565b8b830152606081015160038110156112f457606083015260808101516001600160401b0381116112f457816111e98660c09361120595016114c1565b60808501526111fa60a0820161152a565b60a08501520161152a565b60c082015284526020810151906001600160401b0382116112f8570181601f820112156113005780516112378161153e565b936112448b51958661147b565b81855260208086019260051b840101928484116112fc5760208101925b84841061127e57505050505060208301919091525061042d61041c565b83516001600160401b0381116112f85782018d601f1982890301126112f8578d51906112a98261142a565b60208101516001600160401b0381116112f457908f918960206112ce928401016114c1565b8352015160038110156112f05791816020938480940152815201930192611261565b8480fd5b8580fd5b8380fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103f9565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116113dd5782016040818503601f1901126113dd57604051916113a28361142a565b6020820151926001600160401b0384116113dd576040836113ca8860208098819801016114c1565b835201518382015281520194019361030a565b600080fd5b81516001600160401b0381116113dd576020916114048d8480948801016114c1565b81520191019061020d565b606081019081106001600160401b0382111761062c57604052565b604081019081106001600160401b0382111761062c57604052565b608081019081106001600160401b0382111761062c57604052565b60e081019081106001600160401b0382111761062c57604052565b601f909101601f19168101906001600160401b0382119082101761062c57604052565b60005b8381106114b15750506000910152565b81810151838201526020016114a1565b81601f820112156113dd5780516020909101906001600160401b03811161062c57604051926114fa601f8301601f19166020018561147b565b818452818301116113dd5761151391602084019061149e565b90565b51906001600160a01b03821682036113dd57565b51906001600160401b03821682036113dd57565b6001600160401b03811161062c5760051b60200190565b9060209161156e8151809281855285808601910161149e565b601f01601f1916010190565b8051156106425760200190565b90600182811c921680156115b7575b60208310146115a157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611596565b8181106115cc575050565b600081556001016115c1565b9190601f81116115e757505050565b611612926000526020600020906020601f840160051c83019310610aba57601f0160051c01906115c1565b565b90600061060f60f31b61ffff60f01b602085015116148060011b90808204600214901517156116895760280190816028116116755750810361166b57600061165b9261169d565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611731576000948101809111611753579192905b8183106116ed5750505060019190565b9092919360ff6117078160f81b6020888601015116611767565b16600f8111611747578160041b9180830460101490151715611731576001910194019192906116dd565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f8111806117cf575b1561178357602f190160ff1690565b60608111806117c5575b1561179c576056190160ff1690565b60408111806117bb575b156117b5576036190160ff1690565b5060ff90565b50604781106117a6565b506067811061178d565b50603a811061177456fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100b7578063229e81fb146100b257806342859ab3146100ad5780635a509280146100a857806362b61c8b146100a357806378b903371461009e578063819ef8ba1461009957806388328a6914610094578063b3d7ad481461008f5763cad31c741461008a57600080fd5b6110de565b610faf565b610ea5565b610d9a565b610b06565b610a8c565b610973565b61057b565b6104ba565b346100d95760006003193601126100d95760ff60115416151560805260206080f35b600080fd5b60009103126100d957565b90600182811c92168015610132575b602083101461010357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916100f8565b6004546000929161014c826100e9565b80825291600181169081156101c15750600114610167575050565b600460009081529293509091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8383106101a7575060209250010190565b600181602092949394548385870101520191019190610196565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6005546000929161020b826100e9565b80825291600181169081156101c15750600114610226575050565b600560009081529293509091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b838310610266575060209250010190565b600181602092949394548385870101520191019190610255565b60009291815491610290836100e9565b80835292600181169081156102e657506001146102ac57505050565b60009081526020812093945091925b8383106102cc575060209250010190565b6001816020929493945483858701015201910191906102bb565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761036d57604052565b610322565b60a0810190811067ffffffffffffffff82111761036d57604052565b6080810190811067ffffffffffffffff82111761036d57604052565b60e0810190811067ffffffffffffffff82111761036d57604052565b6060810190811067ffffffffffffffff82111761036d57604052565b90601f601f19910116810190811067ffffffffffffffff82111761036d57604052565b6040519061041f8261041881600e610280565b03836103e2565b565b6040519061041f8261041881600f610280565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561046d57565b610434565b60005b8381106104855750506000910152565b8181015183820152602001610475565b90601f19601f6020936104b381518092818752878088019101610472565b0116010190565b346100d95760006003193601126100d95760025460ff600354166040516104e081610351565b6040516104f7816104f08161013c565b03826103e2565b8152604051610509816104f0816101fb565b60208201908152604051938452600483101561046d57610546610577928594602086015260606040860152516040606086015260a0850190610495565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0848303016080850152610495565b0390f35b346100d95760a06003193601126100d9576004356024359060643591608435916002600154146108cc57600260015560115473ffffffffffffffffffffffffffffffffffffffff600882901c1633036108a25760ff16610878576105e46105e0611b97565b1590565b61084e5761062b6000936105f6611198565b9060405196879586957f62b61c8b000000000000000000000000000000000000000000000000000000008752600487016112d6565b0381305afa9081156107c857600090600092610826575b5061064c906113a5565b6106a96020604051610676816106688685830160209181520190565b03601f1981018352826103e2565b604051809381927fcad31c74000000000000000000000000000000000000000000000000000000008352600483016115af565b03816000305af180156107c8576106f4916000916107f7575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601154169115151617601155565b60115460ff166107cd575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100d9576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107c8576107ad575b5060115460ff1661079a60018055565b6040805191151582526020820192909252f35b806107bc60006107c2936103e2565b806100de565b3861078a565b611347565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a16106ff565b610819915060203d60201161081f575b61081181836103e2565b8101906114c9565b386106c2565b503d610807565b61064c925061084891503d806000833e61084081836103e2565b810190611266565b91610642565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100d95790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a0608061096a6060850151838386015260c0850190610495565b93015191015290565b346100d95760206003193601126100d95760043567ffffffffffffffff81116100d9576109a76105779136906004016108f6565b6109af6116df565b5073ffffffffffffffffffffffffffffffffffffffff6000541690610a2960408201356109db8161170a565b73ffffffffffffffffffffffffffffffffffffffff6020840135610a058535956060810190611732565b92909360405197610a1589610372565b885216602087015260408601523691611783565b6060830152608082015260405191829182610904565b9181601f840112156100d95782359167ffffffffffffffff83116100d9576020808501948460051b0101116100d957565b929190610a87602091604086526040860190610495565b930152565b346100d95760c06003193601126100d95760243560043560643560443560843567ffffffffffffffff81116100d957610ac9903690600401610a3f565b92909160a4359567ffffffffffffffff87116100d957610af0610af69736906004016108f6565b9561190d565b9061057760405192839283610a70565b346100d95760006003193601126100d9576020610b21611b97565b6040519015158152f35b60095460009291610b3b826100e9565b80825291600181169081156101c15750600114610b56575050565b600960009081529293509091907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b838310610b96575060209250010190565b600181602092949394548385870101520191019190610b85565b6040519061041f8261041881600c610280565b67ffffffffffffffff811161036d5760051b60200190565b600b5490610be882610bc3565b91610bf660405193846103e2565b808352600b60009081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602085015b838310610c335750505050565b600160208192604051610c4a816104f08189610280565b815201920192019190610c26565b9080602083519182815201916020808360051b8301019401926000915b838310610c8457505050505090565b9091929394602080610ca283601f1986600196030187528951610495565b97019301930191939290610c75565b610d026060610d979493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c0830190610495565b90602081830391015267ffffffffffffffff825116815260c0610d86610d4c610d3a602086015160e0602087015260e0860190610c58565b60408601518582036040870152610495565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a0860152610495565b9201519060c0818403910152610495565b90565b346100d95760006003193601126100d957604051610db78161038e565b6006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152604051610df2816104f081610b2b565b606082015260405190610e04826103aa565b67ffffffffffffffff600a54168252610e1b610bdb565b6020830152610e28610bb0565b6040830152610e7c610e6b600d54610e5b610e4a8267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610e84610405565b60a0830152610e91610421565b60c083015261057760405192839283610cb1565b346100d95760006003193601126100d95760ff6011541615610878576040516000601254610ed2816100e9565b8084529060018116908115610f6d5750600114610f0e575b61057783610efa818503826103e2565b604051918291602083526020830190610495565b601260009081527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444939250905b808210610f5357509091508101602001610efa610eea565b919260018160209254838588010152019101909291610f3b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610efa9050610eea565b346100d95760006003193601126100d957610fc86116df565b506040517f5a509280000000000000000000000000000000000000000000000000000000008152602060048201526000818061100660248201611297565b0381305afa9081156107c857600091611028575b604051806105778482610904565b3d8083833e61103781836103e2565b8101906020818303126110d65780519067ffffffffffffffff82116110da570160a0818303126110d6576040519161106e83610372565b81516110798161170a565b835260208201516110898161170a565b602084015260408201516040840152606082015167ffffffffffffffff81116110d257936110bf83926105779660809501611224565b606085015250015160808201529061101a565b8480fd5b8280fd5b8380fd5b346100d95760606003193601126100d95760043567ffffffffffffffff81116100d95760e060031982360301126100d9576024359067ffffffffffffffff82116100d957366023830112156100d95781600401359167ffffffffffffffff83116100d95736602484830101116100d9576044359067ffffffffffffffff82116100d95761057793611186936111796024943690600401610a3f565b9490930190600401611f57565b60405190151581529081906020820190565b604051906111a76020836103e2565b600080835282815b8281106111bb57505050565b8060606020809385010152016111af565b60405161014091906111de83826103e2565b6009815291601f19018260005b8281106111f757505050565b8060606020809385010152016111eb565b67ffffffffffffffff811161036d57601f01601f191660200190565b81601f820112156100d957805161123a81611208565b9261124860405194856103e2565b818452602082840101116100d957610d979160208085019101610472565b91906040838203126100d957825167ffffffffffffffff81116100d957602091611291918501611224565b92015190565b6080610d97916006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b929360809461130593610d979793865260208601526040850152606084015260c08484015260c0830190610c58565b9060a08183039101526006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b6040513d6000823e3d90fd5b601f821161136057505050565b6000526020600020906020601f840160051c8301931061139b575b601f0160051c01905b81811061138f575050565b60008155600101611384565b909150819061137b565b90815167ffffffffffffffff811161036d576113cd816113c66012546100e9565b6012611353565b602092601f821160011461142c5761141c92938291600092611421575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601255565b0151905038806113ea565b6012600052601f198216937fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449160005b8681106114b1575083600195961061147a575b505050811b01601255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061146f565b9192602060018192868501518155019401920161145c565b908160209103126100d9575180151581036100d95790565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061151357505050505090565b90919293946020600161153083601f198684960301875289610280565b97019301930191939290611504565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061157157505050505090565b90919293946020600282601f19856001950301865260408152611597604082018a610280565b9083858b015491015297019301930191939290611562565b6116cf610d9792606083526115e2606084016115d4600a5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e060808401526116c161168f6116326116016101408701600b6114e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600c610280565b600d5467ffffffffffffffff811660c088015261165d9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600e610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa085820301610120860152600f610280565b908382036020850152610495565b906040818303910152601061153f565b604051906116ec82610372565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100d957565b35610d978161170a565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d9576020019181360383136100d957565b92919261178f82611208565b9161179d60405193846103e2565b8294818452818301116100d9578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117f65760200190565b6117ba565b8051600110156117f65760400190565b8051600210156117f65760600190565b8051600310156117f65760800190565b8051600410156117f65760a00190565b8051600510156117f65760c00190565b8051600610156117f65760e00190565b8051600710156117f6576101000190565b8051600810156117f6576101200190565b80518210156117f65760209160051b010190565b92919261189d82610bc3565b936118ab60405195866103e2565b602085848152019260051b8201918183116100d95780935b8385106118d1575050505050565b843567ffffffffffffffff81116100d957820183601f820112156100d9576020916119028583858095359101611783565b8152019401936118c3565b9592909194939461191c6111cc565b9661192a6020860135612066565b611933896117e9565b5261193d886117e9565b50611947906125f9565b611950906120b8565b611959886117fb565b52611963876117fb565b5061196d906125f9565b611976906120b8565b61197f8761180b565b526119898661180b565b50611993906125f9565b61199c906120b8565b6119a58661181b565b526119af8561181b565b506119b9906125f9565b6119c2906120b8565b6119cb8561182b565b526119d58461182b565b506119e260408201611728565b6119eb90612077565b6119f48561183b565b526119fe8461183b565b50611a098135612066565b611a128561184b565b52611a1c8461184b565b5060608101611a2a91611732565b3690611a3592611783565b611a3e906120b8565b611a478461185b565b52611a518361185b565b503690611a5d92611891565b611a669061224c565b611a6f8261186c565b52611a798161186c565b50611a839061224c565b611a8b612520565b611a94906120b8565b90611a9e91612367565b908151602083012090565b67ffffffffffffffff8116036100d957565b8091039060c082126100d95760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611afa8661038e565b8351611b0581611aa9565b86526020840151611b1581611aa9565b60208701526040840151611b2881611aa9565b60408701520112611b6d5760a09060405192611b43846103c6565b6060820151611b5181611aa9565b8452608082015160208501525001516040820152606082015290565b5080fd5b610d979060408152611b87604082016004610280565b9060208183039101526005610280565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611bcd60048201611b71565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156107c857600091611c87575b5060035460ff16611c2781610463565b60018103611c4057506060015160400151600254111590565b611c4981610463565b611c5d576060015160400151600254101590565b7f951a55bf0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ca9915060c03d60c011611caf575b611ca181836103e2565b810190611abb565b38611c17565b503d611c97565b35610d9781611aa9565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d957602001918160051b360383136100d957565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100d957016020813591019167ffffffffffffffff82116100d95781360383136100d957565b90602083828152019160208260051b8501019381936000915b848310611dae5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100d957602080918760019401908280611e13611e058580611d35565b604086526040860191611d14565b9301359101529801930193019194939290611d9e565b90600282101561046d5752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff611e6695941681528160208201520191611d14565b938d6040818703910152808552602085019460208260051b82010195836000925b848410611f1f5750505050505094611ee98c9d60a0611ed861041f9e9f986101209e9c98611eca611f169f9d99611efa99611f079e8e6060818503910152611d14565b918b830360808d0152611d85565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152611d14565b91878303610100890152611d14565b93016001611e29565b909192939497602080611f4783601f198660019603018852611f418d88611d35565b90611d14565b9a01940194019294939190611e87565b9092939193611f6582611cb6565b92611f736020840184611cc0565b939092611f836040830183611732565b91909360608401611f9390611cb6565b91611fa060808601611cb6565b93611fae60a0870187611732565b97909660c08101611fbe91611732565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e611ff89f611e36565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107c85760009161204d575090565b610d97915060203d60201161081f5761081181836103e2565b612072610d97916125f9565b6120b8565b610d97906040519074140000000000000000000000000000000000000000186014820152603481016040526120b8565b9081518110156117f6570160200190565b60008151600181149081612234575b50156120d1575090565b815190603882101561212c5790610d9792917fff000000000000000000000000000000000000000000000000000000000000006121176080612111612408565b946126e4565b60f81b16901a612126826117e9565b53612367565b6001939092835b61213d8685612678565b1561215a5761214e612154916124f3565b956126b1565b94612133565b9092945092909261217261216d826126c8565b612446565b917fff000000000000000000000000000000000000000000000000000000000000006121a76121a26080856126e4565b6126d6565b60f81b16811a6121b6846117e9565b5360015b828111156121d057505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861222f96896124e6565b6126f1565b8b612678565b60ff1690565b60f81b16831a61222982876120a7565b536124f3565b6121ba565b9050156117f6576080602083015160f81c10386120c7565b6122559061278b565b8051600060388210156122965790610d9792917fff0000000000000000000000000000000000000000000000000000000000000061211760c0612111612408565b6001939092835b6122a78685612678565b156122be5761214e6122b8916124f3565b9461229d565b909294509290926122d161216d826126c8565b917fff000000000000000000000000000000000000000000000000000000000000006123016121a260c0856126e4565b60f81b16811a612310846117e9565b5360015b8281111561232a57505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861236296896124e6565b612314565b90604051918051908184526020840191840192602084019260208301905b8481106123d35750508051809386518201875294019360208086019201905b8281106123c35750509051603f92011590920101601f19166040525090565b81518152602091820191016123a4565b8151815260209182019101612385565b604080519091906123f483826103e2565b60208152918290601f190190369060200137565b6040805190919061241983826103e2565b6001815291601f1901366020840137565b604051906124396020836103e2565b6000808352366020840137565b9061245082611208565b61245d60405191826103e2565b828152601f1961246d8294611208565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60200390602082116124b457565b612477565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116124b457565b919082039182116124b457565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124b45760010190565b6125286123e3565b90600260208301526000915b602083106125b0575b61254961216d846124a6565b9060005b82518110156125a95760019061259561256f612568886124f3565b97856120a7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a6125a282866120a7565b530161254d565b5090925050565b916125e66125c161256f83866120a7565b7fff000000000000000000000000000000000000000000000000000000000000001690565b6125f35760010191612534565b9161253d565b906126026123e3565b9160208301526000915b60208310612654575b61262161216d846124a6565b9060005b82518110156125a95760019061264061256f612568886124f3565b60001a61264d82866120a7565b5301612625565b916126656125c161256f83866120a7565b612672576001019161260c565b91612615565b8115612682570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b908160081b9180830461010014901517156124b457565b90600182018092116124b457565b90603782018092116124b457565b919082018092116124b457565b601f81116124b4576101000a90565b1561270757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b9081511561282f57600091825b81518410156127d7576127cf6001916127bd6127b4878661187d565b51511515612700565b6127c7868561187d565b5151906126e4565b930192612798565b6127e391929350612446565b9060208201926000935b825185101561282857612820600191612816612809888761187d565b5160208151910183612839565b6127c7878661187d565b9401936127ed565b5092505090565b9050610d9761242a565b915b602081101561286e57602003602081116124b45761285b612860916126f1565b6124b9565b905182518216911916179052565b909182518152602081018091116124b45791602081018091116124b45790601f1981019081111561283b5761247756fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x7d9c2021f2c4b3a748b6e23f5260f6229b40a556dfc3ed2d7de5fbd79469cf9f", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea", + "0x60a034607357601f61582c38819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b03811690819003607357600160005560805260405161579d908161008f823960805181818160b001526103c90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780637fddd6021461004d5763b60bda491461004857600080fd5b6101e9565b610128565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761019a60209161018461019260243560405192839187830195869091604092825260208201520190565b03601f1981018352826102d6565b519020610b0d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357608060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff8211610083576102a39261026261027c9336906004016101b8565b9061026b6100e4565b9260843594600401906004016102fe565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176102f957604052565b6102a7565b9293949190916002600054146105d957600260005560405161033481610184602082019432869091604092825260208201520190565b5190209461035661034f876000526001602052604060002090565b5460ff1690565b6105af5761018461040b936103fb6104179661018461041196328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36149cf966103a660208901610603565b97808952610dc260208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109e7565b6040519485936020850190610ad6565b90610ad6565b83610ca3565b9161042181610b0d565b73ffffffffffffffffffffffffffffffffffffffff8416801591821561058e575b505061056157813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af190811561055c576104f0926104c592610541575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907ffb2d8b84e2e1acdcdbad3ce10c5a03d9f07b3f9f2e4a6d818a1a6a43610ac3b990602090a29061053f6001600055565b565b806105506000610556936102d6565b806100d9565b386104b4565b610b01565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff16141590503880610442565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b9061053f60405192836102d6565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b6106ef916106e16106d66106c88480610643565b604085526040850191610693565b926020810190610643565b916020818503910152610693565b90565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107b45750505050505090565b9091929394956020806107dc83601f1986600196030188526107d68b88610643565b90610693565b98019401940192949391906107a4565b6106ef9167ffffffffffffffff61080283610724565b1681526108b06108a561084a61082f61081e6020870187610739565b60e0602088015260e087019161078c565b61083c6040870187610643565b908683036040880152610693565b61086a61085960608701610724565b67ffffffffffffffff166060860152565b61088a61087960808701610724565b67ffffffffffffffff166080860152565b61089760a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761095e610953610942846106ef960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff61093260408301610107565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106f2565b9060208184039101526107ec565b90602083828152019260208260051b82010193836000925b8484106109945750505050505090565b90919293949560208082601f1985600195030187526109b38a87610611565b9082806109d16109c38580610643565b604086526040860191610693565b9301359101529801940194019294939190610984565b91909496959360a08352610a4f610a13610a018880610611565b608060a08701526101208601906106b4565b610a206020890189610611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608683030160c08701526106b4565b93604087013591600483101561008357610a8d608096610aba95606061053f9b610a9b9760e08b0152013561010089015287820360208901526108be565b91858303604087015261096c565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610aee575050016000815290565b8060208092840101518185015201610add565b6040513d6000823e3d90fd5b610c4a73ffffffffffffffffffffffffffffffffffffffff806106ef9360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b986075826102d6565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c2e816017840103601f1981018352826102d6565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c9e573d9067ffffffffffffffff82116102f95760405191610c92601f8201601f1916602001846102d6565b82523d6000602084013e565b606090565b919060405192610cb46040856102d6565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610ce781610b0d565b93843b610d97576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d6d5781600092918360208194519301915af1610d2b610c63565b50158015610d64575b610d3a57565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d34565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe6101208060405234611417576149cf803803809161001d8285611831565b8339810160a0828203126114175781516001600160401b038111611417578201916080838303126114175760405192610055846117e0565b80516001600160401b03811161141757836100719183016118cc565b845260208101516001600160401b03811161141757836100929183016118cc565b6020850152604081015190600482101561141757606091604086015201519060608401918252602081015160018060401b0381116114175781019160408385031261141757604051926100e4846117fb565b80516001600160401b038111611417578101608081870312611417576040519061010d826117e0565b80518252602081015160208301526101276040820161192d565b60408301526060810151906001600160401b0382116114175761014c91889101611877565b606082015284526020810151906001600160401b038211611417570160e081860312611417576040519061017f82611816565b61018881611941565b825260208101516001600160401b03811161141757810186601f820112156114175780516101b581611955565b916101c36040519384611831565b81835260208084019260051b820101918983116114175760208201905b8382106117b35750505050602083015260408101516001600160401b038111611417578661020f918301611877565b604083015261022060608201611941565b606083015261023160808201611941565b608083015260a08101516001600160401b0381116114175786610255918301611877565b60a083015260c0810151906001600160401b0382116114175761027a91879101611877565b60c0820152602084015260408201516001600160401b03811161141757820184601f82011215611417578051906102b082611955565b956102be6040519788611831565b82875260208088019360051b830101918183116114175760208101935b83851061174b5750505050506102ff60806102f86060850161192d565b930161192d565b602084015184519194916001600160a01b0385161561173a576001600160a01b038616156117295760a082015151156117185760c0820151511561170757604001516001600160a01b0316156116f65761090060805260406101008190528051919061036b9083611831565b600182526020820191601f196101005101368437600161038a8261196c565b52608051915161010080515163338c1f5160e01b81526001600160401b03909216600483015251602482015290516044820181905290926001600160a01b0390921691839160648301919060005b8181106116da5750505091818060009403915afa9081156114245760009161149e575b5061040c602061041692015161196c565b5151805190611a3b565b901561148d57600080546001600160a01b0319166001600160a01b039290921691909117905561090260a05261090360c05261010051516060949061045b8682611831565b60028152601f19860160005b81811061147d57505060208801515161047f8261196c565b526104898161196c565b50602080890151015161049b82611979565b526104a581611979565b506101005151906104b5826117fb565b600182526064602083015284516101005151908882016001600160401b0381118382101761075e57610100515281526020810191825261010051810192835260018060a01b0360c051169261010051519260208085015260c08401925161010051850152519160808a850152825180915260e0840190602060e08260051b8701019401916000905b828210611452575050505051608083016000905b6002821061143257505050600092826105786020946105c09403601f198101835282611831565b6101005151948580948193630b1e6daf60e31b835261010051600484015260096044840152681c1c9a58d95c1c995960ba1b6064840152608060248401526084830190611989565b03925af1908115611424576000916113e5575b50601180546001600160401b0319166001600160401b03929092169190911790556001600160a01b031660e05260005b855181101561079e576000865182101561078a575060208160051b870101516012546801000000000000000081101561075e5760018101806012558110156107745760126000528151805160019290921b7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444019291906001600160401b03821161075e5761069b8261069586546119ae565b866119ff565b602090601f83116001146106ef57926106d68360019796959460209489966000926106e4575b50508160011b916000199060031b1c19161790565b84555b015191015501610603565b0151905038806106c1565b90601f1983169185600052816000209260005b8181106107465750936020936001989796938996938388951061072d575b505050811b0184556106d9565b015160001960f88460031b161c19169055388080610720565b92936020600181928786015181550195019301610702565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b508551805180518892916001600160401b03821161075e576107c16001546119ae565b601f8111611396575b50602090601f831160011461132a5791806107ff92602095946000926111ac5750508160011b916000199060031b1c19161790565b6001555b01518051906001600160401b03821161075e576108216002546119ae565b601f81116112db575b50602090601f83116001146112725761085b92916000918361100f5750508160011b916000199060031b1c19161790565b6002555b602081015180518051906001600160401b03821161075e576108826003546119ae565b601f8111611223575b50602090601f83116001146111b75791806108c092602095946000926111ac5750508160011b916000199060031b1c19161790565b6003555b01518051906001600160401b03821161075e576108e26004546119ae565b601f811161115d575b50602090601f83116001146110f157918061092092604095946000926110e65750508160011b916000199060031b1c19161790565b6004555b01519160048310156110d05760009260ff801960055416911617600555516006558381518051600755602081015160085560018060a01b03610100518201511660018060a01b03196009541617600955015180519060018060401b038211610e7857610991600a546119ae565b601f8111611082575b50602090601f831160011461101a5791806109ce9260209594879261100f5750508160011b916000199060031b1c19161790565b600a555b01519260018060401b0384511660018060401b0319600b541617600b556020840151805190680100000000000000008211610e7857600c5482600c55808310610f7b575b50600c845283907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7906020015b838310610e8c575050610100518601518051925090506001600160401b038211610e7857610a72600d546119ae565b601f8111610e2a575b50602090601f8311600114610dc557610aab9291859183610d045750508160011b916000199060031b1c19161790565b600d555b830151600e80546080860151610100516001600160801b03199092166001600160401b0394851617911b6fffffffffffffffff00000000000000001617905560a084015180519094918111610cf057610b09600f546119ae565b601f8111610d77575b506020601f8211600114610d0f579080610b469285969760c09692610d045750508160011b916000199060031b1c19161790565b600f555b015180519092906001600160401b038111610cf057610b6a6010546119ae565b601f8111610c97575b506020601f8211600114610c345781908495610ba4949592610c295750508160011b916000199060031b1c19161790565b6010555b60138054610100600160a81b03191660089290921b610100600160a81b03169190911790554262015180810191908210610c1557506015556101005151612de29081611bed8239608051816123ea015260a05181611fa0015260c05181611ef2015260e051816106770152f35b634e487b7160e01b81526011600452602490fd5b0151905085806106c1565b6010845280842090601f198316855b818110610c7f57509583600195969710610c66575b505050811b01601055610ba8565b015160001960f88460031b161c19169055848080610c58565b9192602060018192868b015181550194019201610c43565b60108452610ce0907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672601f840160051c81019160208510610ce6575b601f0160051c01906119e8565b84610b73565b9091508190610cd3565b634e487b7160e01b83526041600452602483fd5b0151905087806106c1565b600f845280842095601f198316855b818110610d5f57509160c095969791846001959410610d46575b505050811b01600f55610b4a565b015160001960f88460031b161c19169055868080610d38565b83830151895560019098019760209384019301610d1e565b600f8452610dbf907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f840160051c81019160208510610ce657601f0160051c01906119e8565b85610b12565b600d85528185209190601f198416865b818110610e125750908460019594939210610df9575b505050811b01600d55610aaf565b015160001960f88460031b161c19169055868080610deb565b92936020600181928786015181550195019301610dd5565b600d8552610e72907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5601f850160051c81019160208610610ce657601f0160051c01906119e8565b86610a7b565b634e487b7160e01b84526041600452602484fd5b80518051906001600160401b038211610f6757610ead8261069586546119ae565b602090601f8311600114610efe5792610ee4836001959460209487968d92610ef35750508160011b916000199060031b1c19161790565b85555b01920192019190610a43565b015190508e806106c1565b8489528189209190601f1984168a5b818110610f4f5750936020936001969387969383889510610f36575b505050811b018555610ee7565b015160001960f88460031b161c191690558d8080610f29565b92936020600181928786015181550195019301610f0d565b634e487b7160e01b88526041600452602488fd5b600c85527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79081019083015b818110610fb45750610a16565b80610fc1600192546119ae565b80610fce575b5001610fa7565b601f81118314610fe357508681555b89610fc7565b81885260208820610ffe91601f0160051c81019084016119e8565b808752866020812081835555610fdd565b0151905088806106c1565b600a85528185209190601f198416865b81811061106a5750916001939185602097969410611051575b505050811b01600a556109d2565b015160001960f88460031b161c19169055878080611043565b9293602060018192878601518155019501930161102a565b600a85526110ca907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f850160051c81019160208610610ce657601f0160051c01906119e8565b8661099a565b634e487b7160e01b600052602160045260246000fd5b0151905089806106c1565b90601f198316916004600052816000209260005b818110611145575091600193918560409796941061112c575b505050811b01600455610924565b015160001960f88460031b161c1916905588808061111e565b92936020600181928786015181550195019301611105565b60046000526111a6907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610ce657601f0160051c01906119e8565b876108eb565b015190508a806106c1565b90601f198316916003600052816000209260005b81811061120b57509160019391856020979694106111f2575b505050811b016003556108c4565b015160001960f88460031b161c191690558980806111e4565b929360206001819287860151815501950193016111cb565b600360005261126c907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c81019160208610610ce657601f0160051c01906119e8565b8861088b565b90601f198316916002600052816000209260005b8181106112c357509084600195949392106112aa575b505050811b0160025561085f565b015160001960f88460031b161c1916905587808061129c565b92936020600181928786015181550195019301611286565b6002600052611324907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f850160051c81019160208610610ce657601f0160051c01906119e8565b8761082a565b90601f198316916001600052816000209260005b81811061137e5750916001939185602097969410611365575b505050811b01600155610803565b015160001960f88460031b161c19169055898080611357565b9293602060018192878601518155019501930161133e565b60016000526113df907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c81019160208610610ce657601f0160051c01906119e8565b886107ca565b90506020813d60201161141c575b8161140060209383611831565b810103126114175761141190611941565b386105d3565b600080fd5b3d91506113f3565b61010051513d6000823e3d90fd5b82516001600160401b031681526020928301926001929092019101610551565b9091929460208061146f60019360df198b82030186528951611989565b97019201920190929161053d565b8088602080938601015201610467565b6307456b9160e21b60005260046000fd5b3d8083833e6114ad8183611831565b60208282810103126116d65781516001600160401b0381116116cd578201610100518183850103126116cd576101005151936114e8856117fb565b81516001600160401b0381116116d257820160e08185870103126116d25761010051519061151582611816565b61151e81611941565b825261152c60208201611941565b602083015261153f610100518201611941565b61010051830152606081015160038110156116cd57606083015260808101516001600160401b0381116116cd5761159d9161158160c092888a01908301611877565b608085015261159260a08201611941565b60a085015201611941565b60c082015285526020820151906001600160401b0382116116cf57838501601f8385010112156116cf5781830151926115d584611955565b956115e561010051519788611831565b848752602087019386820160208760051b8386010101116116cd57602081840101945b60208760051b8386010101861061163357505050505060208501939093525061040c91506103fb9050565b85516001600160401b0381116116c957610100518584018201858b0103601f1901126116c957610100515190611668826117fb565b8584018101602001516001600160401b0381116116c5576116959060208c88019184888b01010101611877565b8252610100519084870101015160038110156116c1576020828101919091529082529586019501611608565b8680fd5b8780fd5b8580fd5b835b80fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103d8565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116114175782016040818503601f1901126114175760405191611778836117fb565b6020820151926001600160401b038411611417576040836117a0886020809881980101611877565b83520151838201528152019401936102db565b81516001600160401b038111611417576020916117d58d848094880101611877565b8152019101906101e0565b608081019081106001600160401b0382111761075e57604052565b604081019081106001600160401b0382111761075e57604052565b60e081019081106001600160401b0382111761075e57604052565b601f909101601f19168101906001600160401b0382119082101761075e57604052565b60005b8381106118675750506000910152565b8181015183820152602001611857565b81601f820112156114175780516020909101906001600160401b03811161075e57604051926118b0601f8301601f191660200185611831565b81845281830111611417576118c9916020840190611854565b90565b919060408382031261141757604051906118e5826117fb565b8351919384926001600160401b0381116114175782611905918301611877565b83526020810151916001600160401b038311611417576020926119289201611877565b910152565b51906001600160a01b038216820361141757565b51906001600160401b038216820361141757565b6001600160401b03811161075e5760051b60200190565b8051156107745760200190565b8051600110156107745760400190565b906020916119a281518092818552858086019101611854565b601f01601f1916010190565b90600182811c921680156119de575b60208310146119c857565b634e487b7160e01b600052602260045260246000fd5b91607f16916119bd565b8181106119f3575050565b600081556001016119e8565b9190601f8111611a0e57505050565b611a39926000526020600020906020601f840160051c83019310610ce657601f0160051c01906119e8565b565b90600061060f60f31b61ffff60f01b602085015116148060011b9080820460021490151715611a9c576028019081602811610c1557508103611a92576000611a8292611ab0565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611b44576000948101809111611b66579192905b818310611b005750505060019190565b9092919360ff611b1a8160f81b6020888601015116611b7a565b16600f8111611b5a578160041b9180830460101490151715611b4457600191019401919290611af0565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f811180611be2575b15611b9657602f190160ff1690565b6060811180611bd8575b15611baf576056190160ff1690565b6040811180611bce575b15611bc8576036190160ff1690565b5060ff90565b5060478110611bb9565b5060678110611ba0565b50603a8110611b8756fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100d7578063229e81fb146100d257806342859ab3146100cd5780635a509280146100c857806362b61c8b146100c357806378b90337146100be578063819ef8ba146100b957806388328a69146100b4578063b3d7ad48146100af578063cad31c74146100aa578063cbe61e59146100a55763d47e4eeb146100a057600080fd5b61112d565b611105565b61104b565b610f1c565b610e12565b610d07565b610a3c565b6109c2565b6108a9565b6104c9565b61042e565b6100ec565b60009103126100e757565b600080fd5b346100e75760006003193601126100e757602060ff601354166040519015158152f35b90600182811c92168015610158575b602083101461012957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161011e565b600092918154916101728361010f565b80835292600181169081156101c8575060011461018e57505050565b60009081526020812093945091925b8383106101ae575060209250010190565b60018160209294939454838587010152019101919061019d565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761024f57604052565b610204565b60a0810190811067ffffffffffffffff82111761024f57604052565b6080810190811067ffffffffffffffff82111761024f57604052565b60e0810190811067ffffffffffffffff82111761024f57604052565b6060810190811067ffffffffffffffff82111761024f57604052565b6020810190811067ffffffffffffffff82111761024f57604052565b90601f601f19910116810190811067ffffffffffffffff82111761024f57604052565b6040519061031d8261031681600f610162565b03836102e0565b565b6040519061031d82610316816010610162565b6040519061033f82610233565b8160405161035981610352816003610162565b03826102e0565b815260206040519161037783610370816004610162565b03846102e0565b0152565b60005b83811061038e5750506000910152565b818101518382015260200161037e565b90601f19601f6020936103bc8151809281875287808801910161037b565b0116010190565b6103ed9160206103dc835160408452604084019061039e565b92015190602081840391015261039e565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561042957565b6103f0565b346100e75760006003193601126100e75760405161044b81610233565b60405161045d81610352816001610162565b815260405161047181610352816002610162565b602082015261047e610332565b60ff60055416906104af600654916104a1604051956080875260808701906103c3565b9085820360208701526103c3565b906004831015610429578392604084015260608301520390f35b346100e75760a06003193601126100e7576004356024359060643591608435916013546105296105108273ffffffffffffffffffffffffffffffffffffffff9060081c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036108025760ff166107d857610545610541611e75565b1590565b6107ae5761058c600093610557611149565b9060405196879586957f62b61c8b00000000000000000000000000000000000000000000000000000000875260048701611294565b0381305afa90811561072857600090600092610786575b506105ad90611363565b61060a60206040516105d7816105c98685830160209181520190565b03601f1981018352826102e0565b604051809381927fcad31c740000000000000000000000000000000000000000000000000000000083526004830161156d565b03816000305af180156107285761065591600091610757575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601354169115151617601355565b60135460ff1661072d575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100e7576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107285761070d575b5060135460ff16604080519115158252602082019290925290819081015b0390f35b8061071c6000610722936102e0565b806100dc565b386106eb565b611305565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a1610660565b610779915060203d60201161077f575b61077181836102e0565b810190611487565b38610623565b503d610767565b6105ad92506107a891503d806000833e6107a081836102e0565b810190611224565b916105a3565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100e75790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a060806108a06060850151838386015260c085019061039e565b93015191015290565b346100e75760206003193601126100e75760043567ffffffffffffffff81116100e7576108dd61070991369060040161082c565b6108e561169d565b5073ffffffffffffffffffffffffffffffffffffffff600054169061095f6040820135610911816116c8565b73ffffffffffffffffffffffffffffffffffffffff602084013561093b85359560608101906116f0565b9290936040519761094b89610254565b885216602087015260408601523691611741565b606083015260808201526040519182918261083a565b9181601f840112156100e75782359167ffffffffffffffff83116100e7576020808501948460051b0101116100e757565b9291906109bd60209160408652604086019061039e565b930152565b346100e75760c06003193601126100e75760243560043560643560443560843567ffffffffffffffff81116100e7576109ff903690600401610975565b92909160a4359567ffffffffffffffff87116100e757610a26610a2c97369060040161082c565b956118cb565b90610709604051928392836109a6565b346100e75760006003193601126100e7576020610a57611e75565b6040519015158152f35b600a5460009291610a718261010f565b8082529160018116908115610ae65750600114610a8c575050565b600a60009081529293509091907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b838310610acc575060209250010190565b600181602092949394548385870101520191019190610abb565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040519061031d8261031681600d610162565b67ffffffffffffffff811161024f5760051b60200190565b600c5490610b5882610b33565b91610b6660405193846102e0565b808352600c60009081527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7602085015b838310610ba35750505050565b600160208192604051610bba816103528189610162565b815201920192019190610b96565b9080602083519182815201916020808360051b8301019401926000915b838310610bf457505050505090565b9091929394602080610c1283601f198660019603018752895161039e565b97019301930191939290610be5565b610c7260606103ed9493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c083019061039e565b90602081830391015267ffffffffffffffff825116815260c0610cf6610cbc610caa602086015160e0602087015260e0860190610bc8565b6040860151858203604087015261039e565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a086015261039e565b9201519060c081840391015261039e565b346100e75760006003193601126100e757604051610d2481610270565b6007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff600954166040820152604051610d5f8161035281610a61565b606082015260405190610d718261028c565b67ffffffffffffffff600b54168252610d88610b4b565b6020830152610d95610b20565b6040830152610de9610dd8600e54610dc8610db78267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610df1610303565b60a0830152610dfe61031f565b60c083015261070960405192839283610c21565b346100e75760006003193601126100e75760ff60135416156107d8576040516000601454610e3f8161010f565b8084529060018116908115610eda5750600114610e7b575b61070983610e67818503826102e0565b60405191829160208352602083019061039e565b601460009081527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec939250905b808210610ec057509091508101602001610e67610e57565b919260018160209254838588010152019101909291610ea8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610e679050610e57565b346100e75760006003193601126100e757610f3561169d565b506040517f5a5092800000000000000000000000000000000000000000000000000000000081526020600482015260008180610f7360248201611255565b0381305afa90811561072857600091610f95575b60405180610709848261083a565b3d8083833e610fa481836102e0565b8101906020818303126110435780519067ffffffffffffffff8211611047570160a0818303126110435760405191610fdb83610254565b8151610fe6816116c8565b83526020820151610ff6816116c8565b602084015260408201516040840152606082015167ffffffffffffffff811161103f579361102c8392610709966080950161120a565b6060850152500151608082015290610f87565b8480fd5b8280fd5b8380fd5b346100e75760606003193601126100e75760043567ffffffffffffffff81116100e75760e060031982360301126100e7576024359067ffffffffffffffff82116100e757366023830112156100e75781600401359167ffffffffffffffff83116100e75736602484830101116100e7576044359067ffffffffffffffff82116100e757610709936110f3936110e66024943690600401610975565b9490930190600401612345565b60405190151581529081906020820190565b346100e75760006003193601126100e757602067ffffffffffffffff60115416604051908152f35b346100e75760006003193601126100e757602060405160108152f35b604051906111586020836102e0565b600080835282815b82811061116c57505050565b806060602080938501015201611160565b604051610140919061118f83826102e0565b6009815291601f19018260005b8281106111a857505050565b80606060208093850101520161119c565b67ffffffffffffffff811161024f57601f01601f191660200190565b909291926111e2816111b9565b916111f060405193846102e0565b8294828452828201116100e757602061031d93019061037b565b9080601f830112156100e75781516103ed926020016111d5565b91906040838203126100e757825167ffffffffffffffff81116100e75760209161124f91850161120a565b92015190565b60806103ed916007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b92936080946112c3936103ed9793865260208601526040850152606084015260c08484015260c0830190610bc8565b9060a08183039101526007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b6040513d6000823e3d90fd5b601f821161131e57505050565b6000526020600020906020601f840160051c83019310611359575b601f0160051c01905b81811061134d575050565b60008155600101611342565b9091508190611339565b90815167ffffffffffffffff811161024f5761138b8161138460145461010f565b6014611311565b602092601f82116001146113ea576113da929382916000926113df575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601455565b0151905038806113a8565b6014600052601f198216937fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9160005b86811061146f5750836001959610611438575b505050811b01601455565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061142d565b9192602060018192868501518155019401920161141a565b908160209103126100e7575180151581036100e75790565b90806020835491828152019160208260051b820101936000526020600020926000915b8383106114d157505050505090565b9091929394602060016114ee83601f198684960301875289610162565b970193019301919392906114c2565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061152f57505050505090565b90919293946020600282601f19856001950301865260408152611555604082018a610162565b9083858b015491015297019301930191939290611520565b61168d6103ed92606083526115a060608401611592600b5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e0608084015261167f61164d6115f06115bf6101408701600c61149f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600d610162565b600e5467ffffffffffffffff811660c088015261161b9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600f610162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101208601526010610162565b90838203602085015261039e565b90604081830391015260126114fd565b604051906116aa82610254565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100e757565b356103ed816116c8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e7576020019181360383136100e757565b92919261174d826111b9565b9161175b60405193846102e0565b8294818452818301116100e7578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117b45760200190565b611778565b8051600110156117b45760400190565b8051600210156117b45760600190565b8051600310156117b45760800190565b8051600410156117b45760a00190565b8051600510156117b45760c00190565b8051600610156117b45760e00190565b8051600710156117b4576101000190565b8051600810156117b4576101200190565b80518210156117b45760209160051b010190565b92919261185b82610b33565b9361186960405195866102e0565b602085848152019260051b8201918183116100e75780935b83851061188f575050505050565b843567ffffffffffffffff81116100e757820183601f820112156100e7576020916118c08583858095359101611741565b815201940193611881565b959290919493946118da61117d565b966118e86020860135612454565b6118f1896117a7565b526118fb886117a7565b5061190590612b80565b61190e906124a6565b611917886117b9565b52611921876117b9565b5061192b90612b80565b611934906124a6565b61193d876117c9565b52611947866117c9565b5061195190612b80565b61195a906124a6565b611963866117d9565b5261196d856117d9565b5061197790612b80565b611980906124a6565b611989856117e9565b52611993846117e9565b506119a0604082016116e6565b6119a990612465565b6119b2856117f9565b526119bc846117f9565b506119c78135612454565b6119d085611809565b526119da84611809565b50606081016119e8916116f0565b36906119f392611741565b6119fc906124a6565b611a0584611819565b52611a0f83611819565b503690611a1b9261184f565b611a249061263a565b611a2d8261182a565b52611a378161182a565b50611a419061263a565b611a49612aa7565b611a52906124a6565b90611a5c91612755565b908151602083012090565b67ffffffffffffffff8116036100e757565b9080601f830112156100e757815191611a9183610b33565b92611a9f60405194856102e0565b80845260208085019160051b830101918383116100e75760208101915b838310611acb57505050505090565b825167ffffffffffffffff81116100e7578201906060601f1983880301126100e75760405191611afa836102a8565b6020810151611b0881611a67565b835260408101519067ffffffffffffffff82116100e757611b3088602060609484010161120a565b602085015201519060038210156100e7578260209392604085940152815201920191611abc565b91906060838203126100e75760405190611b70826102a8565b81938051611b7d81611a67565b8352602081015167ffffffffffffffff81116100e75782611b9f91830161120a565b602084015260408101519167ffffffffffffffff83116100e757604092611bc6920161120a565b910152565b6020818303126100e75780519067ffffffffffffffff82116100e75701906020828203126100e75760405191611c00836102c4565b80519067ffffffffffffffff82116100e757016060818303126100e75760405191611c2a836102a8565b815167ffffffffffffffff81116100e75782016080818303126100e75760405190611c5482610270565b8051611c5f81611a67565b82526020810151611c6f816116c8565b6020830152604081015167ffffffffffffffff81116100e757810183601f820112156100e75783816020611ca5935191016111d5565b604083015260608101519067ffffffffffffffff82116100e757611ccb9184910161120a565b60608201528352602082015167ffffffffffffffff81116100e75781611cf2918401611a79565b6020840152604082015167ffffffffffffffff81116100e757611d159201611b57565b6040820152815290565b6020818303126100e75780519067ffffffffffffffff82116100e757019080601f830112156100e7578151611d5381610b33565b92611d6160405194856102e0565b81845260208085019260051b8201019283116100e757602001905b828210611d895750505090565b8151815260209182019101611d7c565b8091039060c082126100e75760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611dd886610270565b8351611de381611a67565b86526020840151611df381611a67565b60208701526040840151611e0681611a67565b60408701520112611e4b5760a09060405192611e21846102a8565b6060820151611e2f81611a67565b8452608082015160208501525001516040820152606082015290565b5080fd5b6103ed9060408152611e65604082016001610162565b9060208183039101526002610162565b601554421161209f57611ed96000611e9660115467ffffffffffffffff1690565b6040517f012d56e000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156107285760409160009161207c575b50510151805167ffffffffffffffff1615612076576020611f5191015160208082518301019101611d1f565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611f8760048201611e4f565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610728576103ed9261203b92600092612041575b5080612003611ff3611fec612008946117a7565b51926117b9565b5191662386f26fc100009061282a565b61283d565b6120356120286040806060860151015194015167ffffffffffffffff1690565b67ffffffffffffffff1690565b916128be565b90612928565b6120089192506120689060c03d60c01161206f575b61206081836102e0565b810190611d99565b9190611fd8565b503d612056565b50600090565b61209991503d806000833e61209181836102e0565b810190611bcb565b38611f25565b600090565b356103ed81611a67565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e757602001918160051b360383136100e757565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100e757016020813591019167ffffffffffffffff82116100e75781360383136100e757565b90602083828152019160208260051b8501019381936000915b84831061219c5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100e7576020809187600194019082806122016121f38580612123565b604086526040860191612102565b930135910152980193019301919493929061218c565b9060028210156104295752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff61225495941681528160208201520191612102565b938d6040818703910152808552602085019460208260051b82010195836000925b84841061230d57505050505050946122d78c9d60a06122c661031d9e9f986101209e9c986122b86123049f9d996122e8996122f59e8e6060818503910152612102565b918b830360808d0152612173565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152612102565b91878303610100890152612102565b93016001612217565b90919293949760208061233583601f19866001960301885261232f8d88612123565b90612102565b9a01940194019294939190612275565b9092939193612353826120a4565b9261236160208401846120ae565b93909261237160408301836116f0565b91909360608401612381906120a4565b9161238e608086016120a4565b9361239c60a08701876116f0565b97909660c081016123ac916116f0565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e6123e69f612224565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107285760009161243b575090565b6103ed915060203d60201161077f5761077181836102e0565b6124606103ed91612b80565b6124a6565b6103ed906040519074140000000000000000000000000000000000000000186014820152603481016040526124a6565b9081518110156117b4570160200190565b60008151600181149081612622575b50156124bf575090565b815190603882101561251a57906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560806124ff612a0b565b94612c1b565b60f81b16901a612514826117a7565b53612755565b6001939092835b61252b868561283d565b156125485761253c61254291612a7a565b95612813565b94612521565b9092945092909261256061255b82612bff565b612a49565b917fff00000000000000000000000000000000000000000000000000000000000000612595612590608085612c1b565b612c0d565b60f81b16811a6125a4846117a7565b5360015b828111156125be575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661261d96896128b1565b612c28565b8b61283d565b60ff1690565b60f81b16831a6126178287612495565b53612a7a565b6125a8565b9050156117b4576080602083015160f81c10386124b5565b61264390612cc2565b80516000603882101561268457906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560c06124ff612a0b565b6001939092835b612695868561283d565b156126ac5761253c6126a691612a7a565b9461268b565b909294509290926126bf61255b82612bff565b917fff000000000000000000000000000000000000000000000000000000000000006126ef61259060c085612c1b565b60f81b16811a6126fe846117a7565b5360015b82811115612718575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661275096896128b1565b612702565b90604051918051908184526020840191840192602084019260208301905b8481106127c15750508051809386518201875294019360208086019201905b8281106127b15750509051603f92011590920101601f19166040525090565b8151815260209182019101612792565b8151815260209182019101612773565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b604d811161280e57600a0a90565b6127d1565b908160081b91808304610100149015171561280e57565b8181029291811591840414171561280e57565b8115612847570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b602003906020821161280e57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161280e57565b9190820391821161280e57565b90929190601082111561292057815b82039082821161280e576128e36128e992612800565b9061282a565b927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0820191821161280e576128e36103ed92612800565b6010916128cd565b60ff60055416916129388361041f565b6001831492836129db575b83156129b8575b8315612994575b8315612969575b50505061296457600090565b600190565b6002919293506129788161041f565b14918261298a575b5050388080612958565b1090503880612980565b925061299f8361041f565b60038314806129af575b92612951565b508082116129a9565b92506129c38361041f565b8215806129d1575b9261294a565b50808211156129cb565b818310159350612943565b604080519091906129f783826102e0565b60208152918290601f190190369060200137565b60408051909190612a1c83826102e0565b6001815291601f1901366020840137565b60405190612a3c6020836102e0565b6000808352366020840137565b90612a53826111b9565b612a6060405191826102e0565b828152601f19612a7082946111b9565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461280e5760010190565b612aaf6129e6565b90600260208301526000915b60208310612b37575b612ad061255b84612876565b9060005b8251811015612b3057600190612b1c612af6612aef88612a7a565b9785612495565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612b298286612495565b5301612ad4565b5090925050565b91612b6d612b48612af68386612495565b7fff000000000000000000000000000000000000000000000000000000000000001690565b612b7a5760010191612abb565b91612ac4565b90612b896129e6565b9160208301526000915b60208310612bdb575b612ba861255b84612876565b9060005b8251811015612b3057600190612bc7612af6612aef88612a7a565b60001a612bd48286612495565b5301612bac565b91612bec612b48612af68386612495565b612bf95760010191612b93565b91612b9c565b906001820180921161280e57565b906037820180921161280e57565b9190820180921161280e57565b601f811161280e576101000a90565b15612c3e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b90815115612d6657600091825b8151841015612d0e57612d06600191612cf4612ceb878661183b565b51511515612c37565b612cfe868561183b565b515190612c1b565b930192612ccf565b612d1a91929350612a49565b9060208201926000935b8251851015612d5f57612d57600191612d4d612d40888761183b565b5160208151910183612d70565b612cfe878661183b565b940193612d24565b5092505090565b90506103ed612a2d565b915b6020811015612da5576020036020811161280e57612d92612d9791612c28565b612884565b905182518216911916179052565b9091825181526020810180911161280e57916020810180911161280e5790601f19810190811115612d72576127d156fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0x6dbe2c", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000584c60a034607357601f61582c38819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b03811690819003607357600160005560805260405161579d908161008f823960805181818160b001526103c90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780637fddd6021461004d5763b60bda491461004857600080fd5b6101e9565b610128565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761019a60209161018461019260243560405192839187830195869091604092825260208201520190565b03601f1981018352826102d6565b519020610b0d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357608060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff8211610083576102a39261026261027c9336906004016101b8565b9061026b6100e4565b9260843594600401906004016102fe565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176102f957604052565b6102a7565b9293949190916002600054146105d957600260005560405161033481610184602082019432869091604092825260208201520190565b5190209461035661034f876000526001602052604060002090565b5460ff1690565b6105af5761018461040b936103fb6104179661018461041196328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36149cf966103a660208901610603565b97808952610dc260208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109e7565b6040519485936020850190610ad6565b90610ad6565b83610ca3565b9161042181610b0d565b73ffffffffffffffffffffffffffffffffffffffff8416801591821561058e575b505061056157813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af190811561055c576104f0926104c592610541575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907ffb2d8b84e2e1acdcdbad3ce10c5a03d9f07b3f9f2e4a6d818a1a6a43610ac3b990602090a29061053f6001600055565b565b806105506000610556936102d6565b806100d9565b386104b4565b610b01565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff16141590503880610442565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b9061053f60405192836102d6565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b6106ef916106e16106d66106c88480610643565b604085526040850191610693565b926020810190610643565b916020818503910152610693565b90565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107b45750505050505090565b9091929394956020806107dc83601f1986600196030188526107d68b88610643565b90610693565b98019401940192949391906107a4565b6106ef9167ffffffffffffffff61080283610724565b1681526108b06108a561084a61082f61081e6020870187610739565b60e0602088015260e087019161078c565b61083c6040870187610643565b908683036040880152610693565b61086a61085960608701610724565b67ffffffffffffffff166060860152565b61088a61087960808701610724565b67ffffffffffffffff166080860152565b61089760a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761095e610953610942846106ef960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff61093260408301610107565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106f2565b9060208184039101526107ec565b90602083828152019260208260051b82010193836000925b8484106109945750505050505090565b90919293949560208082601f1985600195030187526109b38a87610611565b9082806109d16109c38580610643565b604086526040860191610693565b9301359101529801940194019294939190610984565b91909496959360a08352610a4f610a13610a018880610611565b608060a08701526101208601906106b4565b610a206020890189610611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608683030160c08701526106b4565b93604087013591600483101561008357610a8d608096610aba95606061053f9b610a9b9760e08b0152013561010089015287820360208901526108be565b91858303604087015261096c565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610aee575050016000815290565b8060208092840101518185015201610add565b6040513d6000823e3d90fd5b610c4a73ffffffffffffffffffffffffffffffffffffffff806106ef9360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b986075826102d6565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c2e816017840103601f1981018352826102d6565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c9e573d9067ffffffffffffffff82116102f95760405191610c92601f8201601f1916602001846102d6565b82523d6000602084013e565b606090565b919060405192610cb46040856102d6565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610ce781610b0d565b93843b610d97576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d6d5781600092918360208194519301915af1610d2b610c63565b50158015610d64575b610d3a57565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d34565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe6101208060405234611417576149cf803803809161001d8285611831565b8339810160a0828203126114175781516001600160401b038111611417578201916080838303126114175760405192610055846117e0565b80516001600160401b03811161141757836100719183016118cc565b845260208101516001600160401b03811161141757836100929183016118cc565b6020850152604081015190600482101561141757606091604086015201519060608401918252602081015160018060401b0381116114175781019160408385031261141757604051926100e4846117fb565b80516001600160401b038111611417578101608081870312611417576040519061010d826117e0565b80518252602081015160208301526101276040820161192d565b60408301526060810151906001600160401b0382116114175761014c91889101611877565b606082015284526020810151906001600160401b038211611417570160e081860312611417576040519061017f82611816565b61018881611941565b825260208101516001600160401b03811161141757810186601f820112156114175780516101b581611955565b916101c36040519384611831565b81835260208084019260051b820101918983116114175760208201905b8382106117b35750505050602083015260408101516001600160401b038111611417578661020f918301611877565b604083015261022060608201611941565b606083015261023160808201611941565b608083015260a08101516001600160401b0381116114175786610255918301611877565b60a083015260c0810151906001600160401b0382116114175761027a91879101611877565b60c0820152602084015260408201516001600160401b03811161141757820184601f82011215611417578051906102b082611955565b956102be6040519788611831565b82875260208088019360051b830101918183116114175760208101935b83851061174b5750505050506102ff60806102f86060850161192d565b930161192d565b602084015184519194916001600160a01b0385161561173a576001600160a01b038616156117295760a082015151156117185760c0820151511561170757604001516001600160a01b0316156116f65761090060805260406101008190528051919061036b9083611831565b600182526020820191601f196101005101368437600161038a8261196c565b52608051915161010080515163338c1f5160e01b81526001600160401b03909216600483015251602482015290516044820181905290926001600160a01b0390921691839160648301919060005b8181106116da5750505091818060009403915afa9081156114245760009161149e575b5061040c602061041692015161196c565b5151805190611a3b565b901561148d57600080546001600160a01b0319166001600160a01b039290921691909117905561090260a05261090360c05261010051516060949061045b8682611831565b60028152601f19860160005b81811061147d57505060208801515161047f8261196c565b526104898161196c565b50602080890151015161049b82611979565b526104a581611979565b506101005151906104b5826117fb565b600182526064602083015284516101005151908882016001600160401b0381118382101761075e57610100515281526020810191825261010051810192835260018060a01b0360c051169261010051519260208085015260c08401925161010051850152519160808a850152825180915260e0840190602060e08260051b8701019401916000905b828210611452575050505051608083016000905b6002821061143257505050600092826105786020946105c09403601f198101835282611831565b6101005151948580948193630b1e6daf60e31b835261010051600484015260096044840152681c1c9a58d95c1c995960ba1b6064840152608060248401526084830190611989565b03925af1908115611424576000916113e5575b50601180546001600160401b0319166001600160401b03929092169190911790556001600160a01b031660e05260005b855181101561079e576000865182101561078a575060208160051b870101516012546801000000000000000081101561075e5760018101806012558110156107745760126000528151805160019290921b7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444019291906001600160401b03821161075e5761069b8261069586546119ae565b866119ff565b602090601f83116001146106ef57926106d68360019796959460209489966000926106e4575b50508160011b916000199060031b1c19161790565b84555b015191015501610603565b0151905038806106c1565b90601f1983169185600052816000209260005b8181106107465750936020936001989796938996938388951061072d575b505050811b0184556106d9565b015160001960f88460031b161c19169055388080610720565b92936020600181928786015181550195019301610702565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b508551805180518892916001600160401b03821161075e576107c16001546119ae565b601f8111611396575b50602090601f831160011461132a5791806107ff92602095946000926111ac5750508160011b916000199060031b1c19161790565b6001555b01518051906001600160401b03821161075e576108216002546119ae565b601f81116112db575b50602090601f83116001146112725761085b92916000918361100f5750508160011b916000199060031b1c19161790565b6002555b602081015180518051906001600160401b03821161075e576108826003546119ae565b601f8111611223575b50602090601f83116001146111b75791806108c092602095946000926111ac5750508160011b916000199060031b1c19161790565b6003555b01518051906001600160401b03821161075e576108e26004546119ae565b601f811161115d575b50602090601f83116001146110f157918061092092604095946000926110e65750508160011b916000199060031b1c19161790565b6004555b01519160048310156110d05760009260ff801960055416911617600555516006558381518051600755602081015160085560018060a01b03610100518201511660018060a01b03196009541617600955015180519060018060401b038211610e7857610991600a546119ae565b601f8111611082575b50602090601f831160011461101a5791806109ce9260209594879261100f5750508160011b916000199060031b1c19161790565b600a555b01519260018060401b0384511660018060401b0319600b541617600b556020840151805190680100000000000000008211610e7857600c5482600c55808310610f7b575b50600c845283907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7906020015b838310610e8c575050610100518601518051925090506001600160401b038211610e7857610a72600d546119ae565b601f8111610e2a575b50602090601f8311600114610dc557610aab9291859183610d045750508160011b916000199060031b1c19161790565b600d555b830151600e80546080860151610100516001600160801b03199092166001600160401b0394851617911b6fffffffffffffffff00000000000000001617905560a084015180519094918111610cf057610b09600f546119ae565b601f8111610d77575b506020601f8211600114610d0f579080610b469285969760c09692610d045750508160011b916000199060031b1c19161790565b600f555b015180519092906001600160401b038111610cf057610b6a6010546119ae565b601f8111610c97575b506020601f8211600114610c345781908495610ba4949592610c295750508160011b916000199060031b1c19161790565b6010555b60138054610100600160a81b03191660089290921b610100600160a81b03169190911790554262015180810191908210610c1557506015556101005151612de29081611bed8239608051816123ea015260a05181611fa0015260c05181611ef2015260e051816106770152f35b634e487b7160e01b81526011600452602490fd5b0151905085806106c1565b6010845280842090601f198316855b818110610c7f57509583600195969710610c66575b505050811b01601055610ba8565b015160001960f88460031b161c19169055848080610c58565b9192602060018192868b015181550194019201610c43565b60108452610ce0907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672601f840160051c81019160208510610ce6575b601f0160051c01906119e8565b84610b73565b9091508190610cd3565b634e487b7160e01b83526041600452602483fd5b0151905087806106c1565b600f845280842095601f198316855b818110610d5f57509160c095969791846001959410610d46575b505050811b01600f55610b4a565b015160001960f88460031b161c19169055868080610d38565b83830151895560019098019760209384019301610d1e565b600f8452610dbf907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f840160051c81019160208510610ce657601f0160051c01906119e8565b85610b12565b600d85528185209190601f198416865b818110610e125750908460019594939210610df9575b505050811b01600d55610aaf565b015160001960f88460031b161c19169055868080610deb565b92936020600181928786015181550195019301610dd5565b600d8552610e72907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5601f850160051c81019160208610610ce657601f0160051c01906119e8565b86610a7b565b634e487b7160e01b84526041600452602484fd5b80518051906001600160401b038211610f6757610ead8261069586546119ae565b602090601f8311600114610efe5792610ee4836001959460209487968d92610ef35750508160011b916000199060031b1c19161790565b85555b01920192019190610a43565b015190508e806106c1565b8489528189209190601f1984168a5b818110610f4f5750936020936001969387969383889510610f36575b505050811b018555610ee7565b015160001960f88460031b161c191690558d8080610f29565b92936020600181928786015181550195019301610f0d565b634e487b7160e01b88526041600452602488fd5b600c85527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79081019083015b818110610fb45750610a16565b80610fc1600192546119ae565b80610fce575b5001610fa7565b601f81118314610fe357508681555b89610fc7565b81885260208820610ffe91601f0160051c81019084016119e8565b808752866020812081835555610fdd565b0151905088806106c1565b600a85528185209190601f198416865b81811061106a5750916001939185602097969410611051575b505050811b01600a556109d2565b015160001960f88460031b161c19169055878080611043565b9293602060018192878601518155019501930161102a565b600a85526110ca907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f850160051c81019160208610610ce657601f0160051c01906119e8565b8661099a565b634e487b7160e01b600052602160045260246000fd5b0151905089806106c1565b90601f198316916004600052816000209260005b818110611145575091600193918560409796941061112c575b505050811b01600455610924565b015160001960f88460031b161c1916905588808061111e565b92936020600181928786015181550195019301611105565b60046000526111a6907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610ce657601f0160051c01906119e8565b876108eb565b015190508a806106c1565b90601f198316916003600052816000209260005b81811061120b57509160019391856020979694106111f2575b505050811b016003556108c4565b015160001960f88460031b161c191690558980806111e4565b929360206001819287860151815501950193016111cb565b600360005261126c907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c81019160208610610ce657601f0160051c01906119e8565b8861088b565b90601f198316916002600052816000209260005b8181106112c357509084600195949392106112aa575b505050811b0160025561085f565b015160001960f88460031b161c1916905587808061129c565b92936020600181928786015181550195019301611286565b6002600052611324907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f850160051c81019160208610610ce657601f0160051c01906119e8565b8761082a565b90601f198316916001600052816000209260005b81811061137e5750916001939185602097969410611365575b505050811b01600155610803565b015160001960f88460031b161c19169055898080611357565b9293602060018192878601518155019501930161133e565b60016000526113df907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c81019160208610610ce657601f0160051c01906119e8565b886107ca565b90506020813d60201161141c575b8161140060209383611831565b810103126114175761141190611941565b386105d3565b600080fd5b3d91506113f3565b61010051513d6000823e3d90fd5b82516001600160401b031681526020928301926001929092019101610551565b9091929460208061146f60019360df198b82030186528951611989565b97019201920190929161053d565b8088602080938601015201610467565b6307456b9160e21b60005260046000fd5b3d8083833e6114ad8183611831565b60208282810103126116d65781516001600160401b0381116116cd578201610100518183850103126116cd576101005151936114e8856117fb565b81516001600160401b0381116116d257820160e08185870103126116d25761010051519061151582611816565b61151e81611941565b825261152c60208201611941565b602083015261153f610100518201611941565b61010051830152606081015160038110156116cd57606083015260808101516001600160401b0381116116cd5761159d9161158160c092888a01908301611877565b608085015261159260a08201611941565b60a085015201611941565b60c082015285526020820151906001600160401b0382116116cf57838501601f8385010112156116cf5781830151926115d584611955565b956115e561010051519788611831565b848752602087019386820160208760051b8386010101116116cd57602081840101945b60208760051b8386010101861061163357505050505060208501939093525061040c91506103fb9050565b85516001600160401b0381116116c957610100518584018201858b0103601f1901126116c957610100515190611668826117fb565b8584018101602001516001600160401b0381116116c5576116959060208c88019184888b01010101611877565b8252610100519084870101015160038110156116c1576020828101919091529082529586019501611608565b8680fd5b8780fd5b8580fd5b835b80fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103d8565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116114175782016040818503601f1901126114175760405191611778836117fb565b6020820151926001600160401b038411611417576040836117a0886020809881980101611877565b83520151838201528152019401936102db565b81516001600160401b038111611417576020916117d58d848094880101611877565b8152019101906101e0565b608081019081106001600160401b0382111761075e57604052565b604081019081106001600160401b0382111761075e57604052565b60e081019081106001600160401b0382111761075e57604052565b601f909101601f19168101906001600160401b0382119082101761075e57604052565b60005b8381106118675750506000910152565b8181015183820152602001611857565b81601f820112156114175780516020909101906001600160401b03811161075e57604051926118b0601f8301601f191660200185611831565b81845281830111611417576118c9916020840190611854565b90565b919060408382031261141757604051906118e5826117fb565b8351919384926001600160401b0381116114175782611905918301611877565b83526020810151916001600160401b038311611417576020926119289201611877565b910152565b51906001600160a01b038216820361141757565b51906001600160401b038216820361141757565b6001600160401b03811161075e5760051b60200190565b8051156107745760200190565b8051600110156107745760400190565b906020916119a281518092818552858086019101611854565b601f01601f1916010190565b90600182811c921680156119de575b60208310146119c857565b634e487b7160e01b600052602260045260246000fd5b91607f16916119bd565b8181106119f3575050565b600081556001016119e8565b9190601f8111611a0e57505050565b611a39926000526020600020906020601f840160051c83019310610ce657601f0160051c01906119e8565b565b90600061060f60f31b61ffff60f01b602085015116148060011b9080820460021490151715611a9c576028019081602811610c1557508103611a92576000611a8292611ab0565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611b44576000948101809111611b66579192905b818310611b005750505060019190565b9092919360ff611b1a8160f81b6020888601015116611b7a565b16600f8111611b5a578160041b9180830460101490151715611b4457600191019401919290611af0565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f811180611be2575b15611b9657602f190160ff1690565b6060811180611bd8575b15611baf576056190160ff1690565b6040811180611bce575b15611bc8576036190160ff1690565b5060ff90565b5060478110611bb9565b5060678110611ba0565b50603a8110611b8756fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100d7578063229e81fb146100d257806342859ab3146100cd5780635a509280146100c857806362b61c8b146100c357806378b90337146100be578063819ef8ba146100b957806388328a69146100b4578063b3d7ad48146100af578063cad31c74146100aa578063cbe61e59146100a55763d47e4eeb146100a057600080fd5b61112d565b611105565b61104b565b610f1c565b610e12565b610d07565b610a3c565b6109c2565b6108a9565b6104c9565b61042e565b6100ec565b60009103126100e757565b600080fd5b346100e75760006003193601126100e757602060ff601354166040519015158152f35b90600182811c92168015610158575b602083101461012957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161011e565b600092918154916101728361010f565b80835292600181169081156101c8575060011461018e57505050565b60009081526020812093945091925b8383106101ae575060209250010190565b60018160209294939454838587010152019101919061019d565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761024f57604052565b610204565b60a0810190811067ffffffffffffffff82111761024f57604052565b6080810190811067ffffffffffffffff82111761024f57604052565b60e0810190811067ffffffffffffffff82111761024f57604052565b6060810190811067ffffffffffffffff82111761024f57604052565b6020810190811067ffffffffffffffff82111761024f57604052565b90601f601f19910116810190811067ffffffffffffffff82111761024f57604052565b6040519061031d8261031681600f610162565b03836102e0565b565b6040519061031d82610316816010610162565b6040519061033f82610233565b8160405161035981610352816003610162565b03826102e0565b815260206040519161037783610370816004610162565b03846102e0565b0152565b60005b83811061038e5750506000910152565b818101518382015260200161037e565b90601f19601f6020936103bc8151809281875287808801910161037b565b0116010190565b6103ed9160206103dc835160408452604084019061039e565b92015190602081840391015261039e565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561042957565b6103f0565b346100e75760006003193601126100e75760405161044b81610233565b60405161045d81610352816001610162565b815260405161047181610352816002610162565b602082015261047e610332565b60ff60055416906104af600654916104a1604051956080875260808701906103c3565b9085820360208701526103c3565b906004831015610429578392604084015260608301520390f35b346100e75760a06003193601126100e7576004356024359060643591608435916013546105296105108273ffffffffffffffffffffffffffffffffffffffff9060081c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036108025760ff166107d857610545610541611e75565b1590565b6107ae5761058c600093610557611149565b9060405196879586957f62b61c8b00000000000000000000000000000000000000000000000000000000875260048701611294565b0381305afa90811561072857600090600092610786575b506105ad90611363565b61060a60206040516105d7816105c98685830160209181520190565b03601f1981018352826102e0565b604051809381927fcad31c740000000000000000000000000000000000000000000000000000000083526004830161156d565b03816000305af180156107285761065591600091610757575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601354169115151617601355565b60135460ff1661072d575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100e7576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107285761070d575b5060135460ff16604080519115158252602082019290925290819081015b0390f35b8061071c6000610722936102e0565b806100dc565b386106eb565b611305565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a1610660565b610779915060203d60201161077f575b61077181836102e0565b810190611487565b38610623565b503d610767565b6105ad92506107a891503d806000833e6107a081836102e0565b810190611224565b916105a3565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100e75790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a060806108a06060850151838386015260c085019061039e565b93015191015290565b346100e75760206003193601126100e75760043567ffffffffffffffff81116100e7576108dd61070991369060040161082c565b6108e561169d565b5073ffffffffffffffffffffffffffffffffffffffff600054169061095f6040820135610911816116c8565b73ffffffffffffffffffffffffffffffffffffffff602084013561093b85359560608101906116f0565b9290936040519761094b89610254565b885216602087015260408601523691611741565b606083015260808201526040519182918261083a565b9181601f840112156100e75782359167ffffffffffffffff83116100e7576020808501948460051b0101116100e757565b9291906109bd60209160408652604086019061039e565b930152565b346100e75760c06003193601126100e75760243560043560643560443560843567ffffffffffffffff81116100e7576109ff903690600401610975565b92909160a4359567ffffffffffffffff87116100e757610a26610a2c97369060040161082c565b956118cb565b90610709604051928392836109a6565b346100e75760006003193601126100e7576020610a57611e75565b6040519015158152f35b600a5460009291610a718261010f565b8082529160018116908115610ae65750600114610a8c575050565b600a60009081529293509091907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b838310610acc575060209250010190565b600181602092949394548385870101520191019190610abb565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040519061031d8261031681600d610162565b67ffffffffffffffff811161024f5760051b60200190565b600c5490610b5882610b33565b91610b6660405193846102e0565b808352600c60009081527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7602085015b838310610ba35750505050565b600160208192604051610bba816103528189610162565b815201920192019190610b96565b9080602083519182815201916020808360051b8301019401926000915b838310610bf457505050505090565b9091929394602080610c1283601f198660019603018752895161039e565b97019301930191939290610be5565b610c7260606103ed9493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c083019061039e565b90602081830391015267ffffffffffffffff825116815260c0610cf6610cbc610caa602086015160e0602087015260e0860190610bc8565b6040860151858203604087015261039e565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a086015261039e565b9201519060c081840391015261039e565b346100e75760006003193601126100e757604051610d2481610270565b6007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff600954166040820152604051610d5f8161035281610a61565b606082015260405190610d718261028c565b67ffffffffffffffff600b54168252610d88610b4b565b6020830152610d95610b20565b6040830152610de9610dd8600e54610dc8610db78267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610df1610303565b60a0830152610dfe61031f565b60c083015261070960405192839283610c21565b346100e75760006003193601126100e75760ff60135416156107d8576040516000601454610e3f8161010f565b8084529060018116908115610eda5750600114610e7b575b61070983610e67818503826102e0565b60405191829160208352602083019061039e565b601460009081527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec939250905b808210610ec057509091508101602001610e67610e57565b919260018160209254838588010152019101909291610ea8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610e679050610e57565b346100e75760006003193601126100e757610f3561169d565b506040517f5a5092800000000000000000000000000000000000000000000000000000000081526020600482015260008180610f7360248201611255565b0381305afa90811561072857600091610f95575b60405180610709848261083a565b3d8083833e610fa481836102e0565b8101906020818303126110435780519067ffffffffffffffff8211611047570160a0818303126110435760405191610fdb83610254565b8151610fe6816116c8565b83526020820151610ff6816116c8565b602084015260408201516040840152606082015167ffffffffffffffff811161103f579361102c8392610709966080950161120a565b6060850152500151608082015290610f87565b8480fd5b8280fd5b8380fd5b346100e75760606003193601126100e75760043567ffffffffffffffff81116100e75760e060031982360301126100e7576024359067ffffffffffffffff82116100e757366023830112156100e75781600401359167ffffffffffffffff83116100e75736602484830101116100e7576044359067ffffffffffffffff82116100e757610709936110f3936110e66024943690600401610975565b9490930190600401612345565b60405190151581529081906020820190565b346100e75760006003193601126100e757602067ffffffffffffffff60115416604051908152f35b346100e75760006003193601126100e757602060405160108152f35b604051906111586020836102e0565b600080835282815b82811061116c57505050565b806060602080938501015201611160565b604051610140919061118f83826102e0565b6009815291601f19018260005b8281106111a857505050565b80606060208093850101520161119c565b67ffffffffffffffff811161024f57601f01601f191660200190565b909291926111e2816111b9565b916111f060405193846102e0565b8294828452828201116100e757602061031d93019061037b565b9080601f830112156100e75781516103ed926020016111d5565b91906040838203126100e757825167ffffffffffffffff81116100e75760209161124f91850161120a565b92015190565b60806103ed916007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b92936080946112c3936103ed9793865260208601526040850152606084015260c08484015260c0830190610bc8565b9060a08183039101526007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b6040513d6000823e3d90fd5b601f821161131e57505050565b6000526020600020906020601f840160051c83019310611359575b601f0160051c01905b81811061134d575050565b60008155600101611342565b9091508190611339565b90815167ffffffffffffffff811161024f5761138b8161138460145461010f565b6014611311565b602092601f82116001146113ea576113da929382916000926113df575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601455565b0151905038806113a8565b6014600052601f198216937fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9160005b86811061146f5750836001959610611438575b505050811b01601455565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061142d565b9192602060018192868501518155019401920161141a565b908160209103126100e7575180151581036100e75790565b90806020835491828152019160208260051b820101936000526020600020926000915b8383106114d157505050505090565b9091929394602060016114ee83601f198684960301875289610162565b970193019301919392906114c2565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061152f57505050505090565b90919293946020600282601f19856001950301865260408152611555604082018a610162565b9083858b015491015297019301930191939290611520565b61168d6103ed92606083526115a060608401611592600b5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e0608084015261167f61164d6115f06115bf6101408701600c61149f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600d610162565b600e5467ffffffffffffffff811660c088015261161b9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600f610162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101208601526010610162565b90838203602085015261039e565b90604081830391015260126114fd565b604051906116aa82610254565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100e757565b356103ed816116c8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e7576020019181360383136100e757565b92919261174d826111b9565b9161175b60405193846102e0565b8294818452818301116100e7578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117b45760200190565b611778565b8051600110156117b45760400190565b8051600210156117b45760600190565b8051600310156117b45760800190565b8051600410156117b45760a00190565b8051600510156117b45760c00190565b8051600610156117b45760e00190565b8051600710156117b4576101000190565b8051600810156117b4576101200190565b80518210156117b45760209160051b010190565b92919261185b82610b33565b9361186960405195866102e0565b602085848152019260051b8201918183116100e75780935b83851061188f575050505050565b843567ffffffffffffffff81116100e757820183601f820112156100e7576020916118c08583858095359101611741565b815201940193611881565b959290919493946118da61117d565b966118e86020860135612454565b6118f1896117a7565b526118fb886117a7565b5061190590612b80565b61190e906124a6565b611917886117b9565b52611921876117b9565b5061192b90612b80565b611934906124a6565b61193d876117c9565b52611947866117c9565b5061195190612b80565b61195a906124a6565b611963866117d9565b5261196d856117d9565b5061197790612b80565b611980906124a6565b611989856117e9565b52611993846117e9565b506119a0604082016116e6565b6119a990612465565b6119b2856117f9565b526119bc846117f9565b506119c78135612454565b6119d085611809565b526119da84611809565b50606081016119e8916116f0565b36906119f392611741565b6119fc906124a6565b611a0584611819565b52611a0f83611819565b503690611a1b9261184f565b611a249061263a565b611a2d8261182a565b52611a378161182a565b50611a419061263a565b611a49612aa7565b611a52906124a6565b90611a5c91612755565b908151602083012090565b67ffffffffffffffff8116036100e757565b9080601f830112156100e757815191611a9183610b33565b92611a9f60405194856102e0565b80845260208085019160051b830101918383116100e75760208101915b838310611acb57505050505090565b825167ffffffffffffffff81116100e7578201906060601f1983880301126100e75760405191611afa836102a8565b6020810151611b0881611a67565b835260408101519067ffffffffffffffff82116100e757611b3088602060609484010161120a565b602085015201519060038210156100e7578260209392604085940152815201920191611abc565b91906060838203126100e75760405190611b70826102a8565b81938051611b7d81611a67565b8352602081015167ffffffffffffffff81116100e75782611b9f91830161120a565b602084015260408101519167ffffffffffffffff83116100e757604092611bc6920161120a565b910152565b6020818303126100e75780519067ffffffffffffffff82116100e75701906020828203126100e75760405191611c00836102c4565b80519067ffffffffffffffff82116100e757016060818303126100e75760405191611c2a836102a8565b815167ffffffffffffffff81116100e75782016080818303126100e75760405190611c5482610270565b8051611c5f81611a67565b82526020810151611c6f816116c8565b6020830152604081015167ffffffffffffffff81116100e757810183601f820112156100e75783816020611ca5935191016111d5565b604083015260608101519067ffffffffffffffff82116100e757611ccb9184910161120a565b60608201528352602082015167ffffffffffffffff81116100e75781611cf2918401611a79565b6020840152604082015167ffffffffffffffff81116100e757611d159201611b57565b6040820152815290565b6020818303126100e75780519067ffffffffffffffff82116100e757019080601f830112156100e7578151611d5381610b33565b92611d6160405194856102e0565b81845260208085019260051b8201019283116100e757602001905b828210611d895750505090565b8151815260209182019101611d7c565b8091039060c082126100e75760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611dd886610270565b8351611de381611a67565b86526020840151611df381611a67565b60208701526040840151611e0681611a67565b60408701520112611e4b5760a09060405192611e21846102a8565b6060820151611e2f81611a67565b8452608082015160208501525001516040820152606082015290565b5080fd5b6103ed9060408152611e65604082016001610162565b9060208183039101526002610162565b601554421161209f57611ed96000611e9660115467ffffffffffffffff1690565b6040517f012d56e000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156107285760409160009161207c575b50510151805167ffffffffffffffff1615612076576020611f5191015160208082518301019101611d1f565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611f8760048201611e4f565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610728576103ed9261203b92600092612041575b5080612003611ff3611fec612008946117a7565b51926117b9565b5191662386f26fc100009061282a565b61283d565b6120356120286040806060860151015194015167ffffffffffffffff1690565b67ffffffffffffffff1690565b916128be565b90612928565b6120089192506120689060c03d60c01161206f575b61206081836102e0565b810190611d99565b9190611fd8565b503d612056565b50600090565b61209991503d806000833e61209181836102e0565b810190611bcb565b38611f25565b600090565b356103ed81611a67565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e757602001918160051b360383136100e757565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100e757016020813591019167ffffffffffffffff82116100e75781360383136100e757565b90602083828152019160208260051b8501019381936000915b84831061219c5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100e7576020809187600194019082806122016121f38580612123565b604086526040860191612102565b930135910152980193019301919493929061218c565b9060028210156104295752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff61225495941681528160208201520191612102565b938d6040818703910152808552602085019460208260051b82010195836000925b84841061230d57505050505050946122d78c9d60a06122c661031d9e9f986101209e9c986122b86123049f9d996122e8996122f59e8e6060818503910152612102565b918b830360808d0152612173565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152612102565b91878303610100890152612102565b93016001612217565b90919293949760208061233583601f19866001960301885261232f8d88612123565b90612102565b9a01940194019294939190612275565b9092939193612353826120a4565b9261236160208401846120ae565b93909261237160408301836116f0565b91909360608401612381906120a4565b9161238e608086016120a4565b9361239c60a08701876116f0565b97909660c081016123ac916116f0565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e6123e69f612224565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107285760009161243b575090565b6103ed915060203d60201161077f5761077181836102e0565b6124606103ed91612b80565b6124a6565b6103ed906040519074140000000000000000000000000000000000000000186014820152603481016040526124a6565b9081518110156117b4570160200190565b60008151600181149081612622575b50156124bf575090565b815190603882101561251a57906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560806124ff612a0b565b94612c1b565b60f81b16901a612514826117a7565b53612755565b6001939092835b61252b868561283d565b156125485761253c61254291612a7a565b95612813565b94612521565b9092945092909261256061255b82612bff565b612a49565b917fff00000000000000000000000000000000000000000000000000000000000000612595612590608085612c1b565b612c0d565b60f81b16811a6125a4846117a7565b5360015b828111156125be575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661261d96896128b1565b612c28565b8b61283d565b60ff1690565b60f81b16831a6126178287612495565b53612a7a565b6125a8565b9050156117b4576080602083015160f81c10386124b5565b61264390612cc2565b80516000603882101561268457906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560c06124ff612a0b565b6001939092835b612695868561283d565b156126ac5761253c6126a691612a7a565b9461268b565b909294509290926126bf61255b82612bff565b917fff000000000000000000000000000000000000000000000000000000000000006126ef61259060c085612c1b565b60f81b16811a6126fe846117a7565b5360015b82811115612718575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661275096896128b1565b612702565b90604051918051908184526020840191840192602084019260208301905b8481106127c15750508051809386518201875294019360208086019201905b8281106127b15750509051603f92011590920101601f19166040525090565b8151815260209182019101612792565b8151815260209182019101612773565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b604d811161280e57600a0a90565b6127d1565b908160081b91808304610100149015171561280e57565b8181029291811591840414171561280e57565b8115612847570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b602003906020821161280e57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161280e57565b9190820391821161280e57565b90929190601082111561292057815b82039082821161280e576128e36128e992612800565b9061282a565b927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0820191821161280e576128e36103ed92612800565b6010916128cd565b60ff60055416916129388361041f565b6001831492836129db575b83156129b8575b8315612994575b8315612969575b50505061296457600090565b600190565b6002919293506129788161041f565b14918261298a575b5050388080612958565b1090503880612980565b925061299f8361041f565b60038314806129af575b92612951565b508082116129a9565b92506129c38361041f565b8215806129d1575b9261294a565b50808211156129cb565b818310159350612943565b604080519091906129f783826102e0565b60208152918290601f190190369060200137565b60408051909190612a1c83826102e0565b6001815291601f1901366020840137565b60405190612a3c6020836102e0565b6000808352366020840137565b90612a53826111b9565b612a6060405191826102e0565b828152601f19612a7082946111b9565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461280e5760010190565b612aaf6129e6565b90600260208301526000915b60208310612b37575b612ad061255b84612876565b9060005b8251811015612b3057600190612b1c612af6612aef88612a7a565b9785612495565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612b298286612495565b5301612ad4565b5090925050565b91612b6d612b48612af68386612495565b7fff000000000000000000000000000000000000000000000000000000000000001690565b612b7a5760010191612abb565b91612ac4565b90612b896129e6565b9160208301526000915b60208310612bdb575b612ba861255b84612876565b9060005b8251811015612b3057600190612bc7612af6612aef88612a7a565b60001a612bd48286612495565b5301612bac565b91612bec612b48612af68386612495565b612bf95760010191612b93565b91612b9c565b906001820180921161280e57565b906037820180921161280e57565b9190820180921161280e57565b601f811161280e576101000a90565b15612c3e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b90815115612d6657600091825b8151841015612d0e57612d06600191612cf4612ceb878661183b565b51511515612c37565b612cfe868561183b565b515190612c1b565b930192612ccf565b612d1a91929350612a49565b9060208201926000935b8251851015612d5f57612d57600191612d4d612d40888761183b565b5160208151910183612d70565b612cfe878661183b565b940193612d24565b5092505090565b90506103ed612a2d565b915b6020811015612da5576020036020811161280e57612d92612d9791612c28565b612884565b905182518216911916179052565b9091825181526020810180911161280e57916020810180911161280e5790601f19810190811115612d72576127d156fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xdba8408ef5cb6ab6fcfa274ba815eb2a4740165b", + "initCode": "0x60a034607357601f61582c38819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b03811690819003607357600160005560805260405161579d908161008f823960805181818160b001526103c90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780637fddd6021461004d5763b60bda491461004857600080fd5b6101e9565b610128565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761019a60209161018461019260243560405192839187830195869091604092825260208201520190565b03601f1981018352826102d6565b519020610b0d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357608060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff8211610083576102a39261026261027c9336906004016101b8565b9061026b6100e4565b9260843594600401906004016102fe565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176102f957604052565b6102a7565b9293949190916002600054146105d957600260005560405161033481610184602082019432869091604092825260208201520190565b5190209461035661034f876000526001602052604060002090565b5460ff1690565b6105af5761018461040b936103fb6104179661018461041196328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36149cf966103a660208901610603565b97808952610dc260208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109e7565b6040519485936020850190610ad6565b90610ad6565b83610ca3565b9161042181610b0d565b73ffffffffffffffffffffffffffffffffffffffff8416801591821561058e575b505061056157813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af190811561055c576104f0926104c592610541575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907ffb2d8b84e2e1acdcdbad3ce10c5a03d9f07b3f9f2e4a6d818a1a6a43610ac3b990602090a29061053f6001600055565b565b806105506000610556936102d6565b806100d9565b386104b4565b610b01565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff16141590503880610442565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b9061053f60405192836102d6565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b6106ef916106e16106d66106c88480610643565b604085526040850191610693565b926020810190610643565b916020818503910152610693565b90565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107b45750505050505090565b9091929394956020806107dc83601f1986600196030188526107d68b88610643565b90610693565b98019401940192949391906107a4565b6106ef9167ffffffffffffffff61080283610724565b1681526108b06108a561084a61082f61081e6020870187610739565b60e0602088015260e087019161078c565b61083c6040870187610643565b908683036040880152610693565b61086a61085960608701610724565b67ffffffffffffffff166060860152565b61088a61087960808701610724565b67ffffffffffffffff166080860152565b61089760a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761095e610953610942846106ef960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff61093260408301610107565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106f2565b9060208184039101526107ec565b90602083828152019260208260051b82010193836000925b8484106109945750505050505090565b90919293949560208082601f1985600195030187526109b38a87610611565b9082806109d16109c38580610643565b604086526040860191610693565b9301359101529801940194019294939190610984565b91909496959360a08352610a4f610a13610a018880610611565b608060a08701526101208601906106b4565b610a206020890189610611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608683030160c08701526106b4565b93604087013591600483101561008357610a8d608096610aba95606061053f9b610a9b9760e08b0152013561010089015287820360208901526108be565b91858303604087015261096c565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610aee575050016000815290565b8060208092840101518185015201610add565b6040513d6000823e3d90fd5b610c4a73ffffffffffffffffffffffffffffffffffffffff806106ef9360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b986075826102d6565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c2e816017840103601f1981018352826102d6565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c9e573d9067ffffffffffffffff82116102f95760405191610c92601f8201601f1916602001846102d6565b82523d6000602084013e565b606090565b919060405192610cb46040856102d6565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610ce781610b0d565b93843b610d97576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d6d5781600092918360208194519301915af1610d2b610c63565b50158015610d64575b610d3a57565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d34565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe6101208060405234611417576149cf803803809161001d8285611831565b8339810160a0828203126114175781516001600160401b038111611417578201916080838303126114175760405192610055846117e0565b80516001600160401b03811161141757836100719183016118cc565b845260208101516001600160401b03811161141757836100929183016118cc565b6020850152604081015190600482101561141757606091604086015201519060608401918252602081015160018060401b0381116114175781019160408385031261141757604051926100e4846117fb565b80516001600160401b038111611417578101608081870312611417576040519061010d826117e0565b80518252602081015160208301526101276040820161192d565b60408301526060810151906001600160401b0382116114175761014c91889101611877565b606082015284526020810151906001600160401b038211611417570160e081860312611417576040519061017f82611816565b61018881611941565b825260208101516001600160401b03811161141757810186601f820112156114175780516101b581611955565b916101c36040519384611831565b81835260208084019260051b820101918983116114175760208201905b8382106117b35750505050602083015260408101516001600160401b038111611417578661020f918301611877565b604083015261022060608201611941565b606083015261023160808201611941565b608083015260a08101516001600160401b0381116114175786610255918301611877565b60a083015260c0810151906001600160401b0382116114175761027a91879101611877565b60c0820152602084015260408201516001600160401b03811161141757820184601f82011215611417578051906102b082611955565b956102be6040519788611831565b82875260208088019360051b830101918183116114175760208101935b83851061174b5750505050506102ff60806102f86060850161192d565b930161192d565b602084015184519194916001600160a01b0385161561173a576001600160a01b038616156117295760a082015151156117185760c0820151511561170757604001516001600160a01b0316156116f65761090060805260406101008190528051919061036b9083611831565b600182526020820191601f196101005101368437600161038a8261196c565b52608051915161010080515163338c1f5160e01b81526001600160401b03909216600483015251602482015290516044820181905290926001600160a01b0390921691839160648301919060005b8181106116da5750505091818060009403915afa9081156114245760009161149e575b5061040c602061041692015161196c565b5151805190611a3b565b901561148d57600080546001600160a01b0319166001600160a01b039290921691909117905561090260a05261090360c05261010051516060949061045b8682611831565b60028152601f19860160005b81811061147d57505060208801515161047f8261196c565b526104898161196c565b50602080890151015161049b82611979565b526104a581611979565b506101005151906104b5826117fb565b600182526064602083015284516101005151908882016001600160401b0381118382101761075e57610100515281526020810191825261010051810192835260018060a01b0360c051169261010051519260208085015260c08401925161010051850152519160808a850152825180915260e0840190602060e08260051b8701019401916000905b828210611452575050505051608083016000905b6002821061143257505050600092826105786020946105c09403601f198101835282611831565b6101005151948580948193630b1e6daf60e31b835261010051600484015260096044840152681c1c9a58d95c1c995960ba1b6064840152608060248401526084830190611989565b03925af1908115611424576000916113e5575b50601180546001600160401b0319166001600160401b03929092169190911790556001600160a01b031660e05260005b855181101561079e576000865182101561078a575060208160051b870101516012546801000000000000000081101561075e5760018101806012558110156107745760126000528151805160019290921b7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444019291906001600160401b03821161075e5761069b8261069586546119ae565b866119ff565b602090601f83116001146106ef57926106d68360019796959460209489966000926106e4575b50508160011b916000199060031b1c19161790565b84555b015191015501610603565b0151905038806106c1565b90601f1983169185600052816000209260005b8181106107465750936020936001989796938996938388951061072d575b505050811b0184556106d9565b015160001960f88460031b161c19169055388080610720565b92936020600181928786015181550195019301610702565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b508551805180518892916001600160401b03821161075e576107c16001546119ae565b601f8111611396575b50602090601f831160011461132a5791806107ff92602095946000926111ac5750508160011b916000199060031b1c19161790565b6001555b01518051906001600160401b03821161075e576108216002546119ae565b601f81116112db575b50602090601f83116001146112725761085b92916000918361100f5750508160011b916000199060031b1c19161790565b6002555b602081015180518051906001600160401b03821161075e576108826003546119ae565b601f8111611223575b50602090601f83116001146111b75791806108c092602095946000926111ac5750508160011b916000199060031b1c19161790565b6003555b01518051906001600160401b03821161075e576108e26004546119ae565b601f811161115d575b50602090601f83116001146110f157918061092092604095946000926110e65750508160011b916000199060031b1c19161790565b6004555b01519160048310156110d05760009260ff801960055416911617600555516006558381518051600755602081015160085560018060a01b03610100518201511660018060a01b03196009541617600955015180519060018060401b038211610e7857610991600a546119ae565b601f8111611082575b50602090601f831160011461101a5791806109ce9260209594879261100f5750508160011b916000199060031b1c19161790565b600a555b01519260018060401b0384511660018060401b0319600b541617600b556020840151805190680100000000000000008211610e7857600c5482600c55808310610f7b575b50600c845283907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7906020015b838310610e8c575050610100518601518051925090506001600160401b038211610e7857610a72600d546119ae565b601f8111610e2a575b50602090601f8311600114610dc557610aab9291859183610d045750508160011b916000199060031b1c19161790565b600d555b830151600e80546080860151610100516001600160801b03199092166001600160401b0394851617911b6fffffffffffffffff00000000000000001617905560a084015180519094918111610cf057610b09600f546119ae565b601f8111610d77575b506020601f8211600114610d0f579080610b469285969760c09692610d045750508160011b916000199060031b1c19161790565b600f555b015180519092906001600160401b038111610cf057610b6a6010546119ae565b601f8111610c97575b506020601f8211600114610c345781908495610ba4949592610c295750508160011b916000199060031b1c19161790565b6010555b60138054610100600160a81b03191660089290921b610100600160a81b03169190911790554262015180810191908210610c1557506015556101005151612de29081611bed8239608051816123ea015260a05181611fa0015260c05181611ef2015260e051816106770152f35b634e487b7160e01b81526011600452602490fd5b0151905085806106c1565b6010845280842090601f198316855b818110610c7f57509583600195969710610c66575b505050811b01601055610ba8565b015160001960f88460031b161c19169055848080610c58565b9192602060018192868b015181550194019201610c43565b60108452610ce0907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672601f840160051c81019160208510610ce6575b601f0160051c01906119e8565b84610b73565b9091508190610cd3565b634e487b7160e01b83526041600452602483fd5b0151905087806106c1565b600f845280842095601f198316855b818110610d5f57509160c095969791846001959410610d46575b505050811b01600f55610b4a565b015160001960f88460031b161c19169055868080610d38565b83830151895560019098019760209384019301610d1e565b600f8452610dbf907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f840160051c81019160208510610ce657601f0160051c01906119e8565b85610b12565b600d85528185209190601f198416865b818110610e125750908460019594939210610df9575b505050811b01600d55610aaf565b015160001960f88460031b161c19169055868080610deb565b92936020600181928786015181550195019301610dd5565b600d8552610e72907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5601f850160051c81019160208610610ce657601f0160051c01906119e8565b86610a7b565b634e487b7160e01b84526041600452602484fd5b80518051906001600160401b038211610f6757610ead8261069586546119ae565b602090601f8311600114610efe5792610ee4836001959460209487968d92610ef35750508160011b916000199060031b1c19161790565b85555b01920192019190610a43565b015190508e806106c1565b8489528189209190601f1984168a5b818110610f4f5750936020936001969387969383889510610f36575b505050811b018555610ee7565b015160001960f88460031b161c191690558d8080610f29565b92936020600181928786015181550195019301610f0d565b634e487b7160e01b88526041600452602488fd5b600c85527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79081019083015b818110610fb45750610a16565b80610fc1600192546119ae565b80610fce575b5001610fa7565b601f81118314610fe357508681555b89610fc7565b81885260208820610ffe91601f0160051c81019084016119e8565b808752866020812081835555610fdd565b0151905088806106c1565b600a85528185209190601f198416865b81811061106a5750916001939185602097969410611051575b505050811b01600a556109d2565b015160001960f88460031b161c19169055878080611043565b9293602060018192878601518155019501930161102a565b600a85526110ca907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f850160051c81019160208610610ce657601f0160051c01906119e8565b8661099a565b634e487b7160e01b600052602160045260246000fd5b0151905089806106c1565b90601f198316916004600052816000209260005b818110611145575091600193918560409796941061112c575b505050811b01600455610924565b015160001960f88460031b161c1916905588808061111e565b92936020600181928786015181550195019301611105565b60046000526111a6907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610ce657601f0160051c01906119e8565b876108eb565b015190508a806106c1565b90601f198316916003600052816000209260005b81811061120b57509160019391856020979694106111f2575b505050811b016003556108c4565b015160001960f88460031b161c191690558980806111e4565b929360206001819287860151815501950193016111cb565b600360005261126c907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c81019160208610610ce657601f0160051c01906119e8565b8861088b565b90601f198316916002600052816000209260005b8181106112c357509084600195949392106112aa575b505050811b0160025561085f565b015160001960f88460031b161c1916905587808061129c565b92936020600181928786015181550195019301611286565b6002600052611324907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f850160051c81019160208610610ce657601f0160051c01906119e8565b8761082a565b90601f198316916001600052816000209260005b81811061137e5750916001939185602097969410611365575b505050811b01600155610803565b015160001960f88460031b161c19169055898080611357565b9293602060018192878601518155019501930161133e565b60016000526113df907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c81019160208610610ce657601f0160051c01906119e8565b886107ca565b90506020813d60201161141c575b8161140060209383611831565b810103126114175761141190611941565b386105d3565b600080fd5b3d91506113f3565b61010051513d6000823e3d90fd5b82516001600160401b031681526020928301926001929092019101610551565b9091929460208061146f60019360df198b82030186528951611989565b97019201920190929161053d565b8088602080938601015201610467565b6307456b9160e21b60005260046000fd5b3d8083833e6114ad8183611831565b60208282810103126116d65781516001600160401b0381116116cd578201610100518183850103126116cd576101005151936114e8856117fb565b81516001600160401b0381116116d257820160e08185870103126116d25761010051519061151582611816565b61151e81611941565b825261152c60208201611941565b602083015261153f610100518201611941565b61010051830152606081015160038110156116cd57606083015260808101516001600160401b0381116116cd5761159d9161158160c092888a01908301611877565b608085015261159260a08201611941565b60a085015201611941565b60c082015285526020820151906001600160401b0382116116cf57838501601f8385010112156116cf5781830151926115d584611955565b956115e561010051519788611831565b848752602087019386820160208760051b8386010101116116cd57602081840101945b60208760051b8386010101861061163357505050505060208501939093525061040c91506103fb9050565b85516001600160401b0381116116c957610100518584018201858b0103601f1901126116c957610100515190611668826117fb565b8584018101602001516001600160401b0381116116c5576116959060208c88019184888b01010101611877565b8252610100519084870101015160038110156116c1576020828101919091529082529586019501611608565b8680fd5b8780fd5b8580fd5b835b80fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103d8565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116114175782016040818503601f1901126114175760405191611778836117fb565b6020820151926001600160401b038411611417576040836117a0886020809881980101611877565b83520151838201528152019401936102db565b81516001600160401b038111611417576020916117d58d848094880101611877565b8152019101906101e0565b608081019081106001600160401b0382111761075e57604052565b604081019081106001600160401b0382111761075e57604052565b60e081019081106001600160401b0382111761075e57604052565b601f909101601f19168101906001600160401b0382119082101761075e57604052565b60005b8381106118675750506000910152565b8181015183820152602001611857565b81601f820112156114175780516020909101906001600160401b03811161075e57604051926118b0601f8301601f191660200185611831565b81845281830111611417576118c9916020840190611854565b90565b919060408382031261141757604051906118e5826117fb565b8351919384926001600160401b0381116114175782611905918301611877565b83526020810151916001600160401b038311611417576020926119289201611877565b910152565b51906001600160a01b038216820361141757565b51906001600160401b038216820361141757565b6001600160401b03811161075e5760051b60200190565b8051156107745760200190565b8051600110156107745760400190565b906020916119a281518092818552858086019101611854565b601f01601f1916010190565b90600182811c921680156119de575b60208310146119c857565b634e487b7160e01b600052602260045260246000fd5b91607f16916119bd565b8181106119f3575050565b600081556001016119e8565b9190601f8111611a0e57505050565b611a39926000526020600020906020601f840160051c83019310610ce657601f0160051c01906119e8565b565b90600061060f60f31b61ffff60f01b602085015116148060011b9080820460021490151715611a9c576028019081602811610c1557508103611a92576000611a8292611ab0565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611b44576000948101809111611b66579192905b818310611b005750505060019190565b9092919360ff611b1a8160f81b6020888601015116611b7a565b16600f8111611b5a578160041b9180830460101490151715611b4457600191019401919290611af0565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f811180611be2575b15611b9657602f190160ff1690565b6060811180611bd8575b15611baf576056190160ff1690565b6040811180611bce575b15611bc8576036190160ff1690565b5060ff90565b5060478110611bb9565b5060678110611ba0565b50603a8110611b8756fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100d7578063229e81fb146100d257806342859ab3146100cd5780635a509280146100c857806362b61c8b146100c357806378b90337146100be578063819ef8ba146100b957806388328a69146100b4578063b3d7ad48146100af578063cad31c74146100aa578063cbe61e59146100a55763d47e4eeb146100a057600080fd5b61112d565b611105565b61104b565b610f1c565b610e12565b610d07565b610a3c565b6109c2565b6108a9565b6104c9565b61042e565b6100ec565b60009103126100e757565b600080fd5b346100e75760006003193601126100e757602060ff601354166040519015158152f35b90600182811c92168015610158575b602083101461012957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161011e565b600092918154916101728361010f565b80835292600181169081156101c8575060011461018e57505050565b60009081526020812093945091925b8383106101ae575060209250010190565b60018160209294939454838587010152019101919061019d565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761024f57604052565b610204565b60a0810190811067ffffffffffffffff82111761024f57604052565b6080810190811067ffffffffffffffff82111761024f57604052565b60e0810190811067ffffffffffffffff82111761024f57604052565b6060810190811067ffffffffffffffff82111761024f57604052565b6020810190811067ffffffffffffffff82111761024f57604052565b90601f601f19910116810190811067ffffffffffffffff82111761024f57604052565b6040519061031d8261031681600f610162565b03836102e0565b565b6040519061031d82610316816010610162565b6040519061033f82610233565b8160405161035981610352816003610162565b03826102e0565b815260206040519161037783610370816004610162565b03846102e0565b0152565b60005b83811061038e5750506000910152565b818101518382015260200161037e565b90601f19601f6020936103bc8151809281875287808801910161037b565b0116010190565b6103ed9160206103dc835160408452604084019061039e565b92015190602081840391015261039e565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561042957565b6103f0565b346100e75760006003193601126100e75760405161044b81610233565b60405161045d81610352816001610162565b815260405161047181610352816002610162565b602082015261047e610332565b60ff60055416906104af600654916104a1604051956080875260808701906103c3565b9085820360208701526103c3565b906004831015610429578392604084015260608301520390f35b346100e75760a06003193601126100e7576004356024359060643591608435916013546105296105108273ffffffffffffffffffffffffffffffffffffffff9060081c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036108025760ff166107d857610545610541611e75565b1590565b6107ae5761058c600093610557611149565b9060405196879586957f62b61c8b00000000000000000000000000000000000000000000000000000000875260048701611294565b0381305afa90811561072857600090600092610786575b506105ad90611363565b61060a60206040516105d7816105c98685830160209181520190565b03601f1981018352826102e0565b604051809381927fcad31c740000000000000000000000000000000000000000000000000000000083526004830161156d565b03816000305af180156107285761065591600091610757575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601354169115151617601355565b60135460ff1661072d575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100e7576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107285761070d575b5060135460ff16604080519115158252602082019290925290819081015b0390f35b8061071c6000610722936102e0565b806100dc565b386106eb565b611305565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a1610660565b610779915060203d60201161077f575b61077181836102e0565b810190611487565b38610623565b503d610767565b6105ad92506107a891503d806000833e6107a081836102e0565b810190611224565b916105a3565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100e75790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a060806108a06060850151838386015260c085019061039e565b93015191015290565b346100e75760206003193601126100e75760043567ffffffffffffffff81116100e7576108dd61070991369060040161082c565b6108e561169d565b5073ffffffffffffffffffffffffffffffffffffffff600054169061095f6040820135610911816116c8565b73ffffffffffffffffffffffffffffffffffffffff602084013561093b85359560608101906116f0565b9290936040519761094b89610254565b885216602087015260408601523691611741565b606083015260808201526040519182918261083a565b9181601f840112156100e75782359167ffffffffffffffff83116100e7576020808501948460051b0101116100e757565b9291906109bd60209160408652604086019061039e565b930152565b346100e75760c06003193601126100e75760243560043560643560443560843567ffffffffffffffff81116100e7576109ff903690600401610975565b92909160a4359567ffffffffffffffff87116100e757610a26610a2c97369060040161082c565b956118cb565b90610709604051928392836109a6565b346100e75760006003193601126100e7576020610a57611e75565b6040519015158152f35b600a5460009291610a718261010f565b8082529160018116908115610ae65750600114610a8c575050565b600a60009081529293509091907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b838310610acc575060209250010190565b600181602092949394548385870101520191019190610abb565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040519061031d8261031681600d610162565b67ffffffffffffffff811161024f5760051b60200190565b600c5490610b5882610b33565b91610b6660405193846102e0565b808352600c60009081527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7602085015b838310610ba35750505050565b600160208192604051610bba816103528189610162565b815201920192019190610b96565b9080602083519182815201916020808360051b8301019401926000915b838310610bf457505050505090565b9091929394602080610c1283601f198660019603018752895161039e565b97019301930191939290610be5565b610c7260606103ed9493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c083019061039e565b90602081830391015267ffffffffffffffff825116815260c0610cf6610cbc610caa602086015160e0602087015260e0860190610bc8565b6040860151858203604087015261039e565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a086015261039e565b9201519060c081840391015261039e565b346100e75760006003193601126100e757604051610d2481610270565b6007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff600954166040820152604051610d5f8161035281610a61565b606082015260405190610d718261028c565b67ffffffffffffffff600b54168252610d88610b4b565b6020830152610d95610b20565b6040830152610de9610dd8600e54610dc8610db78267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610df1610303565b60a0830152610dfe61031f565b60c083015261070960405192839283610c21565b346100e75760006003193601126100e75760ff60135416156107d8576040516000601454610e3f8161010f565b8084529060018116908115610eda5750600114610e7b575b61070983610e67818503826102e0565b60405191829160208352602083019061039e565b601460009081527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec939250905b808210610ec057509091508101602001610e67610e57565b919260018160209254838588010152019101909291610ea8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610e679050610e57565b346100e75760006003193601126100e757610f3561169d565b506040517f5a5092800000000000000000000000000000000000000000000000000000000081526020600482015260008180610f7360248201611255565b0381305afa90811561072857600091610f95575b60405180610709848261083a565b3d8083833e610fa481836102e0565b8101906020818303126110435780519067ffffffffffffffff8211611047570160a0818303126110435760405191610fdb83610254565b8151610fe6816116c8565b83526020820151610ff6816116c8565b602084015260408201516040840152606082015167ffffffffffffffff811161103f579361102c8392610709966080950161120a565b6060850152500151608082015290610f87565b8480fd5b8280fd5b8380fd5b346100e75760606003193601126100e75760043567ffffffffffffffff81116100e75760e060031982360301126100e7576024359067ffffffffffffffff82116100e757366023830112156100e75781600401359167ffffffffffffffff83116100e75736602484830101116100e7576044359067ffffffffffffffff82116100e757610709936110f3936110e66024943690600401610975565b9490930190600401612345565b60405190151581529081906020820190565b346100e75760006003193601126100e757602067ffffffffffffffff60115416604051908152f35b346100e75760006003193601126100e757602060405160108152f35b604051906111586020836102e0565b600080835282815b82811061116c57505050565b806060602080938501015201611160565b604051610140919061118f83826102e0565b6009815291601f19018260005b8281106111a857505050565b80606060208093850101520161119c565b67ffffffffffffffff811161024f57601f01601f191660200190565b909291926111e2816111b9565b916111f060405193846102e0565b8294828452828201116100e757602061031d93019061037b565b9080601f830112156100e75781516103ed926020016111d5565b91906040838203126100e757825167ffffffffffffffff81116100e75760209161124f91850161120a565b92015190565b60806103ed916007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b92936080946112c3936103ed9793865260208601526040850152606084015260c08484015260c0830190610bc8565b9060a08183039101526007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b6040513d6000823e3d90fd5b601f821161131e57505050565b6000526020600020906020601f840160051c83019310611359575b601f0160051c01905b81811061134d575050565b60008155600101611342565b9091508190611339565b90815167ffffffffffffffff811161024f5761138b8161138460145461010f565b6014611311565b602092601f82116001146113ea576113da929382916000926113df575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601455565b0151905038806113a8565b6014600052601f198216937fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9160005b86811061146f5750836001959610611438575b505050811b01601455565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061142d565b9192602060018192868501518155019401920161141a565b908160209103126100e7575180151581036100e75790565b90806020835491828152019160208260051b820101936000526020600020926000915b8383106114d157505050505090565b9091929394602060016114ee83601f198684960301875289610162565b970193019301919392906114c2565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061152f57505050505090565b90919293946020600282601f19856001950301865260408152611555604082018a610162565b9083858b015491015297019301930191939290611520565b61168d6103ed92606083526115a060608401611592600b5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e0608084015261167f61164d6115f06115bf6101408701600c61149f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600d610162565b600e5467ffffffffffffffff811660c088015261161b9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600f610162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101208601526010610162565b90838203602085015261039e565b90604081830391015260126114fd565b604051906116aa82610254565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100e757565b356103ed816116c8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e7576020019181360383136100e757565b92919261174d826111b9565b9161175b60405193846102e0565b8294818452818301116100e7578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117b45760200190565b611778565b8051600110156117b45760400190565b8051600210156117b45760600190565b8051600310156117b45760800190565b8051600410156117b45760a00190565b8051600510156117b45760c00190565b8051600610156117b45760e00190565b8051600710156117b4576101000190565b8051600810156117b4576101200190565b80518210156117b45760209160051b010190565b92919261185b82610b33565b9361186960405195866102e0565b602085848152019260051b8201918183116100e75780935b83851061188f575050505050565b843567ffffffffffffffff81116100e757820183601f820112156100e7576020916118c08583858095359101611741565b815201940193611881565b959290919493946118da61117d565b966118e86020860135612454565b6118f1896117a7565b526118fb886117a7565b5061190590612b80565b61190e906124a6565b611917886117b9565b52611921876117b9565b5061192b90612b80565b611934906124a6565b61193d876117c9565b52611947866117c9565b5061195190612b80565b61195a906124a6565b611963866117d9565b5261196d856117d9565b5061197790612b80565b611980906124a6565b611989856117e9565b52611993846117e9565b506119a0604082016116e6565b6119a990612465565b6119b2856117f9565b526119bc846117f9565b506119c78135612454565b6119d085611809565b526119da84611809565b50606081016119e8916116f0565b36906119f392611741565b6119fc906124a6565b611a0584611819565b52611a0f83611819565b503690611a1b9261184f565b611a249061263a565b611a2d8261182a565b52611a378161182a565b50611a419061263a565b611a49612aa7565b611a52906124a6565b90611a5c91612755565b908151602083012090565b67ffffffffffffffff8116036100e757565b9080601f830112156100e757815191611a9183610b33565b92611a9f60405194856102e0565b80845260208085019160051b830101918383116100e75760208101915b838310611acb57505050505090565b825167ffffffffffffffff81116100e7578201906060601f1983880301126100e75760405191611afa836102a8565b6020810151611b0881611a67565b835260408101519067ffffffffffffffff82116100e757611b3088602060609484010161120a565b602085015201519060038210156100e7578260209392604085940152815201920191611abc565b91906060838203126100e75760405190611b70826102a8565b81938051611b7d81611a67565b8352602081015167ffffffffffffffff81116100e75782611b9f91830161120a565b602084015260408101519167ffffffffffffffff83116100e757604092611bc6920161120a565b910152565b6020818303126100e75780519067ffffffffffffffff82116100e75701906020828203126100e75760405191611c00836102c4565b80519067ffffffffffffffff82116100e757016060818303126100e75760405191611c2a836102a8565b815167ffffffffffffffff81116100e75782016080818303126100e75760405190611c5482610270565b8051611c5f81611a67565b82526020810151611c6f816116c8565b6020830152604081015167ffffffffffffffff81116100e757810183601f820112156100e75783816020611ca5935191016111d5565b604083015260608101519067ffffffffffffffff82116100e757611ccb9184910161120a565b60608201528352602082015167ffffffffffffffff81116100e75781611cf2918401611a79565b6020840152604082015167ffffffffffffffff81116100e757611d159201611b57565b6040820152815290565b6020818303126100e75780519067ffffffffffffffff82116100e757019080601f830112156100e7578151611d5381610b33565b92611d6160405194856102e0565b81845260208085019260051b8201019283116100e757602001905b828210611d895750505090565b8151815260209182019101611d7c565b8091039060c082126100e75760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611dd886610270565b8351611de381611a67565b86526020840151611df381611a67565b60208701526040840151611e0681611a67565b60408701520112611e4b5760a09060405192611e21846102a8565b6060820151611e2f81611a67565b8452608082015160208501525001516040820152606082015290565b5080fd5b6103ed9060408152611e65604082016001610162565b9060208183039101526002610162565b601554421161209f57611ed96000611e9660115467ffffffffffffffff1690565b6040517f012d56e000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156107285760409160009161207c575b50510151805167ffffffffffffffff1615612076576020611f5191015160208082518301019101611d1f565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611f8760048201611e4f565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610728576103ed9261203b92600092612041575b5080612003611ff3611fec612008946117a7565b51926117b9565b5191662386f26fc100009061282a565b61283d565b6120356120286040806060860151015194015167ffffffffffffffff1690565b67ffffffffffffffff1690565b916128be565b90612928565b6120089192506120689060c03d60c01161206f575b61206081836102e0565b810190611d99565b9190611fd8565b503d612056565b50600090565b61209991503d806000833e61209181836102e0565b810190611bcb565b38611f25565b600090565b356103ed81611a67565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e757602001918160051b360383136100e757565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100e757016020813591019167ffffffffffffffff82116100e75781360383136100e757565b90602083828152019160208260051b8501019381936000915b84831061219c5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100e7576020809187600194019082806122016121f38580612123565b604086526040860191612102565b930135910152980193019301919493929061218c565b9060028210156104295752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff61225495941681528160208201520191612102565b938d6040818703910152808552602085019460208260051b82010195836000925b84841061230d57505050505050946122d78c9d60a06122c661031d9e9f986101209e9c986122b86123049f9d996122e8996122f59e8e6060818503910152612102565b918b830360808d0152612173565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152612102565b91878303610100890152612102565b93016001612217565b90919293949760208061233583601f19866001960301885261232f8d88612123565b90612102565b9a01940194019294939190612275565b9092939193612353826120a4565b9261236160208401846120ae565b93909261237160408301836116f0565b91909360608401612381906120a4565b9161238e608086016120a4565b9361239c60a08701876116f0565b97909660c081016123ac916116f0565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e6123e69f612224565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107285760009161243b575090565b6103ed915060203d60201161077f5761077181836102e0565b6124606103ed91612b80565b6124a6565b6103ed906040519074140000000000000000000000000000000000000000186014820152603481016040526124a6565b9081518110156117b4570160200190565b60008151600181149081612622575b50156124bf575090565b815190603882101561251a57906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560806124ff612a0b565b94612c1b565b60f81b16901a612514826117a7565b53612755565b6001939092835b61252b868561283d565b156125485761253c61254291612a7a565b95612813565b94612521565b9092945092909261256061255b82612bff565b612a49565b917fff00000000000000000000000000000000000000000000000000000000000000612595612590608085612c1b565b612c0d565b60f81b16811a6125a4846117a7565b5360015b828111156125be575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661261d96896128b1565b612c28565b8b61283d565b60ff1690565b60f81b16831a6126178287612495565b53612a7a565b6125a8565b9050156117b4576080602083015160f81c10386124b5565b61264390612cc2565b80516000603882101561268457906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560c06124ff612a0b565b6001939092835b612695868561283d565b156126ac5761253c6126a691612a7a565b9461268b565b909294509290926126bf61255b82612bff565b917fff000000000000000000000000000000000000000000000000000000000000006126ef61259060c085612c1b565b60f81b16811a6126fe846117a7565b5360015b82811115612718575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661275096896128b1565b612702565b90604051918051908184526020840191840192602084019260208301905b8481106127c15750508051809386518201875294019360208086019201905b8281106127b15750509051603f92011590920101601f19166040525090565b8151815260209182019101612792565b8151815260209182019101612773565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b604d811161280e57600a0a90565b6127d1565b908160081b91808304610100149015171561280e57565b8181029291811591840414171561280e57565b8115612847570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b602003906020821161280e57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161280e57565b9190820391821161280e57565b90929190601082111561292057815b82039082821161280e576128e36128e992612800565b9061282a565b927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0820191821161280e576128e36103ed92612800565b6010916128cd565b60ff60055416916129388361041f565b6001831492836129db575b83156129b8575b8315612994575b8315612969575b50505061296457600090565b600190565b6002919293506129788161041f565b14918261298a575b5050388080612958565b1090503880612980565b925061299f8361041f565b60038314806129af575b92612951565b508082116129a9565b92506129c38361041f565b8215806129d1575b9261294a565b50808211156129cb565b818310159350612943565b604080519091906129f783826102e0565b60208152918290601f190190369060200137565b60408051909190612a1c83826102e0565b6001815291601f1901366020840137565b60405190612a3c6020836102e0565b6000808352366020840137565b90612a53826111b9565b612a6060405191826102e0565b828152601f19612a7082946111b9565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461280e5760010190565b612aaf6129e6565b90600260208301526000915b60208310612b37575b612ad061255b84612876565b9060005b8251811015612b3057600190612b1c612af6612aef88612a7a565b9785612495565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612b298286612495565b5301612ad4565b5090925050565b91612b6d612b48612af68386612495565b7fff000000000000000000000000000000000000000000000000000000000000001690565b612b7a5760010191612abb565b91612ac4565b90612b896129e6565b9160208301526000915b60208310612bdb575b612ba861255b84612876565b9060005b8251811015612b3057600190612bc7612af6612aef88612a7a565b60001a612bd48286612495565b5301612bac565b91612bec612b48612af68386612495565b612bf95760010191612b93565b91612b9c565b906001820180921161280e57565b906037820180921161280e57565b9190820180921161280e57565b601f811161280e576101000a90565b15612c3e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b90815115612d6657600091825b8151841015612d0e57612d06600191612cf4612ceb878661183b565b51511515612c37565b612cfe868561183b565b515190612c1b565b930192612ccf565b612d1a91929350612a49565b9060208201926000935b8251851015612d5f57612d57600191612d4d612d40888761183b565b5160208151910183612d70565b612cfe878661183b565b940193612d24565b5092505090565b90506103ed612a2d565b915b6020811015612da5576020036020811161280e57612d92612d9791612c28565b612884565b905182518216911916179052565b9091825181526020810180911161280e57916020810180911161280e5790601f19810190811115612d72576127d156fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x9e6711063a479a230728154843e8106fc5a46e47e85622cb1fe6b5892aba12c3", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea", + "0x60e03461019c57601f61153938819003918201601f19168301916001600160401b038311848410176101a15780849260a09460405283398101031261019c57610047816101b7565b90610054602082016101b7565b90610061604082016101b7565b9061007a6080610073606084016101b7565b92016101b7565b6001600160a01b0390921693841561018657600080546001600160a01b031981168717825560405196916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316928315610175576001600160a01b0316928315610164576080526001600160a01b0390811660a0521660c052600380546001600160a01b03191691909117905561136d90816101cc823960805181610cf9015260a051818181610269015281816104b10152610864015260c0518181816103740152818161042c0152610b3f0152f35b637d8ed95960e11b60005260046000fd5b637bfd2e8360e01b60005260046000fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361019c5756fe608080604052600436101561001357600080fd5b60003560e01c90816306433b1b14610cce5750806315a96ae9146106225780633f6746ce14610553578063715018a6146104d557806372bdda54146104845780638da5cb5b14610450578063aa638107146103ff578063d1ad17bf146103cb578063f04e5bed146101ce578063f2fde38b146100fa5763f40e84711461009857600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff6100c6610d1d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610128610d1d565b610130611311565b16801561019f5773ffffffffffffffffffffffffffffffffffffffff600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346100f55760606003193601126100f5576101e7610d1d565b60243560443560028110156100f557600090806102f55750506040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916102bc575b505b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6102dc9150823d84116102e2575b6102d48183610d40565b810190610e68565b8261029c565b503d6102ca565b6040513d6000823e3d90fd5b90919060011461030a575b506020915061029e565b6040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830152506020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916103ae575b5082610300565b6103c59150823d84116102e2576102d48183610d40565b826103a7565b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f5576104ee611311565b600073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610581610d1d565b610589611311565b1680156105f85773ffffffffffffffffffffffffffffffffffffffff600354827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600355167fd8a42eaab83c563642705bc71a5905c29682aa5bf997aaa24b2ff7b3f32ed0b6600080a3005b7ffb1db2b20000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760a06003193601126100f55760043567ffffffffffffffff81116100f557366023820112156100f557806004013567ffffffffffffffff81116100f557602482019082019060248201913683116100f5576024359167ffffffffffffffff83116100f55760406003198460040194360301126100f5576044359067ffffffffffffffff82116100f557366023830112156100f55781600401359567ffffffffffffffff87116100f5576024830192602436918960051b0101116100f5576064359160028310156100f55760843592600260015414610ca4576002600155600090806109905750506020828603126100f5573567ffffffffffffffff81116100f5570192606090849003126100f557604051956060870187811067ffffffffffffffff821117610961576040526024840135875260448401359260048410156100f5576020880193845260648501359167ffffffffffffffff83116100f55761082c60a09761081a6107a460209b602461083e9860049c0101610df6565b60408d0190815261080773ffffffffffffffffffffffffffffffffffffffff60035416996040519e8f9d8e9d8e7f3dc48a3400000000000000000000000000000000000000000000000000000000815201525160a48d01525160c48c0190610f20565b51606060e48b01526101048a0190610ef3565b906003198983030160248a0152611000565b9160031987840301604488015261124f565b91606484015260848301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156102e957602091600091610944575b5073ffffffffffffffffffffffffffffffffffffffff81168060005260028352604060002073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556000337f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c88280a45b6001805573ffffffffffffffffffffffffffffffffffffffff60405191168152f35b61095b9150823d84116102e2576102d48183610d40565b82610897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9098969796939493929190600103610c7c57602082870312610c47573567ffffffffffffffff8111610c4757019360809085900312610c7857604051946080860186811067ffffffffffffffff821117610c4b57604052602485013567ffffffffffffffff8111610c4757816024610a0a92880101610df6565b865260448501359067ffffffffffffffff8211610c47576024610a2f92870101610df6565b956020860196875260648501356004811015610c475760408701908152606087019560840135865260035473ffffffffffffffffffffffffffffffffffffffff16956040519889987fb60bda49000000000000000000000000000000000000000000000000000000008a5260048a0160a090525160a48a01608090526101248a01610ab991610ef3565b9051908981037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c0160c48b0152610aef91610ef3565b915160e48901610afe91610f20565b51610104880152868103600319016024880152610b1a91611000565b90858203600319016044870152610b309261124f565b916064840152608483015203817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169181855a94602095f1908115610c3c57916020928192610c1d575b50600173ffffffffffffffffffffffffffffffffffffffff831691828152600285526040812073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c8339180a4610922565b610c35919250833d85116102e2576102d48183610d40565b9083610b8f565b6040513d84823e3d90fd5b8880fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8680fd5b6004897fa3c0e0d1000000000000000000000000000000000000000000000000000000008152fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760006003193601126100f55760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096157604052565b81601f820112156100f55780359067ffffffffffffffff82116109615760405192610dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610d40565b828452602083830101116100f557816000926020809301838601378301015290565b91906040838203126100f557604051906040820182811067ffffffffffffffff821117610961576040528193803567ffffffffffffffff81116100f55782610e3f918301610d81565b835260208101359167ffffffffffffffff83116100f557602092610e639201610d81565b910152565b908160209103126100f5575173ffffffffffffffffffffffffffffffffffffffff811681036100f55790565b919082519283825260005b848110610ede5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e9f565b610f1d916020610f0c8351604084526040840190610e94565b920151906020818403910152610e94565b90565b906004821015610f2d5752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100f557016020813591019167ffffffffffffffff82116100f55781360383136100f557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b359067ffffffffffffffff821682036100f557565b9190823592803603937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8185018112156100f5578101604083528035604084015260208101356060840152604081013573ffffffffffffffffffffffffffffffffffffffff81168091036100f557611095916110849160808601526060810190610f5c565b608060a086015260c0850191610fac565b937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21602083013591018112156100f5570190602081850391015260e083019267ffffffffffffffff6110e683610feb565b16815260208201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112156100f55782016020813591019467ffffffffffffffff82116100f5578160051b9081360387136100f55760e0602085015282905282016101009081019591906000908401835b8383106111fb5750505050506111ed6111e2611191610f1d95966111836040870187610f5c565b908683036040880152610fac565b67ffffffffffffffff6111a660608701610feb565b16606085015267ffffffffffffffff6111c160808701610feb565b1660808501526111d460a0860186610f5c565b9085830360a0870152610fac565b9260c0810190610f5c565b9160c0818503910152610fac565b9091929397602080611240837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008a6001960301875261123a8d87610f5c565b90610fac565b9a01930193019193929061115c565b90602083828152019160208260051b8501019381936000915b8483106112785750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100f5576020809187600194019082806112fb6112ed8580610f5c565b604086526040860191610fac565b9301359101529801930193019194939290611268565b73ffffffffffffffffffffffffffffffffffffffff60005416330361133257565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fdfea164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000008f3415f4fed95503e1893ba98714129cc106b172000000000000000000000000dba8408ef5cb6ab6fcfa274ba815eb2a4740165b" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0x194b7f", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000015d960e03461019c57601f61153938819003918201601f19168301916001600160401b038311848410176101a15780849260a09460405283398101031261019c57610047816101b7565b90610054602082016101b7565b90610061604082016101b7565b9061007a6080610073606084016101b7565b92016101b7565b6001600160a01b0390921693841561018657600080546001600160a01b031981168717825560405196916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316928315610175576001600160a01b0316928315610164576080526001600160a01b0390811660a0521660c052600380546001600160a01b03191691909117905561136d90816101cc823960805181610cf9015260a051818181610269015281816104b10152610864015260c0518181816103740152818161042c0152610b3f0152f35b637d8ed95960e11b60005260046000fd5b637bfd2e8360e01b60005260046000fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361019c5756fe608080604052600436101561001357600080fd5b60003560e01c90816306433b1b14610cce5750806315a96ae9146106225780633f6746ce14610553578063715018a6146104d557806372bdda54146104845780638da5cb5b14610450578063aa638107146103ff578063d1ad17bf146103cb578063f04e5bed146101ce578063f2fde38b146100fa5763f40e84711461009857600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff6100c6610d1d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610128610d1d565b610130611311565b16801561019f5773ffffffffffffffffffffffffffffffffffffffff600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346100f55760606003193601126100f5576101e7610d1d565b60243560443560028110156100f557600090806102f55750506040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916102bc575b505b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6102dc9150823d84116102e2575b6102d48183610d40565b810190610e68565b8261029c565b503d6102ca565b6040513d6000823e3d90fd5b90919060011461030a575b506020915061029e565b6040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830152506020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916103ae575b5082610300565b6103c59150823d84116102e2576102d48183610d40565b826103a7565b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f5576104ee611311565b600073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610581610d1d565b610589611311565b1680156105f85773ffffffffffffffffffffffffffffffffffffffff600354827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600355167fd8a42eaab83c563642705bc71a5905c29682aa5bf997aaa24b2ff7b3f32ed0b6600080a3005b7ffb1db2b20000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760a06003193601126100f55760043567ffffffffffffffff81116100f557366023820112156100f557806004013567ffffffffffffffff81116100f557602482019082019060248201913683116100f5576024359167ffffffffffffffff83116100f55760406003198460040194360301126100f5576044359067ffffffffffffffff82116100f557366023830112156100f55781600401359567ffffffffffffffff87116100f5576024830192602436918960051b0101116100f5576064359160028310156100f55760843592600260015414610ca4576002600155600090806109905750506020828603126100f5573567ffffffffffffffff81116100f5570192606090849003126100f557604051956060870187811067ffffffffffffffff821117610961576040526024840135875260448401359260048410156100f5576020880193845260648501359167ffffffffffffffff83116100f55761082c60a09761081a6107a460209b602461083e9860049c0101610df6565b60408d0190815261080773ffffffffffffffffffffffffffffffffffffffff60035416996040519e8f9d8e9d8e7f3dc48a3400000000000000000000000000000000000000000000000000000000815201525160a48d01525160c48c0190610f20565b51606060e48b01526101048a0190610ef3565b906003198983030160248a0152611000565b9160031987840301604488015261124f565b91606484015260848301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156102e957602091600091610944575b5073ffffffffffffffffffffffffffffffffffffffff81168060005260028352604060002073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556000337f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c88280a45b6001805573ffffffffffffffffffffffffffffffffffffffff60405191168152f35b61095b9150823d84116102e2576102d48183610d40565b82610897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9098969796939493929190600103610c7c57602082870312610c47573567ffffffffffffffff8111610c4757019360809085900312610c7857604051946080860186811067ffffffffffffffff821117610c4b57604052602485013567ffffffffffffffff8111610c4757816024610a0a92880101610df6565b865260448501359067ffffffffffffffff8211610c47576024610a2f92870101610df6565b956020860196875260648501356004811015610c475760408701908152606087019560840135865260035473ffffffffffffffffffffffffffffffffffffffff16956040519889987fb60bda49000000000000000000000000000000000000000000000000000000008a5260048a0160a090525160a48a01608090526101248a01610ab991610ef3565b9051908981037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c0160c48b0152610aef91610ef3565b915160e48901610afe91610f20565b51610104880152868103600319016024880152610b1a91611000565b90858203600319016044870152610b309261124f565b916064840152608483015203817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169181855a94602095f1908115610c3c57916020928192610c1d575b50600173ffffffffffffffffffffffffffffffffffffffff831691828152600285526040812073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c8339180a4610922565b610c35919250833d85116102e2576102d48183610d40565b9083610b8f565b6040513d84823e3d90fd5b8880fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8680fd5b6004897fa3c0e0d1000000000000000000000000000000000000000000000000000000008152fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760006003193601126100f55760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096157604052565b81601f820112156100f55780359067ffffffffffffffff82116109615760405192610dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610d40565b828452602083830101116100f557816000926020809301838601378301015290565b91906040838203126100f557604051906040820182811067ffffffffffffffff821117610961576040528193803567ffffffffffffffff81116100f55782610e3f918301610d81565b835260208101359167ffffffffffffffff83116100f557602092610e639201610d81565b910152565b908160209103126100f5575173ffffffffffffffffffffffffffffffffffffffff811681036100f55790565b919082519283825260005b848110610ede5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e9f565b610f1d916020610f0c8351604084526040840190610e94565b920151906020818403910152610e94565b90565b906004821015610f2d5752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100f557016020813591019167ffffffffffffffff82116100f55781360383136100f557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b359067ffffffffffffffff821682036100f557565b9190823592803603937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8185018112156100f5578101604083528035604084015260208101356060840152604081013573ffffffffffffffffffffffffffffffffffffffff81168091036100f557611095916110849160808601526060810190610f5c565b608060a086015260c0850191610fac565b937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21602083013591018112156100f5570190602081850391015260e083019267ffffffffffffffff6110e683610feb565b16815260208201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112156100f55782016020813591019467ffffffffffffffff82116100f5578160051b9081360387136100f55760e0602085015282905282016101009081019591906000908401835b8383106111fb5750505050506111ed6111e2611191610f1d95966111836040870187610f5c565b908683036040880152610fac565b67ffffffffffffffff6111a660608701610feb565b16606085015267ffffffffffffffff6111c160808701610feb565b1660808501526111d460a0860186610f5c565b9085830360a0870152610fac565b9260c0810190610f5c565b9160c0818503910152610fac565b9091929397602080611240837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008a6001960301875261123a8d87610f5c565b90610fac565b9a01930193019193929061115c565b90602083828152019160208260051b8501019381936000915b8483106112785750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100f5576020809187600194019082806112fb6112ed8580610f5c565b604086526040860191610fac565b9301359101529801930193019194939290611268565b73ffffffffffffffffffffffffffffffffffffffff60005416330361133257565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fdfea164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000008f3415f4fed95503e1893ba98714129cc106b172000000000000000000000000dba8408ef5cb6ab6fcfa274ba815eb2a4740165b00000000000000", + "nonce": "0x4", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xa5799a7b0323fd47d73d8df9b8617002d4b7fb32", + "initCode": "0x60e03461019c57601f61153938819003918201601f19168301916001600160401b038311848410176101a15780849260a09460405283398101031261019c57610047816101b7565b90610054602082016101b7565b90610061604082016101b7565b9061007a6080610073606084016101b7565b92016101b7565b6001600160a01b0390921693841561018657600080546001600160a01b031981168717825560405196916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316928315610175576001600160a01b0316928315610164576080526001600160a01b0390811660a0521660c052600380546001600160a01b03191691909117905561136d90816101cc823960805181610cf9015260a051818181610269015281816104b10152610864015260c0518181816103740152818161042c0152610b3f0152f35b637d8ed95960e11b60005260046000fd5b637bfd2e8360e01b60005260046000fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361019c5756fe608080604052600436101561001357600080fd5b60003560e01c90816306433b1b14610cce5750806315a96ae9146106225780633f6746ce14610553578063715018a6146104d557806372bdda54146104845780638da5cb5b14610450578063aa638107146103ff578063d1ad17bf146103cb578063f04e5bed146101ce578063f2fde38b146100fa5763f40e84711461009857600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff6100c6610d1d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610128610d1d565b610130611311565b16801561019f5773ffffffffffffffffffffffffffffffffffffffff600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346100f55760606003193601126100f5576101e7610d1d565b60243560443560028110156100f557600090806102f55750506040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916102bc575b505b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6102dc9150823d84116102e2575b6102d48183610d40565b810190610e68565b8261029c565b503d6102ca565b6040513d6000823e3d90fd5b90919060011461030a575b506020915061029e565b6040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830152506020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916103ae575b5082610300565b6103c59150823d84116102e2576102d48183610d40565b826103a7565b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f5576104ee611311565b600073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610581610d1d565b610589611311565b1680156105f85773ffffffffffffffffffffffffffffffffffffffff600354827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600355167fd8a42eaab83c563642705bc71a5905c29682aa5bf997aaa24b2ff7b3f32ed0b6600080a3005b7ffb1db2b20000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760a06003193601126100f55760043567ffffffffffffffff81116100f557366023820112156100f557806004013567ffffffffffffffff81116100f557602482019082019060248201913683116100f5576024359167ffffffffffffffff83116100f55760406003198460040194360301126100f5576044359067ffffffffffffffff82116100f557366023830112156100f55781600401359567ffffffffffffffff87116100f5576024830192602436918960051b0101116100f5576064359160028310156100f55760843592600260015414610ca4576002600155600090806109905750506020828603126100f5573567ffffffffffffffff81116100f5570192606090849003126100f557604051956060870187811067ffffffffffffffff821117610961576040526024840135875260448401359260048410156100f5576020880193845260648501359167ffffffffffffffff83116100f55761082c60a09761081a6107a460209b602461083e9860049c0101610df6565b60408d0190815261080773ffffffffffffffffffffffffffffffffffffffff60035416996040519e8f9d8e9d8e7f3dc48a3400000000000000000000000000000000000000000000000000000000815201525160a48d01525160c48c0190610f20565b51606060e48b01526101048a0190610ef3565b906003198983030160248a0152611000565b9160031987840301604488015261124f565b91606484015260848301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156102e957602091600091610944575b5073ffffffffffffffffffffffffffffffffffffffff81168060005260028352604060002073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556000337f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c88280a45b6001805573ffffffffffffffffffffffffffffffffffffffff60405191168152f35b61095b9150823d84116102e2576102d48183610d40565b82610897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9098969796939493929190600103610c7c57602082870312610c47573567ffffffffffffffff8111610c4757019360809085900312610c7857604051946080860186811067ffffffffffffffff821117610c4b57604052602485013567ffffffffffffffff8111610c4757816024610a0a92880101610df6565b865260448501359067ffffffffffffffff8211610c47576024610a2f92870101610df6565b956020860196875260648501356004811015610c475760408701908152606087019560840135865260035473ffffffffffffffffffffffffffffffffffffffff16956040519889987fb60bda49000000000000000000000000000000000000000000000000000000008a5260048a0160a090525160a48a01608090526101248a01610ab991610ef3565b9051908981037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c0160c48b0152610aef91610ef3565b915160e48901610afe91610f20565b51610104880152868103600319016024880152610b1a91611000565b90858203600319016044870152610b309261124f565b916064840152608483015203817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169181855a94602095f1908115610c3c57916020928192610c1d575b50600173ffffffffffffffffffffffffffffffffffffffff831691828152600285526040812073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c8339180a4610922565b610c35919250833d85116102e2576102d48183610d40565b9083610b8f565b6040513d84823e3d90fd5b8880fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8680fd5b6004897fa3c0e0d1000000000000000000000000000000000000000000000000000000008152fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760006003193601126100f55760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096157604052565b81601f820112156100f55780359067ffffffffffffffff82116109615760405192610dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610d40565b828452602083830101116100f557816000926020809301838601378301015290565b91906040838203126100f557604051906040820182811067ffffffffffffffff821117610961576040528193803567ffffffffffffffff81116100f55782610e3f918301610d81565b835260208101359167ffffffffffffffff83116100f557602092610e639201610d81565b910152565b908160209103126100f5575173ffffffffffffffffffffffffffffffffffffffff811681036100f55790565b919082519283825260005b848110610ede5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e9f565b610f1d916020610f0c8351604084526040840190610e94565b920151906020818403910152610e94565b90565b906004821015610f2d5752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100f557016020813591019167ffffffffffffffff82116100f55781360383136100f557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b359067ffffffffffffffff821682036100f557565b9190823592803603937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8185018112156100f5578101604083528035604084015260208101356060840152604081013573ffffffffffffffffffffffffffffffffffffffff81168091036100f557611095916110849160808601526060810190610f5c565b608060a086015260c0850191610fac565b937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21602083013591018112156100f5570190602081850391015260e083019267ffffffffffffffff6110e683610feb565b16815260208201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112156100f55782016020813591019467ffffffffffffffff82116100f5578160051b9081360387136100f55760e0602085015282905282016101009081019591906000908401835b8383106111fb5750505050506111ed6111e2611191610f1d95966111836040870187610f5c565b908683036040880152610fac565b67ffffffffffffffff6111a660608701610feb565b16606085015267ffffffffffffffff6111c160808701610feb565b1660808501526111d460a0860186610f5c565b9085830360a0870152610fac565b9260c0810190610f5c565b9160c0818503910152610fac565b9091929397602080611240837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008a6001960301875261123a8d87610f5c565b90610fac565b9a01930193019193929061115c565b90602083828152019160208260051b8501019381936000915b8483106112785750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100f5576020809187600194019082806112fb6112ed8580610f5c565b604086526040860191610fac565b9301359101529801930193019194939290611268565b73ffffffffffffffffffffffffffffffffffffffff60005416330361133257565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fdfea164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000008f3415f4fed95503e1893ba98714129cc106b172000000000000000000000000dba8408ef5cb6ab6fcfa274ba815eb2a4740165b" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x44906", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xcfcb2d0db51fa9c7cb8d99e09dcd6ac8733094a26c390bc92de8c05443794e61", + "transactionIndex": "0x0", + "blockHash": "0x5a2f53e9e0e707e9259cce2bc3589270b42f916fd88b3dfd08ac41f06dfd48bc", + "blockNumber": "0x1887ee", + "gasUsed": "0x2d252", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": null, + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb051e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x74f818d9e09c6482f38109e1e08fee11dcbbfbd45f4e4af5a9870cc6a500912d", + "transactionIndex": "0x0", + "blockHash": "0x0145fec755ee5120d0d962361b18b4585b9dec95bffb3d863661e346bc0a7b66", + "blockNumber": "0x1887ef", + "gasUsed": "0x98e6a", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x46286a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8791336ed32c4debdd384b3159101f055bc818463fa680e26de8c130752c1249", + "transactionIndex": "0x0", + "blockHash": "0xc47f71ffa06f1586dc74a664b2331bf9d4b27c7afd97aff7b085fc5258e5ac9e", + "blockNumber": "0x1887f0", + "gasUsed": "0x43132f", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4c8065", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7d9c2021f2c4b3a748b6e23f5260f6229b40a556dfc3ed2d7de5fbd79469cf9f", + "transactionIndex": "0x0", + "blockHash": "0x1f105363449d0cc41dd0e3f1efd661afb0ff05a8a37d0676b6f8a456cbbe8cbe", + "blockNumber": "0x1887f1", + "gasUsed": "0x4b09b1", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x125025", + "logs": [ + { + "address": "0xa5799a7b0323fd47d73d8df9b8617002d4b7fb32", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c30" + ], + "data": "0x", + "blockHash": "0x3bb79ddb0f03b3ffd9ad4b56aec4071995759a6596644f8788c2e2f35a5bc7bc", + "blockNumber": "0x1887f2", + "transactionHash": "0x9e6711063a479a230728154843e8106fc5a46e47e85622cb1fe6b5892aba12c3", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000200020000000000000000000800000000200000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000020000000000000000000000000000000000000000000000000000000000080000000", + "type": "0x2", + "transactionHash": "0x9e6711063a479a230728154843e8106fc5a46e47e85622cb1fe6b5892aba12c3", + "transactionIndex": "0x0", + "blockHash": "0x3bb79ddb0f03b3ffd9ad4b56aec4071995759a6596644f8788c2e2f35a5bc7bc", + "blockNumber": "0x1887f2", + "gasUsed": "0x125025", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1739040681, + "chain": 10010, + "commit": "c60ce65" +} \ No newline at end of file diff --git a/clone-agent/contracts/broadcast/Deploy.s.sol/10010/run-latest.json b/clone-agent/contracts/broadcast/Deploy.s.sol/10010/run-latest.json new file mode 100644 index 00000000..d0ce8ac8 --- /dev/null +++ b/clone-agent/contracts/broadcast/Deploy.s.sol/10010/run-latest.json @@ -0,0 +1,238 @@ +{ + "transactions": [ + { + "hash": "0xcfcb2d0db51fa9c7cb8d99e09dcd6ac8733094a26c390bc92de8c05443794e61", + "transactionType": "CREATE", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": null, + "arguments": null, + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "gas": "0x3ab04", + "value": "0x0", + "input": "0x60808060405234601557610266908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063481286e6146100375763cdcb760a1461003257600080fd5b6100d4565b346100a05760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a05760043560243560c05260a0523060805260ff608b5360206055608b2073ffffffffffffffffffffffffffffffffffffffff60405191168152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100a05760043560243567ffffffffffffffff81116100a057366023820112156100a05780600401359167ffffffffffffffff83116101d157604051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81601f8701160116820182811067ffffffffffffffff8211176101d15760405283825236602485850101116100a05760006020856101cd9660246101a6970183870137840101526101d6565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b6100a5565b9080511561022f5760208151910134f59073ffffffffffffffffffffffffffffffffffffffff82161561020557565b7f741752c20000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4ca249dc0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081c000a", + "nonce": "0x0", + "chainId": "0x271a" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x74f818d9e09c6482f38109e1e08fee11dcbbfbd45f4e4af5a9870cc6a500912d", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003e9", + "0x60808060405234601a576001600055610a0890816100208239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630af83b28146107db575080634420e486146105f557806350cfe3c71461057a5763aa733a441461004b57600080fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261057557610082610927565b6024359060026000541461054b57600260005573ffffffffffffffffffffffffffffffffffffffff169081156105215733600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416156104f75780156104cd5781600052600260205260406000208160005260205261010560406000205461094a565b6104a3576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000335af160009181610472575b50610172577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b1561044857604051917f88328a6900000000000000000000000000000000000000000000000000000000835260008360048183335af192831561043c57600093610377575b508060005260026020526040600020826000526020526040600020835167ffffffffffffffff8111610348576101ed825461094a565b601f8111610300575b50602094601f821160011461027d57948192939495600092610272575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b337f4a13f12b0824ee061bfc467b7fc9c0f9505f9290bfc7d773a5909c36d4c22bed600080a46001600055005b015190503880610213565b601f1982169583600052806000209160005b8881106102e8575083600195969798106102b1575b505050811b019055610245565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806102a4565b9192602060018192868501518155019401920161028f565b826000526020600020601f830160051c8101916020841061033e575b601f0160051c01905b81811061033257506101f6565b60008155600101610325565b909150819061031c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90923d8082843e610388818461099d565b8201916020818403126104345780519067ffffffffffffffff8211610438570182601f820112156104345780519167ffffffffffffffff831161040757604051936103dd6020601f19601f870116018661099d565b838552602084840101116104045750906103fd91602080850191016109c0565b91386101b7565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b7fec84b1da0000000000000000000000000000000000000000000000000000000060005260046000fd5b61049591925060203d60201161049c575b61048d818361099d565b8101906109e3565b9038610143565b503d610483565b7f34a849b30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0af806e00000000000000000000000000000000000000000000000000000000060005260046000fd5b7f15dbf9e70000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4595d0750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff6105c6610927565b166000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610641610927565b1680156107b15780600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416610787576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000865af160009181610766575b506106da577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b61073c578060005260016020526040600020337fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055337f0a31ee9d46a828884b81003c8498156ea6aa15b9b54bdd0ef0b533d9eba57e55600080a3005b7f68f46c450000000000000000000000000000000000000000000000000000000060005260046000fd5b61078091925060203d60201161049c5761048d818361099d565b90836106ab565b7f604ad0350000000000000000000000000000000000000000000000000000000060005260046000fd5b7f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610827610927565b1660005260026020526040600020602435600052602052604060002060008154916108518361094a565b9081855260208501936001811690816000146108eb57506001146108ac575b6108a3604086601f19601f88610888848a038561099d565b845195869460208652518092816020880152878701906109c0565b01168101030190f35b6000908152602081209092505b8183106108d15750508201602001601f19601f610870565b6001816020929493945483858901015201910191906108b9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685525050151560051b83016020019050601f19601f610870565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361057557565b90600182811c92168015610993575b602083101461096457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610959565b90601f601f19910116810190811067ffffffffffffffff82111761034857604052565b60005b8381106109d35750506000910152565b81810151838201526020016109c3565b9081602091031261057557518015158103610575579056fea164736f6c634300081c000a" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0xdf9e1", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003e900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000a2860808060405234601a576001600055610a0890816100208239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630af83b28146107db575080634420e486146105f557806350cfe3c71461057a5763aa733a441461004b57600080fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261057557610082610927565b6024359060026000541461054b57600260005573ffffffffffffffffffffffffffffffffffffffff169081156105215733600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416156104f75780156104cd5781600052600260205260406000208160005260205261010560406000205461094a565b6104a3576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000335af160009181610472575b50610172577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b1561044857604051917f88328a6900000000000000000000000000000000000000000000000000000000835260008360048183335af192831561043c57600093610377575b508060005260026020526040600020826000526020526040600020835167ffffffffffffffff8111610348576101ed825461094a565b601f8111610300575b50602094601f821160011461027d57948192939495600092610272575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b337f4a13f12b0824ee061bfc467b7fc9c0f9505f9290bfc7d773a5909c36d4c22bed600080a46001600055005b015190503880610213565b601f1982169583600052806000209160005b8881106102e8575083600195969798106102b1575b505050811b019055610245565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806102a4565b9192602060018192868501518155019401920161028f565b826000526020600020601f830160051c8101916020841061033e575b601f0160051c01905b81811061033257506101f6565b60008155600101610325565b909150819061031c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90923d8082843e610388818461099d565b8201916020818403126104345780519067ffffffffffffffff8211610438570182601f820112156104345780519167ffffffffffffffff831161040757604051936103dd6020601f19601f870116018661099d565b838552602084840101116104045750906103fd91602080850191016109c0565b91386101b7565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b7fec84b1da0000000000000000000000000000000000000000000000000000000060005260046000fd5b61049591925060203d60201161049c575b61048d818361099d565b8101906109e3565b9038610143565b503d610483565b7f34a849b30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0af806e00000000000000000000000000000000000000000000000000000000060005260046000fd5b7f15dbf9e70000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4595d0750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff6105c6610927565b166000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610641610927565b1680156107b15780600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416610787576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000865af160009181610766575b506106da577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b61073c578060005260016020526040600020337fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055337f0a31ee9d46a828884b81003c8498156ea6aa15b9b54bdd0ef0b533d9eba57e55600080a3005b7f68f46c450000000000000000000000000000000000000000000000000000000060005260046000fd5b61078091925060203d60201161049c5761048d818361099d565b90836106ab565b7f604ad0350000000000000000000000000000000000000000000000000000000060005260046000fd5b7f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610827610927565b1660005260026020526040600020602435600052602052604060002060008154916108518361094a565b9081855260208501936001811690816000146108eb57506001146108ac575b6108a3604086601f19601f88610888848a038561099d565b845195869460208652518092816020880152878701906109c0565b01168101030190f35b6000908152602081209092505b8183106108d15750508201602001601f19601f610870565b6001816020929493945483858901015201910191906108b9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685525050151560051b83016020019050601f19601f610870565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361057557565b90600182811c92168015610993575b602083101461096457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610959565b90601f601f19910116810190811067ffffffffffffffff82111761034857604052565b60005b8381106109d35750506000910152565b81810151838201526020016109c3565b9081602091031261057557518015158103610575579056fea164736f6c634300081c000a000000000000000000000000000000000000000000000000", + "nonce": "0x1", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x324faaf2281c7fe53197800d3fde0d2592528987", + "initCode": "0x60808060405234601a576001600055610a0890816100208239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081630af83b28146107db575080634420e486146105f557806350cfe3c71461057a5763aa733a441461004b57600080fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261057557610082610927565b6024359060026000541461054b57600260005573ffffffffffffffffffffffffffffffffffffffff169081156105215733600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416156104f75780156104cd5781600052600260205260406000208160005260205261010560406000205461094a565b6104a3576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000335af160009181610472575b50610172577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b1561044857604051917f88328a6900000000000000000000000000000000000000000000000000000000835260008360048183335af192831561043c57600093610377575b508060005260026020526040600020826000526020526040600020835167ffffffffffffffff8111610348576101ed825461094a565b601f8111610300575b50602094601f821160011461027d57948192939495600092610272575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b337f4a13f12b0824ee061bfc467b7fc9c0f9505f9290bfc7d773a5909c36d4c22bed600080a46001600055005b015190503880610213565b601f1982169583600052806000209160005b8881106102e8575083600195969798106102b1575b505050811b019055610245565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806102a4565b9192602060018192868501518155019401920161028f565b826000526020600020601f830160051c8101916020841061033e575b601f0160051c01905b81811061033257506101f6565b60008155600101610325565b909150819061031c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90923d8082843e610388818461099d565b8201916020818403126104345780519067ffffffffffffffff8211610438570182601f820112156104345780519167ffffffffffffffff831161040757604051936103dd6020601f19601f870116018661099d565b838552602084840101116104045750906103fd91602080850191016109c0565b91386101b7565b80fd5b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b5080fd5b8280fd5b6040513d6000823e3d90fd5b7fec84b1da0000000000000000000000000000000000000000000000000000000060005260046000fd5b61049591925060203d60201161049c575b61048d818361099d565b8101906109e3565b9038610143565b503d610483565b7f34a849b30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0af806e00000000000000000000000000000000000000000000000000000000060005260046000fd5b7f15dbf9e70000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4595d0750000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff6105c6610927565b166000526001602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b346105755760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610641610927565b1680156107b15780600052600160205273ffffffffffffffffffffffffffffffffffffffff60406000205416610787576040517f1c9feaa50000000000000000000000000000000000000000000000000000000081526020816004816000865af160009181610766575b506106da577f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b61073c578060005260016020526040600020337fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055337f0a31ee9d46a828884b81003c8498156ea6aa15b9b54bdd0ef0b533d9eba57e55600080a3005b7f68f46c450000000000000000000000000000000000000000000000000000000060005260046000fd5b61078091925060203d60201161049c5761048d818361099d565b90836106ab565b7f604ad0350000000000000000000000000000000000000000000000000000000060005260046000fd5b7f785ee9e60000000000000000000000000000000000000000000000000000000060005260046000fd5b346105755760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126105755773ffffffffffffffffffffffffffffffffffffffff610827610927565b1660005260026020526040600020602435600052602052604060002060008154916108518361094a565b9081855260208501936001811690816000146108eb57506001146108ac575b6108a3604086601f19601f88610888848a038561099d565b845195869460208652518092816020880152878701906109c0565b01168101030190f35b6000908152602081209092505b8183106108d15750508201602001601f19601f610870565b6001816020929493945483858901015201910191906108b9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685525050151560051b83016020019050601f19601f610870565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361057557565b90600182811c92168015610993575b602083101461096457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610959565b90601f601f19910116810190811067ffffffffffffffff82111761034857604052565b60005b8381106109d35750506000910152565b81810151838201526020016109c3565b9081602091031261057557518015158103610575579056fea164736f6c634300081c000a" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x8791336ed32c4debdd384b3159101f055bc818463fa680e26de8c130752c1249", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea", + "0x60a034607357601f614ec038819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b038116908190036073576001600055608052604051614e31908161008f823960805181818160b001526103720152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780633dc48a341461004d57637fddd6021461004857600080fd5b610217565b610159565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357606060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff821161008357610213926101d26101ec9336906004016100e4565b906101db610115565b9260843594600401906004016102a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761028960209161027361028160243560405192839187830195869091604092825260208201520190565b03601f1981018352826105db565b519020610aeb565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9293949190916002600054146105825760026000556040516102dd81610273602082019432869091604092825260208201520190565b519020946102ff6102f8876000526001602052604060002090565b5460ff1690565b610558576102736103b4936103a46103c0966102736103ba96328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36140859661034f60208901610603565b97808952610da060208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109ac565b6040519485936020850190610ab4565b90610ab4565b83610c81565b916103ca81610aeb565b73ffffffffffffffffffffffffffffffffffffffff84168015918215610537575b505061050a57813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af1908115610505576104999261046e926104ea575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907f51cd0090f3c14be5310fb02efc5d7f8aa69cff235becdf1d944ee6c420b2deb690602090a2906104e86001600055565b565b806104f960006104ff936105db565b806100d9565b3861045d565b610adf565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff161415905038806103eb565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176105fe57604052565b6105ac565b906104e860405192836105db565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107765750505050505090565b90919293949560208061079e83601f1986600196030188526107988b88610643565b90610693565b9801940194019294939190610766565b6108809167ffffffffffffffff6107c4836106e6565b16815261087261086761080c6107f16107e060208701876106fb565b60e0602088015260e087019161074e565b6107fe6040870187610643565b908683036040880152610693565b61082c61081b606087016106e6565b67ffffffffffffffff166060860152565b61084c61083b608087016106e6565b67ffffffffffffffff166080860152565b61085960a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b90565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761092361091861090784610880960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff6108f760408301610138565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106b4565b9060208184039101526107ae565b90602083828152019260208260051b82010193836000925b8484106109595750505050505090565b90919293949560208082601f1985600195030187526109788a87610611565b9082806109966109888580610643565b604086526040860191610693565b9301359101529801940194019294939190610949565b9190969593949660a08352803560a08401526020810135936004851015610083576104e896610a6b610a9894610a5d6109f4610a799660809a60c08b01526040810190610611565b606060e08a0152610a2c610a218a6101006040610a118680610643565b92909301526101408d0191610693565b916020810190610643565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008b8403016101208c0152610693565b908782036020890152610883565b918583036040870152610931565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610acc575050016000815290565b8060208092840101518185015201610abb565b6040513d6000823e3d90fd5b610c2873ffffffffffffffffffffffffffffffffffffffff806108809360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b766075826105db565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c0c816017840103601f1981018352826105db565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c7c573d9067ffffffffffffffff82116105fe5760405191610c70601f8201601f1916602001846105db565b82523d6000602084013e565b606090565b919060405192610c926040856105db565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610cc581610aeb565b93843b610d75576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d4b5781600092918360208194519301915af1610d09610c41565b50158015610d42575b610d1857565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d12565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe60e080604052346113dd57614085803803809161001c828561147b565b8339810160a0828203126113dd5781516001600160401b0381116113dd578201916060838303126113dd57604051926100548461140f565b80518452602081015160048110156113dd5760208501526040810151906001600160401b0382116113dd5701906040828403126113dd57604051916100988361142a565b80516001600160401b0381116113dd57846100b49183016114c1565b83526020810151906001600160401b0382116113dd576100d6918591016114c1565b602083810191909152604085019283528101516001600160401b0381116113dd578101906040828503126113dd57604051916101118361142a565b80516001600160401b0381116113dd5781016080818703126113dd576040519061013a82611445565b805182526020810151602083015261015460408201611516565b60408301526060810151906001600160401b0382116113dd57610179918891016114c1565b606082015283526020810151906001600160401b0382116113dd570160e0818603126113dd57604051906101ac82611460565b6101b58161152a565b825260208101516001600160401b0381116113dd57810186601f820112156113dd5780516101e28161153e565b916101f0604051938461147b565b81835260208084019260051b820101918983116113dd5760208201905b8382106113e25750505050602083015260408101516001600160401b0381116113dd578661023c9183016114c1565b604083015261024d6060820161152a565b606083015261025e6080820161152a565b608083015260a08101516001600160401b0381116113dd57866102829183016114c1565b60a083015260c0810151906001600160401b0382116113dd576102a7918791016114c1565b60c08201526020830190815260408201516001600160401b0381116113dd57820185601f820112156113dd578051906102df8261153e565b966102ed604051988961147b565b82885260208089019360051b830101918183116113dd5760208101935b83851061137557505050505061032e608061032760608501611516565b9301611516565b815184519094916001600160a01b03851615611364576001600160a01b03169081156113535760a086015151156113425760c0860151511561133157604001516001600160a01b03161561132057610900608052604094855190610392878361147b565b600182526020820191601f19880136843760016103ae8261157a565b526080519151885163338c1f5160e01b81526001600160401b0390911660048201526024810189905290516044820181905290926001600160a01b0390921691839160648301919060005b8181106113045750505091818060009403915afa9081156110ec57600091611119575b5061042d602061043792015161157a565b5151805190611614565b901561110857600080546001600160a01b0319166001600160a01b0392909216919091179055600180558751156110f75761090260a052855160c06104a160208351930151926104b389519485938493631e879a6d60e11b85528c60048601526044850190611555565b83810360031901602485015290611555565b03816109025afa9081156110ec57600091611046575b505060c05260005b865181101561066c5760008751821015610658575060208160051b880101516010546801000000000000000081101561062c5760018101806010558110156106425760106000528151805160019290921b7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019291906001600160401b03821161062c57610569826105638654611587565b866115d8565b602090601f83116001146105bd57926105a48360019796959460209489966000926105b2575b50508160011b916000199060031b1c19161790565b84555b0151910155016104d1565b01519050388061058f565b90601f1983169185600052816000209260005b818110610614575093602093600198979693899693838895106105fb575b505050811b0184556105a7565b015160001960f88460031b161c191690553880806105ee565b929360206001819287860151815501950193016105d0565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b50602087805160025501519460048610156110305760009560ff80196003541691161760035551805180519060018060401b03821161101c576106b0600454611587565b601f8111610fce575b50602090601f8311600114610f665791806106ed92602095948b92610f5b5750508160011b916000199060031b1c19161790565b6004555b01518051906001600160401b038211610f475761070f600554611587565b601f8111610f16575b50602090601f8311600114610eae57918061074c92606095948a92610ea35750508160011b916000199060031b1c19161790565b6005555b518051600655602081015160075584810151600880546001600160a01b0319166001600160a01b039290921691909117905501518051906001600160401b038211610b99576107a0600954611587565b601f8111610e55575b50602090601f8311600114610df0576107d99291879183610bad5750508160011b916000199060031b1c19161790565b6009555b518051600a80546001600160401b0319166001600160401b03929092169190911790556020810151805190680100000000000000008211610b9957600b5482600b55808310610d5c575b50600b865285907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020015b838310610c6b5750505050808301518051906001600160401b038211610b995761087f600c54611587565b601f8111610c1d575b50602090601f8311600114610bb8576108b89291879183610bad5750508160011b916000199060031b1c19161790565b600c555b6060810151600d805460808401516001600160801b03199091166001600160401b039384161790861b6fffffffffffffffff00000000000000001617905560a08201518051918211610b9957610913600e54611587565b601f8111610b4b575b50602090601f8311600114610ae35791806109509260c095948992610ad85750508160011b916000199060031b1c19161790565b600e555b0151805190936001600160401b038211610ac457610973600f54611587565b601f8111610a6b575b50602090601f8311600114610a0857906109ac939495836109fd5750508160011b916000199060031b1c19161790565b600f555b60118054610100600160a81b03191660089290921b610100600160a81b0316919091179055516128ab90816117da823960805181611ffc015260a05181611be6015260c051816107160152f35b01519050858061058f565b90601f198316600f8352818320925b818110610a5357509583600195969710610a3a575b505050811b01600f556109b0565b015160001960f88460031b161c19169055848080610a2c565b9192602060018192868b015181550194019201610a17565b600f8252610ab4907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f850160051c81019160208610610aba575b601f0160051c01906115c1565b8561097c565b9091508190610aa7565b634e487b7160e01b81526041600452602490fd5b01519050888061058f565b600e87528187209190601f198416885b818110610b33575091600193918560c097969410610b1a575b505050811b01600e55610954565b015160001960f88460031b161c19169055878080610b0c565b92936020600181928786015181550195019301610af3565b600e8752610b93907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd601f850160051c81019160208610610aba57601f0160051c01906115c1565b8661091c565b634e487b7160e01b86526041600452602486fd5b01519050878061058f565b600c87528187209190601f198416885b818110610c055750908460019594939210610bec575b505050811b01600c556108bc565b015160001960f88460031b161c19169055868080610bde565b92936020600181928786015181550195019301610bc8565b600c8752610c65907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f850160051c81019160208610610aba57601f0160051c01906115c1565b86610888565b80518051906001600160401b038211610d4857610c8c826105638654611587565b6020908a601f8411600114610cde578360019592946020948796610cc49492610cd35750508160011b916000199060031b1c19161790565b85555b01920192019190610854565b015190508e8061058f565b50848b52818b209190601f1984168c5b818110610d305750936020936001969387969383889510610d17575b505050811b018555610cc7565b015160001960f88460031b161c191690558d8080610d0a565b92936020600181928786015181550195019301610cee565b634e487b7160e01b8a52604160045260248afd5b600b87527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99081019083015b818110610d955750610827565b80610da260019254611587565b80610daf575b5001610d88565b601f81118314610dc457508881555b89610da8565b818a5260208a20610ddf91601f0160051c81019084016115c1565b808952886020812081835555610dbe565b600987528187209190601f198416885b818110610e3d5750908460019594939210610e24575b505050811b016009556107dd565b015160001960f88460031b161c19169055868080610e16565b92936020600181928786015181550195019301610e00565b60098752610e9d907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af601f850160051c81019160208610610aba57601f0160051c01906115c1565b866107a9565b01519050898061058f565b600588528188209190601f198416895b818110610efe5750916001939185606097969410610ee5575b505050811b01600555610750565b015160001960f88460031b161c19169055888080610ed7565b92936020600181928786015181550195019301610ebe565b610f41906005895260208920601f850160051c81019160208610610aba57601f0160051c01906115c1565b87610718565b634e487b7160e01b87526041600452602487fd5b015190508a8061058f565b600489528189209190601f1984168a5b818110610fb65750916001939185602097969410610f9d575b505050811b016004556106f1565b015160001960f88460031b161c19169055898080610f8f565b92936020600181928786015181550195019301610f76565b60048952611016907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610aba57601f0160051c01906115c1565b886106b9565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b600052602160045260246000fd5b8060c03d60c0116110e5575b61105c818361147b565b8101039160c083126110e257606088519361107685611445565b61107f8461152a565b855261108d6020850161152a565b602086015261109d8a850161152a565b858b0152605f1901126110e2575060a08751916110b98361140f565b6110c56060820161152a565b8352608081015160208401520151878201526060820152386104c9565b80fd5b503d611052565b86513d6000823e3d90fd5b63107d9ce760e31b60005260046000fd5b6307456b9160e21b60005260046000fd5b903d8082843e611129818461147b565b8201916020818403126112fc578051906001600160401b03821161130057019187838203126112fc5787519261115e8461142a565b80516001600160401b0381116112f857810160e0818403126112f85789519061118682611460565b61118f8161152a565b825261119d6020820161152a565b60208301526111ad8b820161152a565b8b830152606081015160038110156112f457606083015260808101516001600160401b0381116112f457816111e98660c09361120595016114c1565b60808501526111fa60a0820161152a565b60a08501520161152a565b60c082015284526020810151906001600160401b0382116112f8570181601f820112156113005780516112378161153e565b936112448b51958661147b565b81855260208086019260051b840101928484116112fc5760208101925b84841061127e57505050505060208301919091525061042d61041c565b83516001600160401b0381116112f85782018d601f1982890301126112f8578d51906112a98261142a565b60208101516001600160401b0381116112f457908f918960206112ce928401016114c1565b8352015160038110156112f05791816020938480940152815201930192611261565b8480fd5b8580fd5b8380fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103f9565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116113dd5782016040818503601f1901126113dd57604051916113a28361142a565b6020820151926001600160401b0384116113dd576040836113ca8860208098819801016114c1565b835201518382015281520194019361030a565b600080fd5b81516001600160401b0381116113dd576020916114048d8480948801016114c1565b81520191019061020d565b606081019081106001600160401b0382111761062c57604052565b604081019081106001600160401b0382111761062c57604052565b608081019081106001600160401b0382111761062c57604052565b60e081019081106001600160401b0382111761062c57604052565b601f909101601f19168101906001600160401b0382119082101761062c57604052565b60005b8381106114b15750506000910152565b81810151838201526020016114a1565b81601f820112156113dd5780516020909101906001600160401b03811161062c57604051926114fa601f8301601f19166020018561147b565b818452818301116113dd5761151391602084019061149e565b90565b51906001600160a01b03821682036113dd57565b51906001600160401b03821682036113dd57565b6001600160401b03811161062c5760051b60200190565b9060209161156e8151809281855285808601910161149e565b601f01601f1916010190565b8051156106425760200190565b90600182811c921680156115b7575b60208310146115a157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611596565b8181106115cc575050565b600081556001016115c1565b9190601f81116115e757505050565b611612926000526020600020906020601f840160051c83019310610aba57601f0160051c01906115c1565b565b90600061060f60f31b61ffff60f01b602085015116148060011b90808204600214901517156116895760280190816028116116755750810361166b57600061165b9261169d565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611731576000948101809111611753579192905b8183106116ed5750505060019190565b9092919360ff6117078160f81b6020888601015116611767565b16600f8111611747578160041b9180830460101490151715611731576001910194019192906116dd565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f8111806117cf575b1561178357602f190160ff1690565b60608111806117c5575b1561179c576056190160ff1690565b60408111806117bb575b156117b5576036190160ff1690565b5060ff90565b50604781106117a6565b506067811061178d565b50603a811061177456fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100b7578063229e81fb146100b257806342859ab3146100ad5780635a509280146100a857806362b61c8b146100a357806378b903371461009e578063819ef8ba1461009957806388328a6914610094578063b3d7ad481461008f5763cad31c741461008a57600080fd5b6110de565b610faf565b610ea5565b610d9a565b610b06565b610a8c565b610973565b61057b565b6104ba565b346100d95760006003193601126100d95760ff60115416151560805260206080f35b600080fd5b60009103126100d957565b90600182811c92168015610132575b602083101461010357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916100f8565b6004546000929161014c826100e9565b80825291600181169081156101c15750600114610167575050565b600460009081529293509091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8383106101a7575060209250010190565b600181602092949394548385870101520191019190610196565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6005546000929161020b826100e9565b80825291600181169081156101c15750600114610226575050565b600560009081529293509091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b838310610266575060209250010190565b600181602092949394548385870101520191019190610255565b60009291815491610290836100e9565b80835292600181169081156102e657506001146102ac57505050565b60009081526020812093945091925b8383106102cc575060209250010190565b6001816020929493945483858701015201910191906102bb565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761036d57604052565b610322565b60a0810190811067ffffffffffffffff82111761036d57604052565b6080810190811067ffffffffffffffff82111761036d57604052565b60e0810190811067ffffffffffffffff82111761036d57604052565b6060810190811067ffffffffffffffff82111761036d57604052565b90601f601f19910116810190811067ffffffffffffffff82111761036d57604052565b6040519061041f8261041881600e610280565b03836103e2565b565b6040519061041f8261041881600f610280565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561046d57565b610434565b60005b8381106104855750506000910152565b8181015183820152602001610475565b90601f19601f6020936104b381518092818752878088019101610472565b0116010190565b346100d95760006003193601126100d95760025460ff600354166040516104e081610351565b6040516104f7816104f08161013c565b03826103e2565b8152604051610509816104f0816101fb565b60208201908152604051938452600483101561046d57610546610577928594602086015260606040860152516040606086015260a0850190610495565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0848303016080850152610495565b0390f35b346100d95760a06003193601126100d9576004356024359060643591608435916002600154146108cc57600260015560115473ffffffffffffffffffffffffffffffffffffffff600882901c1633036108a25760ff16610878576105e46105e0611b97565b1590565b61084e5761062b6000936105f6611198565b9060405196879586957f62b61c8b000000000000000000000000000000000000000000000000000000008752600487016112d6565b0381305afa9081156107c857600090600092610826575b5061064c906113a5565b6106a96020604051610676816106688685830160209181520190565b03601f1981018352826103e2565b604051809381927fcad31c74000000000000000000000000000000000000000000000000000000008352600483016115af565b03816000305af180156107c8576106f4916000916107f7575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601154169115151617601155565b60115460ff166107cd575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100d9576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107c8576107ad575b5060115460ff1661079a60018055565b6040805191151582526020820192909252f35b806107bc60006107c2936103e2565b806100de565b3861078a565b611347565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a16106ff565b610819915060203d60201161081f575b61081181836103e2565b8101906114c9565b386106c2565b503d610807565b61064c925061084891503d806000833e61084081836103e2565b810190611266565b91610642565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100d95790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a0608061096a6060850151838386015260c0850190610495565b93015191015290565b346100d95760206003193601126100d95760043567ffffffffffffffff81116100d9576109a76105779136906004016108f6565b6109af6116df565b5073ffffffffffffffffffffffffffffffffffffffff6000541690610a2960408201356109db8161170a565b73ffffffffffffffffffffffffffffffffffffffff6020840135610a058535956060810190611732565b92909360405197610a1589610372565b885216602087015260408601523691611783565b6060830152608082015260405191829182610904565b9181601f840112156100d95782359167ffffffffffffffff83116100d9576020808501948460051b0101116100d957565b929190610a87602091604086526040860190610495565b930152565b346100d95760c06003193601126100d95760243560043560643560443560843567ffffffffffffffff81116100d957610ac9903690600401610a3f565b92909160a4359567ffffffffffffffff87116100d957610af0610af69736906004016108f6565b9561190d565b9061057760405192839283610a70565b346100d95760006003193601126100d9576020610b21611b97565b6040519015158152f35b60095460009291610b3b826100e9565b80825291600181169081156101c15750600114610b56575050565b600960009081529293509091907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b838310610b96575060209250010190565b600181602092949394548385870101520191019190610b85565b6040519061041f8261041881600c610280565b67ffffffffffffffff811161036d5760051b60200190565b600b5490610be882610bc3565b91610bf660405193846103e2565b808352600b60009081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602085015b838310610c335750505050565b600160208192604051610c4a816104f08189610280565b815201920192019190610c26565b9080602083519182815201916020808360051b8301019401926000915b838310610c8457505050505090565b9091929394602080610ca283601f1986600196030187528951610495565b97019301930191939290610c75565b610d026060610d979493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c0830190610495565b90602081830391015267ffffffffffffffff825116815260c0610d86610d4c610d3a602086015160e0602087015260e0860190610c58565b60408601518582036040870152610495565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a0860152610495565b9201519060c0818403910152610495565b90565b346100d95760006003193601126100d957604051610db78161038e565b6006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152604051610df2816104f081610b2b565b606082015260405190610e04826103aa565b67ffffffffffffffff600a54168252610e1b610bdb565b6020830152610e28610bb0565b6040830152610e7c610e6b600d54610e5b610e4a8267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610e84610405565b60a0830152610e91610421565b60c083015261057760405192839283610cb1565b346100d95760006003193601126100d95760ff6011541615610878576040516000601254610ed2816100e9565b8084529060018116908115610f6d5750600114610f0e575b61057783610efa818503826103e2565b604051918291602083526020830190610495565b601260009081527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444939250905b808210610f5357509091508101602001610efa610eea565b919260018160209254838588010152019101909291610f3b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610efa9050610eea565b346100d95760006003193601126100d957610fc86116df565b506040517f5a509280000000000000000000000000000000000000000000000000000000008152602060048201526000818061100660248201611297565b0381305afa9081156107c857600091611028575b604051806105778482610904565b3d8083833e61103781836103e2565b8101906020818303126110d65780519067ffffffffffffffff82116110da570160a0818303126110d6576040519161106e83610372565b81516110798161170a565b835260208201516110898161170a565b602084015260408201516040840152606082015167ffffffffffffffff81116110d257936110bf83926105779660809501611224565b606085015250015160808201529061101a565b8480fd5b8280fd5b8380fd5b346100d95760606003193601126100d95760043567ffffffffffffffff81116100d95760e060031982360301126100d9576024359067ffffffffffffffff82116100d957366023830112156100d95781600401359167ffffffffffffffff83116100d95736602484830101116100d9576044359067ffffffffffffffff82116100d95761057793611186936111796024943690600401610a3f565b9490930190600401611f57565b60405190151581529081906020820190565b604051906111a76020836103e2565b600080835282815b8281106111bb57505050565b8060606020809385010152016111af565b60405161014091906111de83826103e2565b6009815291601f19018260005b8281106111f757505050565b8060606020809385010152016111eb565b67ffffffffffffffff811161036d57601f01601f191660200190565b81601f820112156100d957805161123a81611208565b9261124860405194856103e2565b818452602082840101116100d957610d979160208085019101610472565b91906040838203126100d957825167ffffffffffffffff81116100d957602091611291918501611224565b92015190565b6080610d97916006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b929360809461130593610d979793865260208601526040850152606084015260c08484015260c0830190610c58565b9060a08183039101526006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b6040513d6000823e3d90fd5b601f821161136057505050565b6000526020600020906020601f840160051c8301931061139b575b601f0160051c01905b81811061138f575050565b60008155600101611384565b909150819061137b565b90815167ffffffffffffffff811161036d576113cd816113c66012546100e9565b6012611353565b602092601f821160011461142c5761141c92938291600092611421575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601255565b0151905038806113ea565b6012600052601f198216937fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449160005b8681106114b1575083600195961061147a575b505050811b01601255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061146f565b9192602060018192868501518155019401920161145c565b908160209103126100d9575180151581036100d95790565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061151357505050505090565b90919293946020600161153083601f198684960301875289610280565b97019301930191939290611504565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061157157505050505090565b90919293946020600282601f19856001950301865260408152611597604082018a610280565b9083858b015491015297019301930191939290611562565b6116cf610d9792606083526115e2606084016115d4600a5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e060808401526116c161168f6116326116016101408701600b6114e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600c610280565b600d5467ffffffffffffffff811660c088015261165d9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600e610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa085820301610120860152600f610280565b908382036020850152610495565b906040818303910152601061153f565b604051906116ec82610372565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100d957565b35610d978161170a565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d9576020019181360383136100d957565b92919261178f82611208565b9161179d60405193846103e2565b8294818452818301116100d9578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117f65760200190565b6117ba565b8051600110156117f65760400190565b8051600210156117f65760600190565b8051600310156117f65760800190565b8051600410156117f65760a00190565b8051600510156117f65760c00190565b8051600610156117f65760e00190565b8051600710156117f6576101000190565b8051600810156117f6576101200190565b80518210156117f65760209160051b010190565b92919261189d82610bc3565b936118ab60405195866103e2565b602085848152019260051b8201918183116100d95780935b8385106118d1575050505050565b843567ffffffffffffffff81116100d957820183601f820112156100d9576020916119028583858095359101611783565b8152019401936118c3565b9592909194939461191c6111cc565b9661192a6020860135612066565b611933896117e9565b5261193d886117e9565b50611947906125f9565b611950906120b8565b611959886117fb565b52611963876117fb565b5061196d906125f9565b611976906120b8565b61197f8761180b565b526119898661180b565b50611993906125f9565b61199c906120b8565b6119a58661181b565b526119af8561181b565b506119b9906125f9565b6119c2906120b8565b6119cb8561182b565b526119d58461182b565b506119e260408201611728565b6119eb90612077565b6119f48561183b565b526119fe8461183b565b50611a098135612066565b611a128561184b565b52611a1c8461184b565b5060608101611a2a91611732565b3690611a3592611783565b611a3e906120b8565b611a478461185b565b52611a518361185b565b503690611a5d92611891565b611a669061224c565b611a6f8261186c565b52611a798161186c565b50611a839061224c565b611a8b612520565b611a94906120b8565b90611a9e91612367565b908151602083012090565b67ffffffffffffffff8116036100d957565b8091039060c082126100d95760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611afa8661038e565b8351611b0581611aa9565b86526020840151611b1581611aa9565b60208701526040840151611b2881611aa9565b60408701520112611b6d5760a09060405192611b43846103c6565b6060820151611b5181611aa9565b8452608082015160208501525001516040820152606082015290565b5080fd5b610d979060408152611b87604082016004610280565b9060208183039101526005610280565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611bcd60048201611b71565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156107c857600091611c87575b5060035460ff16611c2781610463565b60018103611c4057506060015160400151600254111590565b611c4981610463565b611c5d576060015160400151600254101590565b7f951a55bf0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ca9915060c03d60c011611caf575b611ca181836103e2565b810190611abb565b38611c17565b503d611c97565b35610d9781611aa9565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d957602001918160051b360383136100d957565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100d957016020813591019167ffffffffffffffff82116100d95781360383136100d957565b90602083828152019160208260051b8501019381936000915b848310611dae5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100d957602080918760019401908280611e13611e058580611d35565b604086526040860191611d14565b9301359101529801930193019194939290611d9e565b90600282101561046d5752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff611e6695941681528160208201520191611d14565b938d6040818703910152808552602085019460208260051b82010195836000925b848410611f1f5750505050505094611ee98c9d60a0611ed861041f9e9f986101209e9c98611eca611f169f9d99611efa99611f079e8e6060818503910152611d14565b918b830360808d0152611d85565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152611d14565b91878303610100890152611d14565b93016001611e29565b909192939497602080611f4783601f198660019603018852611f418d88611d35565b90611d14565b9a01940194019294939190611e87565b9092939193611f6582611cb6565b92611f736020840184611cc0565b939092611f836040830183611732565b91909360608401611f9390611cb6565b91611fa060808601611cb6565b93611fae60a0870187611732565b97909660c08101611fbe91611732565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e611ff89f611e36565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107c85760009161204d575090565b610d97915060203d60201161081f5761081181836103e2565b612072610d97916125f9565b6120b8565b610d97906040519074140000000000000000000000000000000000000000186014820152603481016040526120b8565b9081518110156117f6570160200190565b60008151600181149081612234575b50156120d1575090565b815190603882101561212c5790610d9792917fff000000000000000000000000000000000000000000000000000000000000006121176080612111612408565b946126e4565b60f81b16901a612126826117e9565b53612367565b6001939092835b61213d8685612678565b1561215a5761214e612154916124f3565b956126b1565b94612133565b9092945092909261217261216d826126c8565b612446565b917fff000000000000000000000000000000000000000000000000000000000000006121a76121a26080856126e4565b6126d6565b60f81b16811a6121b6846117e9565b5360015b828111156121d057505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861222f96896124e6565b6126f1565b8b612678565b60ff1690565b60f81b16831a61222982876120a7565b536124f3565b6121ba565b9050156117f6576080602083015160f81c10386120c7565b6122559061278b565b8051600060388210156122965790610d9792917fff0000000000000000000000000000000000000000000000000000000000000061211760c0612111612408565b6001939092835b6122a78685612678565b156122be5761214e6122b8916124f3565b9461229d565b909294509290926122d161216d826126c8565b917fff000000000000000000000000000000000000000000000000000000000000006123016121a260c0856126e4565b60f81b16811a612310846117e9565b5360015b8281111561232a57505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861236296896124e6565b612314565b90604051918051908184526020840191840192602084019260208301905b8481106123d35750508051809386518201875294019360208086019201905b8281106123c35750509051603f92011590920101601f19166040525090565b81518152602091820191016123a4565b8151815260209182019101612385565b604080519091906123f483826103e2565b60208152918290601f190190369060200137565b6040805190919061241983826103e2565b6001815291601f1901366020840137565b604051906124396020836103e2565b6000808352366020840137565b9061245082611208565b61245d60405191826103e2565b828152601f1961246d8294611208565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60200390602082116124b457565b612477565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116124b457565b919082039182116124b457565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124b45760010190565b6125286123e3565b90600260208301526000915b602083106125b0575b61254961216d846124a6565b9060005b82518110156125a95760019061259561256f612568886124f3565b97856120a7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a6125a282866120a7565b530161254d565b5090925050565b916125e66125c161256f83866120a7565b7fff000000000000000000000000000000000000000000000000000000000000001690565b6125f35760010191612534565b9161253d565b906126026123e3565b9160208301526000915b60208310612654575b61262161216d846124a6565b9060005b82518110156125a95760019061264061256f612568886124f3565b60001a61264d82866120a7565b5301612625565b916126656125c161256f83866120a7565b612672576001019161260c565b91612615565b8115612682570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b908160081b9180830461010014901517156124b457565b90600182018092116124b457565b90603782018092116124b457565b919082018092116124b457565b601f81116124b4576101000a90565b1561270757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b9081511561282f57600091825b81518410156127d7576127cf6001916127bd6127b4878661187d565b51511515612700565b6127c7868561187d565b5151906126e4565b930192612798565b6127e391929350612446565b9060208201926000935b825185101561282857612820600191612816612809888761187d565b5160208151910183612839565b6127c7878661187d565b9401936127ed565b5092505090565b9050610d9761242a565b915b602081101561286e57602003602081116124b45761285b612860916126f1565b6124b9565b905182518216911916179052565b909182518152602081018091116124b45791602081018091116124b45790601f1981019081111561283b5761247756fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0x5ca5b1", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000004ee060a034607357601f614ec038819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b038116908190036073576001600055608052604051614e31908161008f823960805181818160b001526103720152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780633dc48a341461004d57637fddd6021461004857600080fd5b610217565b610159565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357606060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff821161008357610213926101d26101ec9336906004016100e4565b906101db610115565b9260843594600401906004016102a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761028960209161027361028160243560405192839187830195869091604092825260208201520190565b03601f1981018352826105db565b519020610aeb565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9293949190916002600054146105825760026000556040516102dd81610273602082019432869091604092825260208201520190565b519020946102ff6102f8876000526001602052604060002090565b5460ff1690565b610558576102736103b4936103a46103c0966102736103ba96328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36140859661034f60208901610603565b97808952610da060208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109ac565b6040519485936020850190610ab4565b90610ab4565b83610c81565b916103ca81610aeb565b73ffffffffffffffffffffffffffffffffffffffff84168015918215610537575b505061050a57813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af1908115610505576104999261046e926104ea575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907f51cd0090f3c14be5310fb02efc5d7f8aa69cff235becdf1d944ee6c420b2deb690602090a2906104e86001600055565b565b806104f960006104ff936105db565b806100d9565b3861045d565b610adf565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff161415905038806103eb565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176105fe57604052565b6105ac565b906104e860405192836105db565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107765750505050505090565b90919293949560208061079e83601f1986600196030188526107988b88610643565b90610693565b9801940194019294939190610766565b6108809167ffffffffffffffff6107c4836106e6565b16815261087261086761080c6107f16107e060208701876106fb565b60e0602088015260e087019161074e565b6107fe6040870187610643565b908683036040880152610693565b61082c61081b606087016106e6565b67ffffffffffffffff166060860152565b61084c61083b608087016106e6565b67ffffffffffffffff166080860152565b61085960a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b90565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761092361091861090784610880960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff6108f760408301610138565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106b4565b9060208184039101526107ae565b90602083828152019260208260051b82010193836000925b8484106109595750505050505090565b90919293949560208082601f1985600195030187526109788a87610611565b9082806109966109888580610643565b604086526040860191610693565b9301359101529801940194019294939190610949565b9190969593949660a08352803560a08401526020810135936004851015610083576104e896610a6b610a9894610a5d6109f4610a799660809a60c08b01526040810190610611565b606060e08a0152610a2c610a218a6101006040610a118680610643565b92909301526101408d0191610693565b916020810190610643565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008b8403016101208c0152610693565b908782036020890152610883565b918583036040870152610931565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610acc575050016000815290565b8060208092840101518185015201610abb565b6040513d6000823e3d90fd5b610c2873ffffffffffffffffffffffffffffffffffffffff806108809360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b766075826105db565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c0c816017840103601f1981018352826105db565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c7c573d9067ffffffffffffffff82116105fe5760405191610c70601f8201601f1916602001846105db565b82523d6000602084013e565b606090565b919060405192610c926040856105db565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610cc581610aeb565b93843b610d75576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d4b5781600092918360208194519301915af1610d09610c41565b50158015610d42575b610d1857565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d12565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe60e080604052346113dd57614085803803809161001c828561147b565b8339810160a0828203126113dd5781516001600160401b0381116113dd578201916060838303126113dd57604051926100548461140f565b80518452602081015160048110156113dd5760208501526040810151906001600160401b0382116113dd5701906040828403126113dd57604051916100988361142a565b80516001600160401b0381116113dd57846100b49183016114c1565b83526020810151906001600160401b0382116113dd576100d6918591016114c1565b602083810191909152604085019283528101516001600160401b0381116113dd578101906040828503126113dd57604051916101118361142a565b80516001600160401b0381116113dd5781016080818703126113dd576040519061013a82611445565b805182526020810151602083015261015460408201611516565b60408301526060810151906001600160401b0382116113dd57610179918891016114c1565b606082015283526020810151906001600160401b0382116113dd570160e0818603126113dd57604051906101ac82611460565b6101b58161152a565b825260208101516001600160401b0381116113dd57810186601f820112156113dd5780516101e28161153e565b916101f0604051938461147b565b81835260208084019260051b820101918983116113dd5760208201905b8382106113e25750505050602083015260408101516001600160401b0381116113dd578661023c9183016114c1565b604083015261024d6060820161152a565b606083015261025e6080820161152a565b608083015260a08101516001600160401b0381116113dd57866102829183016114c1565b60a083015260c0810151906001600160401b0382116113dd576102a7918791016114c1565b60c08201526020830190815260408201516001600160401b0381116113dd57820185601f820112156113dd578051906102df8261153e565b966102ed604051988961147b565b82885260208089019360051b830101918183116113dd5760208101935b83851061137557505050505061032e608061032760608501611516565b9301611516565b815184519094916001600160a01b03851615611364576001600160a01b03169081156113535760a086015151156113425760c0860151511561133157604001516001600160a01b03161561132057610900608052604094855190610392878361147b565b600182526020820191601f19880136843760016103ae8261157a565b526080519151885163338c1f5160e01b81526001600160401b0390911660048201526024810189905290516044820181905290926001600160a01b0390921691839160648301919060005b8181106113045750505091818060009403915afa9081156110ec57600091611119575b5061042d602061043792015161157a565b5151805190611614565b901561110857600080546001600160a01b0319166001600160a01b0392909216919091179055600180558751156110f75761090260a052855160c06104a160208351930151926104b389519485938493631e879a6d60e11b85528c60048601526044850190611555565b83810360031901602485015290611555565b03816109025afa9081156110ec57600091611046575b505060c05260005b865181101561066c5760008751821015610658575060208160051b880101516010546801000000000000000081101561062c5760018101806010558110156106425760106000528151805160019290921b7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019291906001600160401b03821161062c57610569826105638654611587565b866115d8565b602090601f83116001146105bd57926105a48360019796959460209489966000926105b2575b50508160011b916000199060031b1c19161790565b84555b0151910155016104d1565b01519050388061058f565b90601f1983169185600052816000209260005b818110610614575093602093600198979693899693838895106105fb575b505050811b0184556105a7565b015160001960f88460031b161c191690553880806105ee565b929360206001819287860151815501950193016105d0565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b50602087805160025501519460048610156110305760009560ff80196003541691161760035551805180519060018060401b03821161101c576106b0600454611587565b601f8111610fce575b50602090601f8311600114610f665791806106ed92602095948b92610f5b5750508160011b916000199060031b1c19161790565b6004555b01518051906001600160401b038211610f475761070f600554611587565b601f8111610f16575b50602090601f8311600114610eae57918061074c92606095948a92610ea35750508160011b916000199060031b1c19161790565b6005555b518051600655602081015160075584810151600880546001600160a01b0319166001600160a01b039290921691909117905501518051906001600160401b038211610b99576107a0600954611587565b601f8111610e55575b50602090601f8311600114610df0576107d99291879183610bad5750508160011b916000199060031b1c19161790565b6009555b518051600a80546001600160401b0319166001600160401b03929092169190911790556020810151805190680100000000000000008211610b9957600b5482600b55808310610d5c575b50600b865285907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020015b838310610c6b5750505050808301518051906001600160401b038211610b995761087f600c54611587565b601f8111610c1d575b50602090601f8311600114610bb8576108b89291879183610bad5750508160011b916000199060031b1c19161790565b600c555b6060810151600d805460808401516001600160801b03199091166001600160401b039384161790861b6fffffffffffffffff00000000000000001617905560a08201518051918211610b9957610913600e54611587565b601f8111610b4b575b50602090601f8311600114610ae35791806109509260c095948992610ad85750508160011b916000199060031b1c19161790565b600e555b0151805190936001600160401b038211610ac457610973600f54611587565b601f8111610a6b575b50602090601f8311600114610a0857906109ac939495836109fd5750508160011b916000199060031b1c19161790565b600f555b60118054610100600160a81b03191660089290921b610100600160a81b0316919091179055516128ab90816117da823960805181611ffc015260a05181611be6015260c051816107160152f35b01519050858061058f565b90601f198316600f8352818320925b818110610a5357509583600195969710610a3a575b505050811b01600f556109b0565b015160001960f88460031b161c19169055848080610a2c565b9192602060018192868b015181550194019201610a17565b600f8252610ab4907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f850160051c81019160208610610aba575b601f0160051c01906115c1565b8561097c565b9091508190610aa7565b634e487b7160e01b81526041600452602490fd5b01519050888061058f565b600e87528187209190601f198416885b818110610b33575091600193918560c097969410610b1a575b505050811b01600e55610954565b015160001960f88460031b161c19169055878080610b0c565b92936020600181928786015181550195019301610af3565b600e8752610b93907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd601f850160051c81019160208610610aba57601f0160051c01906115c1565b8661091c565b634e487b7160e01b86526041600452602486fd5b01519050878061058f565b600c87528187209190601f198416885b818110610c055750908460019594939210610bec575b505050811b01600c556108bc565b015160001960f88460031b161c19169055868080610bde565b92936020600181928786015181550195019301610bc8565b600c8752610c65907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f850160051c81019160208610610aba57601f0160051c01906115c1565b86610888565b80518051906001600160401b038211610d4857610c8c826105638654611587565b6020908a601f8411600114610cde578360019592946020948796610cc49492610cd35750508160011b916000199060031b1c19161790565b85555b01920192019190610854565b015190508e8061058f565b50848b52818b209190601f1984168c5b818110610d305750936020936001969387969383889510610d17575b505050811b018555610cc7565b015160001960f88460031b161c191690558d8080610d0a565b92936020600181928786015181550195019301610cee565b634e487b7160e01b8a52604160045260248afd5b600b87527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99081019083015b818110610d955750610827565b80610da260019254611587565b80610daf575b5001610d88565b601f81118314610dc457508881555b89610da8565b818a5260208a20610ddf91601f0160051c81019084016115c1565b808952886020812081835555610dbe565b600987528187209190601f198416885b818110610e3d5750908460019594939210610e24575b505050811b016009556107dd565b015160001960f88460031b161c19169055868080610e16565b92936020600181928786015181550195019301610e00565b60098752610e9d907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af601f850160051c81019160208610610aba57601f0160051c01906115c1565b866107a9565b01519050898061058f565b600588528188209190601f198416895b818110610efe5750916001939185606097969410610ee5575b505050811b01600555610750565b015160001960f88460031b161c19169055888080610ed7565b92936020600181928786015181550195019301610ebe565b610f41906005895260208920601f850160051c81019160208610610aba57601f0160051c01906115c1565b87610718565b634e487b7160e01b87526041600452602487fd5b015190508a8061058f565b600489528189209190601f1984168a5b818110610fb65750916001939185602097969410610f9d575b505050811b016004556106f1565b015160001960f88460031b161c19169055898080610f8f565b92936020600181928786015181550195019301610f76565b60048952611016907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610aba57601f0160051c01906115c1565b886106b9565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b600052602160045260246000fd5b8060c03d60c0116110e5575b61105c818361147b565b8101039160c083126110e257606088519361107685611445565b61107f8461152a565b855261108d6020850161152a565b602086015261109d8a850161152a565b858b0152605f1901126110e2575060a08751916110b98361140f565b6110c56060820161152a565b8352608081015160208401520151878201526060820152386104c9565b80fd5b503d611052565b86513d6000823e3d90fd5b63107d9ce760e31b60005260046000fd5b6307456b9160e21b60005260046000fd5b903d8082843e611129818461147b565b8201916020818403126112fc578051906001600160401b03821161130057019187838203126112fc5787519261115e8461142a565b80516001600160401b0381116112f857810160e0818403126112f85789519061118682611460565b61118f8161152a565b825261119d6020820161152a565b60208301526111ad8b820161152a565b8b830152606081015160038110156112f457606083015260808101516001600160401b0381116112f457816111e98660c09361120595016114c1565b60808501526111fa60a0820161152a565b60a08501520161152a565b60c082015284526020810151906001600160401b0382116112f8570181601f820112156113005780516112378161153e565b936112448b51958661147b565b81855260208086019260051b840101928484116112fc5760208101925b84841061127e57505050505060208301919091525061042d61041c565b83516001600160401b0381116112f85782018d601f1982890301126112f8578d51906112a98261142a565b60208101516001600160401b0381116112f457908f918960206112ce928401016114c1565b8352015160038110156112f05791816020938480940152815201930192611261565b8480fd5b8580fd5b8380fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103f9565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116113dd5782016040818503601f1901126113dd57604051916113a28361142a565b6020820151926001600160401b0384116113dd576040836113ca8860208098819801016114c1565b835201518382015281520194019361030a565b600080fd5b81516001600160401b0381116113dd576020916114048d8480948801016114c1565b81520191019061020d565b606081019081106001600160401b0382111761062c57604052565b604081019081106001600160401b0382111761062c57604052565b608081019081106001600160401b0382111761062c57604052565b60e081019081106001600160401b0382111761062c57604052565b601f909101601f19168101906001600160401b0382119082101761062c57604052565b60005b8381106114b15750506000910152565b81810151838201526020016114a1565b81601f820112156113dd5780516020909101906001600160401b03811161062c57604051926114fa601f8301601f19166020018561147b565b818452818301116113dd5761151391602084019061149e565b90565b51906001600160a01b03821682036113dd57565b51906001600160401b03821682036113dd57565b6001600160401b03811161062c5760051b60200190565b9060209161156e8151809281855285808601910161149e565b601f01601f1916010190565b8051156106425760200190565b90600182811c921680156115b7575b60208310146115a157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611596565b8181106115cc575050565b600081556001016115c1565b9190601f81116115e757505050565b611612926000526020600020906020601f840160051c83019310610aba57601f0160051c01906115c1565b565b90600061060f60f31b61ffff60f01b602085015116148060011b90808204600214901517156116895760280190816028116116755750810361166b57600061165b9261169d565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611731576000948101809111611753579192905b8183106116ed5750505060019190565b9092919360ff6117078160f81b6020888601015116611767565b16600f8111611747578160041b9180830460101490151715611731576001910194019192906116dd565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f8111806117cf575b1561178357602f190160ff1690565b60608111806117c5575b1561179c576056190160ff1690565b60408111806117bb575b156117b5576036190160ff1690565b5060ff90565b50604781106117a6565b506067811061178d565b50603a811061177456fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100b7578063229e81fb146100b257806342859ab3146100ad5780635a509280146100a857806362b61c8b146100a357806378b903371461009e578063819ef8ba1461009957806388328a6914610094578063b3d7ad481461008f5763cad31c741461008a57600080fd5b6110de565b610faf565b610ea5565b610d9a565b610b06565b610a8c565b610973565b61057b565b6104ba565b346100d95760006003193601126100d95760ff60115416151560805260206080f35b600080fd5b60009103126100d957565b90600182811c92168015610132575b602083101461010357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916100f8565b6004546000929161014c826100e9565b80825291600181169081156101c15750600114610167575050565b600460009081529293509091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8383106101a7575060209250010190565b600181602092949394548385870101520191019190610196565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6005546000929161020b826100e9565b80825291600181169081156101c15750600114610226575050565b600560009081529293509091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b838310610266575060209250010190565b600181602092949394548385870101520191019190610255565b60009291815491610290836100e9565b80835292600181169081156102e657506001146102ac57505050565b60009081526020812093945091925b8383106102cc575060209250010190565b6001816020929493945483858701015201910191906102bb565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761036d57604052565b610322565b60a0810190811067ffffffffffffffff82111761036d57604052565b6080810190811067ffffffffffffffff82111761036d57604052565b60e0810190811067ffffffffffffffff82111761036d57604052565b6060810190811067ffffffffffffffff82111761036d57604052565b90601f601f19910116810190811067ffffffffffffffff82111761036d57604052565b6040519061041f8261041881600e610280565b03836103e2565b565b6040519061041f8261041881600f610280565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561046d57565b610434565b60005b8381106104855750506000910152565b8181015183820152602001610475565b90601f19601f6020936104b381518092818752878088019101610472565b0116010190565b346100d95760006003193601126100d95760025460ff600354166040516104e081610351565b6040516104f7816104f08161013c565b03826103e2565b8152604051610509816104f0816101fb565b60208201908152604051938452600483101561046d57610546610577928594602086015260606040860152516040606086015260a0850190610495565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0848303016080850152610495565b0390f35b346100d95760a06003193601126100d9576004356024359060643591608435916002600154146108cc57600260015560115473ffffffffffffffffffffffffffffffffffffffff600882901c1633036108a25760ff16610878576105e46105e0611b97565b1590565b61084e5761062b6000936105f6611198565b9060405196879586957f62b61c8b000000000000000000000000000000000000000000000000000000008752600487016112d6565b0381305afa9081156107c857600090600092610826575b5061064c906113a5565b6106a96020604051610676816106688685830160209181520190565b03601f1981018352826103e2565b604051809381927fcad31c74000000000000000000000000000000000000000000000000000000008352600483016115af565b03816000305af180156107c8576106f4916000916107f7575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601154169115151617601155565b60115460ff166107cd575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100d9576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107c8576107ad575b5060115460ff1661079a60018055565b6040805191151582526020820192909252f35b806107bc60006107c2936103e2565b806100de565b3861078a565b611347565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a16106ff565b610819915060203d60201161081f575b61081181836103e2565b8101906114c9565b386106c2565b503d610807565b61064c925061084891503d806000833e61084081836103e2565b810190611266565b91610642565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100d95790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a0608061096a6060850151838386015260c0850190610495565b93015191015290565b346100d95760206003193601126100d95760043567ffffffffffffffff81116100d9576109a76105779136906004016108f6565b6109af6116df565b5073ffffffffffffffffffffffffffffffffffffffff6000541690610a2960408201356109db8161170a565b73ffffffffffffffffffffffffffffffffffffffff6020840135610a058535956060810190611732565b92909360405197610a1589610372565b885216602087015260408601523691611783565b6060830152608082015260405191829182610904565b9181601f840112156100d95782359167ffffffffffffffff83116100d9576020808501948460051b0101116100d957565b929190610a87602091604086526040860190610495565b930152565b346100d95760c06003193601126100d95760243560043560643560443560843567ffffffffffffffff81116100d957610ac9903690600401610a3f565b92909160a4359567ffffffffffffffff87116100d957610af0610af69736906004016108f6565b9561190d565b9061057760405192839283610a70565b346100d95760006003193601126100d9576020610b21611b97565b6040519015158152f35b60095460009291610b3b826100e9565b80825291600181169081156101c15750600114610b56575050565b600960009081529293509091907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b838310610b96575060209250010190565b600181602092949394548385870101520191019190610b85565b6040519061041f8261041881600c610280565b67ffffffffffffffff811161036d5760051b60200190565b600b5490610be882610bc3565b91610bf660405193846103e2565b808352600b60009081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602085015b838310610c335750505050565b600160208192604051610c4a816104f08189610280565b815201920192019190610c26565b9080602083519182815201916020808360051b8301019401926000915b838310610c8457505050505090565b9091929394602080610ca283601f1986600196030187528951610495565b97019301930191939290610c75565b610d026060610d979493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c0830190610495565b90602081830391015267ffffffffffffffff825116815260c0610d86610d4c610d3a602086015160e0602087015260e0860190610c58565b60408601518582036040870152610495565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a0860152610495565b9201519060c0818403910152610495565b90565b346100d95760006003193601126100d957604051610db78161038e565b6006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152604051610df2816104f081610b2b565b606082015260405190610e04826103aa565b67ffffffffffffffff600a54168252610e1b610bdb565b6020830152610e28610bb0565b6040830152610e7c610e6b600d54610e5b610e4a8267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610e84610405565b60a0830152610e91610421565b60c083015261057760405192839283610cb1565b346100d95760006003193601126100d95760ff6011541615610878576040516000601254610ed2816100e9565b8084529060018116908115610f6d5750600114610f0e575b61057783610efa818503826103e2565b604051918291602083526020830190610495565b601260009081527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444939250905b808210610f5357509091508101602001610efa610eea565b919260018160209254838588010152019101909291610f3b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610efa9050610eea565b346100d95760006003193601126100d957610fc86116df565b506040517f5a509280000000000000000000000000000000000000000000000000000000008152602060048201526000818061100660248201611297565b0381305afa9081156107c857600091611028575b604051806105778482610904565b3d8083833e61103781836103e2565b8101906020818303126110d65780519067ffffffffffffffff82116110da570160a0818303126110d6576040519161106e83610372565b81516110798161170a565b835260208201516110898161170a565b602084015260408201516040840152606082015167ffffffffffffffff81116110d257936110bf83926105779660809501611224565b606085015250015160808201529061101a565b8480fd5b8280fd5b8380fd5b346100d95760606003193601126100d95760043567ffffffffffffffff81116100d95760e060031982360301126100d9576024359067ffffffffffffffff82116100d957366023830112156100d95781600401359167ffffffffffffffff83116100d95736602484830101116100d9576044359067ffffffffffffffff82116100d95761057793611186936111796024943690600401610a3f565b9490930190600401611f57565b60405190151581529081906020820190565b604051906111a76020836103e2565b600080835282815b8281106111bb57505050565b8060606020809385010152016111af565b60405161014091906111de83826103e2565b6009815291601f19018260005b8281106111f757505050565b8060606020809385010152016111eb565b67ffffffffffffffff811161036d57601f01601f191660200190565b81601f820112156100d957805161123a81611208565b9261124860405194856103e2565b818452602082840101116100d957610d979160208085019101610472565b91906040838203126100d957825167ffffffffffffffff81116100d957602091611291918501611224565b92015190565b6080610d97916006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b929360809461130593610d979793865260208601526040850152606084015260c08484015260c0830190610c58565b9060a08183039101526006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b6040513d6000823e3d90fd5b601f821161136057505050565b6000526020600020906020601f840160051c8301931061139b575b601f0160051c01905b81811061138f575050565b60008155600101611384565b909150819061137b565b90815167ffffffffffffffff811161036d576113cd816113c66012546100e9565b6012611353565b602092601f821160011461142c5761141c92938291600092611421575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601255565b0151905038806113ea565b6012600052601f198216937fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449160005b8681106114b1575083600195961061147a575b505050811b01601255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061146f565b9192602060018192868501518155019401920161145c565b908160209103126100d9575180151581036100d95790565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061151357505050505090565b90919293946020600161153083601f198684960301875289610280565b97019301930191939290611504565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061157157505050505090565b90919293946020600282601f19856001950301865260408152611597604082018a610280565b9083858b015491015297019301930191939290611562565b6116cf610d9792606083526115e2606084016115d4600a5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e060808401526116c161168f6116326116016101408701600b6114e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600c610280565b600d5467ffffffffffffffff811660c088015261165d9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600e610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa085820301610120860152600f610280565b908382036020850152610495565b906040818303910152601061153f565b604051906116ec82610372565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100d957565b35610d978161170a565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d9576020019181360383136100d957565b92919261178f82611208565b9161179d60405193846103e2565b8294818452818301116100d9578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117f65760200190565b6117ba565b8051600110156117f65760400190565b8051600210156117f65760600190565b8051600310156117f65760800190565b8051600410156117f65760a00190565b8051600510156117f65760c00190565b8051600610156117f65760e00190565b8051600710156117f6576101000190565b8051600810156117f6576101200190565b80518210156117f65760209160051b010190565b92919261189d82610bc3565b936118ab60405195866103e2565b602085848152019260051b8201918183116100d95780935b8385106118d1575050505050565b843567ffffffffffffffff81116100d957820183601f820112156100d9576020916119028583858095359101611783565b8152019401936118c3565b9592909194939461191c6111cc565b9661192a6020860135612066565b611933896117e9565b5261193d886117e9565b50611947906125f9565b611950906120b8565b611959886117fb565b52611963876117fb565b5061196d906125f9565b611976906120b8565b61197f8761180b565b526119898661180b565b50611993906125f9565b61199c906120b8565b6119a58661181b565b526119af8561181b565b506119b9906125f9565b6119c2906120b8565b6119cb8561182b565b526119d58461182b565b506119e260408201611728565b6119eb90612077565b6119f48561183b565b526119fe8461183b565b50611a098135612066565b611a128561184b565b52611a1c8461184b565b5060608101611a2a91611732565b3690611a3592611783565b611a3e906120b8565b611a478461185b565b52611a518361185b565b503690611a5d92611891565b611a669061224c565b611a6f8261186c565b52611a798161186c565b50611a839061224c565b611a8b612520565b611a94906120b8565b90611a9e91612367565b908151602083012090565b67ffffffffffffffff8116036100d957565b8091039060c082126100d95760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611afa8661038e565b8351611b0581611aa9565b86526020840151611b1581611aa9565b60208701526040840151611b2881611aa9565b60408701520112611b6d5760a09060405192611b43846103c6565b6060820151611b5181611aa9565b8452608082015160208501525001516040820152606082015290565b5080fd5b610d979060408152611b87604082016004610280565b9060208183039101526005610280565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611bcd60048201611b71565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156107c857600091611c87575b5060035460ff16611c2781610463565b60018103611c4057506060015160400151600254111590565b611c4981610463565b611c5d576060015160400151600254101590565b7f951a55bf0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ca9915060c03d60c011611caf575b611ca181836103e2565b810190611abb565b38611c17565b503d611c97565b35610d9781611aa9565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d957602001918160051b360383136100d957565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100d957016020813591019167ffffffffffffffff82116100d95781360383136100d957565b90602083828152019160208260051b8501019381936000915b848310611dae5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100d957602080918760019401908280611e13611e058580611d35565b604086526040860191611d14565b9301359101529801930193019194939290611d9e565b90600282101561046d5752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff611e6695941681528160208201520191611d14565b938d6040818703910152808552602085019460208260051b82010195836000925b848410611f1f5750505050505094611ee98c9d60a0611ed861041f9e9f986101209e9c98611eca611f169f9d99611efa99611f079e8e6060818503910152611d14565b918b830360808d0152611d85565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152611d14565b91878303610100890152611d14565b93016001611e29565b909192939497602080611f4783601f198660019603018852611f418d88611d35565b90611d14565b9a01940194019294939190611e87565b9092939193611f6582611cb6565b92611f736020840184611cc0565b939092611f836040830183611732565b91909360608401611f9390611cb6565b91611fa060808601611cb6565b93611fae60a0870187611732565b97909660c08101611fbe91611732565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e611ff89f611e36565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107c85760009161204d575090565b610d97915060203d60201161081f5761081181836103e2565b612072610d97916125f9565b6120b8565b610d97906040519074140000000000000000000000000000000000000000186014820152603481016040526120b8565b9081518110156117f6570160200190565b60008151600181149081612234575b50156120d1575090565b815190603882101561212c5790610d9792917fff000000000000000000000000000000000000000000000000000000000000006121176080612111612408565b946126e4565b60f81b16901a612126826117e9565b53612367565b6001939092835b61213d8685612678565b1561215a5761214e612154916124f3565b956126b1565b94612133565b9092945092909261217261216d826126c8565b612446565b917fff000000000000000000000000000000000000000000000000000000000000006121a76121a26080856126e4565b6126d6565b60f81b16811a6121b6846117e9565b5360015b828111156121d057505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861222f96896124e6565b6126f1565b8b612678565b60ff1690565b60f81b16831a61222982876120a7565b536124f3565b6121ba565b9050156117f6576080602083015160f81c10386120c7565b6122559061278b565b8051600060388210156122965790610d9792917fff0000000000000000000000000000000000000000000000000000000000000061211760c0612111612408565b6001939092835b6122a78685612678565b156122be5761214e6122b8916124f3565b9461229d565b909294509290926122d161216d826126c8565b917fff000000000000000000000000000000000000000000000000000000000000006123016121a260c0856126e4565b60f81b16811a612310846117e9565b5360015b8281111561232a57505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861236296896124e6565b612314565b90604051918051908184526020840191840192602084019260208301905b8481106123d35750508051809386518201875294019360208086019201905b8281106123c35750509051603f92011590920101601f19166040525090565b81518152602091820191016123a4565b8151815260209182019101612385565b604080519091906123f483826103e2565b60208152918290601f190190369060200137565b6040805190919061241983826103e2565b6001815291601f1901366020840137565b604051906124396020836103e2565b6000808352366020840137565b9061245082611208565b61245d60405191826103e2565b828152601f1961246d8294611208565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60200390602082116124b457565b612477565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116124b457565b919082039182116124b457565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124b45760010190565b6125286123e3565b90600260208301526000915b602083106125b0575b61254961216d846124a6565b9060005b82518110156125a95760019061259561256f612568886124f3565b97856120a7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a6125a282866120a7565b530161254d565b5090925050565b916125e66125c161256f83866120a7565b7fff000000000000000000000000000000000000000000000000000000000000001690565b6125f35760010191612534565b9161253d565b906126026123e3565b9160208301526000915b60208310612654575b61262161216d846124a6565b9060005b82518110156125a95760019061264061256f612568886124f3565b60001a61264d82866120a7565b5301612625565b916126656125c161256f83866120a7565b612672576001019161260c565b91612615565b8115612682570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b908160081b9180830461010014901517156124b457565b90600182018092116124b457565b90603782018092116124b457565b919082018092116124b457565b601f81116124b4576101000a90565b1561270757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b9081511561282f57600091825b81518410156127d7576127cf6001916127bd6127b4878661187d565b51511515612700565b6127c7868561187d565b5151906126e4565b930192612798565b6127e391929350612446565b9060208201926000935b825185101561282857612820600191612816612809888761187d565b5160208151910183612839565b6127c7878661187d565b9401936127ed565b5092505090565b9050610d9761242a565b915b602081101561286e57602003602081116124b45761285b612860916126f1565b6124b9565b905182518216911916179052565b909182518152602081018091116124b45791602081018091116124b45790601f1981019081111561283b5761247756fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987", + "nonce": "0x2", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0x8f3415f4fed95503e1893ba98714129cc106b172", + "initCode": "0x60a034607357601f614ec038819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b038116908190036073576001600055608052604051614e31908161008f823960805181818160b001526103720152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780633dc48a341461004d57637fddd6021461004857600080fd5b610217565b610159565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357606060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff821161008357610213926101d26101ec9336906004016100e4565b906101db610115565b9260843594600401906004016102a7565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761028960209161027361028160243560405192839187830195869091604092825260208201520190565b03601f1981018352826105db565b519020610aeb565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9293949190916002600054146105825760026000556040516102dd81610273602082019432869091604092825260208201520190565b519020946102ff6102f8876000526001602052604060002090565b5460ff1690565b610558576102736103b4936103a46103c0966102736103ba96328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36140859661034f60208901610603565b97808952610da060208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109ac565b6040519485936020850190610ab4565b90610ab4565b83610c81565b916103ca81610aeb565b73ffffffffffffffffffffffffffffffffffffffff84168015918215610537575b505061050a57813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af1908115610505576104999261046e926104ea575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907f51cd0090f3c14be5310fb02efc5d7f8aa69cff235becdf1d944ee6c420b2deb690602090a2906104e86001600055565b565b806104f960006104ff936105db565b806100d9565b3861045d565b610adf565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff161415905038806103eb565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176105fe57604052565b6105ac565b906104e860405192836105db565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107765750505050505090565b90919293949560208061079e83601f1986600196030188526107988b88610643565b90610693565b9801940194019294939190610766565b6108809167ffffffffffffffff6107c4836106e6565b16815261087261086761080c6107f16107e060208701876106fb565b60e0602088015260e087019161074e565b6107fe6040870187610643565b908683036040880152610693565b61082c61081b606087016106e6565b67ffffffffffffffff166060860152565b61084c61083b608087016106e6565b67ffffffffffffffff166080860152565b61085960a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b90565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761092361091861090784610880960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff6108f760408301610138565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106b4565b9060208184039101526107ae565b90602083828152019260208260051b82010193836000925b8484106109595750505050505090565b90919293949560208082601f1985600195030187526109788a87610611565b9082806109966109888580610643565b604086526040860191610693565b9301359101529801940194019294939190610949565b9190969593949660a08352803560a08401526020810135936004851015610083576104e896610a6b610a9894610a5d6109f4610a799660809a60c08b01526040810190610611565b606060e08a0152610a2c610a218a6101006040610a118680610643565b92909301526101408d0191610693565b916020810190610643565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008b8403016101208c0152610693565b908782036020890152610883565b918583036040870152610931565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610acc575050016000815290565b8060208092840101518185015201610abb565b6040513d6000823e3d90fd5b610c2873ffffffffffffffffffffffffffffffffffffffff806108809360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b766075826105db565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c0c816017840103601f1981018352826105db565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c7c573d9067ffffffffffffffff82116105fe5760405191610c70601f8201601f1916602001846105db565b82523d6000602084013e565b606090565b919060405192610c926040856105db565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610cc581610aeb565b93843b610d75576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d4b5781600092918360208194519301915af1610d09610c41565b50158015610d42575b610d1857565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d12565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe60e080604052346113dd57614085803803809161001c828561147b565b8339810160a0828203126113dd5781516001600160401b0381116113dd578201916060838303126113dd57604051926100548461140f565b80518452602081015160048110156113dd5760208501526040810151906001600160401b0382116113dd5701906040828403126113dd57604051916100988361142a565b80516001600160401b0381116113dd57846100b49183016114c1565b83526020810151906001600160401b0382116113dd576100d6918591016114c1565b602083810191909152604085019283528101516001600160401b0381116113dd578101906040828503126113dd57604051916101118361142a565b80516001600160401b0381116113dd5781016080818703126113dd576040519061013a82611445565b805182526020810151602083015261015460408201611516565b60408301526060810151906001600160401b0382116113dd57610179918891016114c1565b606082015283526020810151906001600160401b0382116113dd570160e0818603126113dd57604051906101ac82611460565b6101b58161152a565b825260208101516001600160401b0381116113dd57810186601f820112156113dd5780516101e28161153e565b916101f0604051938461147b565b81835260208084019260051b820101918983116113dd5760208201905b8382106113e25750505050602083015260408101516001600160401b0381116113dd578661023c9183016114c1565b604083015261024d6060820161152a565b606083015261025e6080820161152a565b608083015260a08101516001600160401b0381116113dd57866102829183016114c1565b60a083015260c0810151906001600160401b0382116113dd576102a7918791016114c1565b60c08201526020830190815260408201516001600160401b0381116113dd57820185601f820112156113dd578051906102df8261153e565b966102ed604051988961147b565b82885260208089019360051b830101918183116113dd5760208101935b83851061137557505050505061032e608061032760608501611516565b9301611516565b815184519094916001600160a01b03851615611364576001600160a01b03169081156113535760a086015151156113425760c0860151511561133157604001516001600160a01b03161561132057610900608052604094855190610392878361147b565b600182526020820191601f19880136843760016103ae8261157a565b526080519151885163338c1f5160e01b81526001600160401b0390911660048201526024810189905290516044820181905290926001600160a01b0390921691839160648301919060005b8181106113045750505091818060009403915afa9081156110ec57600091611119575b5061042d602061043792015161157a565b5151805190611614565b901561110857600080546001600160a01b0319166001600160a01b0392909216919091179055600180558751156110f75761090260a052855160c06104a160208351930151926104b389519485938493631e879a6d60e11b85528c60048601526044850190611555565b83810360031901602485015290611555565b03816109025afa9081156110ec57600091611046575b505060c05260005b865181101561066c5760008751821015610658575060208160051b880101516010546801000000000000000081101561062c5760018101806010558110156106425760106000528151805160019290921b7f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672019291906001600160401b03821161062c57610569826105638654611587565b866115d8565b602090601f83116001146105bd57926105a48360019796959460209489966000926105b2575b50508160011b916000199060031b1c19161790565b84555b0151910155016104d1565b01519050388061058f565b90601f1983169185600052816000209260005b818110610614575093602093600198979693899693838895106105fb575b505050811b0184556105a7565b015160001960f88460031b161c191690553880806105ee565b929360206001819287860151815501950193016105d0565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b50602087805160025501519460048610156110305760009560ff80196003541691161760035551805180519060018060401b03821161101c576106b0600454611587565b601f8111610fce575b50602090601f8311600114610f665791806106ed92602095948b92610f5b5750508160011b916000199060031b1c19161790565b6004555b01518051906001600160401b038211610f475761070f600554611587565b601f8111610f16575b50602090601f8311600114610eae57918061074c92606095948a92610ea35750508160011b916000199060031b1c19161790565b6005555b518051600655602081015160075584810151600880546001600160a01b0319166001600160a01b039290921691909117905501518051906001600160401b038211610b99576107a0600954611587565b601f8111610e55575b50602090601f8311600114610df0576107d99291879183610bad5750508160011b916000199060031b1c19161790565b6009555b518051600a80546001600160401b0319166001600160401b03929092169190911790556020810151805190680100000000000000008211610b9957600b5482600b55808310610d5c575b50600b865285907f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9906020015b838310610c6b5750505050808301518051906001600160401b038211610b995761087f600c54611587565b601f8111610c1d575b50602090601f8311600114610bb8576108b89291879183610bad5750508160011b916000199060031b1c19161790565b600c555b6060810151600d805460808401516001600160801b03199091166001600160401b039384161790861b6fffffffffffffffff00000000000000001617905560a08201518051918211610b9957610913600e54611587565b601f8111610b4b575b50602090601f8311600114610ae35791806109509260c095948992610ad85750508160011b916000199060031b1c19161790565b600e555b0151805190936001600160401b038211610ac457610973600f54611587565b601f8111610a6b575b50602090601f8311600114610a0857906109ac939495836109fd5750508160011b916000199060031b1c19161790565b600f555b60118054610100600160a81b03191660089290921b610100600160a81b0316919091179055516128ab90816117da823960805181611ffc015260a05181611be6015260c051816107160152f35b01519050858061058f565b90601f198316600f8352818320925b818110610a5357509583600195969710610a3a575b505050811b01600f556109b0565b015160001960f88460031b161c19169055848080610a2c565b9192602060018192868b015181550194019201610a17565b600f8252610ab4907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f850160051c81019160208610610aba575b601f0160051c01906115c1565b8561097c565b9091508190610aa7565b634e487b7160e01b81526041600452602490fd5b01519050888061058f565b600e87528187209190601f198416885b818110610b33575091600193918560c097969410610b1a575b505050811b01600e55610954565b015160001960f88460031b161c19169055878080610b0c565b92936020600181928786015181550195019301610af3565b600e8752610b93907fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd601f850160051c81019160208610610aba57601f0160051c01906115c1565b8661091c565b634e487b7160e01b86526041600452602486fd5b01519050878061058f565b600c87528187209190601f198416885b818110610c055750908460019594939210610bec575b505050811b01600c556108bc565b015160001960f88460031b161c19169055868080610bde565b92936020600181928786015181550195019301610bc8565b600c8752610c65907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f850160051c81019160208610610aba57601f0160051c01906115c1565b86610888565b80518051906001600160401b038211610d4857610c8c826105638654611587565b6020908a601f8411600114610cde578360019592946020948796610cc49492610cd35750508160011b916000199060031b1c19161790565b85555b01920192019190610854565b015190508e8061058f565b50848b52818b209190601f1984168c5b818110610d305750936020936001969387969383889510610d17575b505050811b018555610cc7565b015160001960f88460031b161c191690558d8080610d0a565b92936020600181928786015181550195019301610cee565b634e487b7160e01b8a52604160045260248afd5b600b87527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99081019083015b818110610d955750610827565b80610da260019254611587565b80610daf575b5001610d88565b601f81118314610dc457508881555b89610da8565b818a5260208a20610ddf91601f0160051c81019084016115c1565b808952886020812081835555610dbe565b600987528187209190601f198416885b818110610e3d5750908460019594939210610e24575b505050811b016009556107dd565b015160001960f88460031b161c19169055868080610e16565b92936020600181928786015181550195019301610e00565b60098752610e9d907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af601f850160051c81019160208610610aba57601f0160051c01906115c1565b866107a9565b01519050898061058f565b600588528188209190601f198416895b818110610efe5750916001939185606097969410610ee5575b505050811b01600555610750565b015160001960f88460031b161c19169055888080610ed7565b92936020600181928786015181550195019301610ebe565b610f41906005895260208920601f850160051c81019160208610610aba57601f0160051c01906115c1565b87610718565b634e487b7160e01b87526041600452602487fd5b015190508a8061058f565b600489528189209190601f1984168a5b818110610fb65750916001939185602097969410610f9d575b505050811b016004556106f1565b015160001960f88460031b161c19169055898080610f8f565b92936020600181928786015181550195019301610f76565b60048952611016907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610aba57601f0160051c01906115c1565b886106b9565b634e487b7160e01b88526041600452602488fd5b634e487b7160e01b600052602160045260246000fd5b8060c03d60c0116110e5575b61105c818361147b565b8101039160c083126110e257606088519361107685611445565b61107f8461152a565b855261108d6020850161152a565b602086015261109d8a850161152a565b858b0152605f1901126110e2575060a08751916110b98361140f565b6110c56060820161152a565b8352608081015160208401520151878201526060820152386104c9565b80fd5b503d611052565b86513d6000823e3d90fd5b63107d9ce760e31b60005260046000fd5b6307456b9160e21b60005260046000fd5b903d8082843e611129818461147b565b8201916020818403126112fc578051906001600160401b03821161130057019187838203126112fc5787519261115e8461142a565b80516001600160401b0381116112f857810160e0818403126112f85789519061118682611460565b61118f8161152a565b825261119d6020820161152a565b60208301526111ad8b820161152a565b8b830152606081015160038110156112f457606083015260808101516001600160401b0381116112f457816111e98660c09361120595016114c1565b60808501526111fa60a0820161152a565b60a08501520161152a565b60c082015284526020810151906001600160401b0382116112f8570181601f820112156113005780516112378161153e565b936112448b51958661147b565b81855260208086019260051b840101928484116112fc5760208101925b84841061127e57505050505060208301919091525061042d61041c565b83516001600160401b0381116112f85782018d601f1982890301126112f8578d51906112a98261142a565b60208101516001600160401b0381116112f457908f918960206112ce928401016114c1565b8352015160038110156112f05791816020938480940152815201930192611261565b8480fd5b8580fd5b8380fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103f9565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116113dd5782016040818503601f1901126113dd57604051916113a28361142a565b6020820151926001600160401b0384116113dd576040836113ca8860208098819801016114c1565b835201518382015281520194019361030a565b600080fd5b81516001600160401b0381116113dd576020916114048d8480948801016114c1565b81520191019061020d565b606081019081106001600160401b0382111761062c57604052565b604081019081106001600160401b0382111761062c57604052565b608081019081106001600160401b0382111761062c57604052565b60e081019081106001600160401b0382111761062c57604052565b601f909101601f19168101906001600160401b0382119082101761062c57604052565b60005b8381106114b15750506000910152565b81810151838201526020016114a1565b81601f820112156113dd5780516020909101906001600160401b03811161062c57604051926114fa601f8301601f19166020018561147b565b818452818301116113dd5761151391602084019061149e565b90565b51906001600160a01b03821682036113dd57565b51906001600160401b03821682036113dd57565b6001600160401b03811161062c5760051b60200190565b9060209161156e8151809281855285808601910161149e565b601f01601f1916010190565b8051156106425760200190565b90600182811c921680156115b7575b60208310146115a157565b634e487b7160e01b600052602260045260246000fd5b91607f1691611596565b8181106115cc575050565b600081556001016115c1565b9190601f81116115e757505050565b611612926000526020600020906020601f840160051c83019310610aba57601f0160051c01906115c1565b565b90600061060f60f31b61ffff60f01b602085015116148060011b90808204600214901517156116895760280190816028116116755750810361166b57600061165b9261169d565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611731576000948101809111611753579192905b8183106116ed5750505060019190565b9092919360ff6117078160f81b6020888601015116611767565b16600f8111611747578160041b9180830460101490151715611731576001910194019192906116dd565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f8111806117cf575b1561178357602f190160ff1690565b60608111806117c5575b1561179c576056190160ff1690565b60408111806117bb575b156117b5576036190160ff1690565b5060ff90565b50604781106117a6565b506067811061178d565b50603a811061177456fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100b7578063229e81fb146100b257806342859ab3146100ad5780635a509280146100a857806362b61c8b146100a357806378b903371461009e578063819ef8ba1461009957806388328a6914610094578063b3d7ad481461008f5763cad31c741461008a57600080fd5b6110de565b610faf565b610ea5565b610d9a565b610b06565b610a8c565b610973565b61057b565b6104ba565b346100d95760006003193601126100d95760ff60115416151560805260206080f35b600080fd5b60009103126100d957565b90600182811c92168015610132575b602083101461010357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916100f8565b6004546000929161014c826100e9565b80825291600181169081156101c15750600114610167575050565b600460009081529293509091907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8383106101a7575060209250010190565b600181602092949394548385870101520191019190610196565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6005546000929161020b826100e9565b80825291600181169081156101c15750600114610226575050565b600560009081529293509091907f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b838310610266575060209250010190565b600181602092949394548385870101520191019190610255565b60009291815491610290836100e9565b80835292600181169081156102e657506001146102ac57505050565b60009081526020812093945091925b8383106102cc575060209250010190565b6001816020929493945483858701015201910191906102bb565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761036d57604052565b610322565b60a0810190811067ffffffffffffffff82111761036d57604052565b6080810190811067ffffffffffffffff82111761036d57604052565b60e0810190811067ffffffffffffffff82111761036d57604052565b6060810190811067ffffffffffffffff82111761036d57604052565b90601f601f19910116810190811067ffffffffffffffff82111761036d57604052565b6040519061041f8261041881600e610280565b03836103e2565b565b6040519061041f8261041881600f610280565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561046d57565b610434565b60005b8381106104855750506000910152565b8181015183820152602001610475565b90601f19601f6020936104b381518092818752878088019101610472565b0116010190565b346100d95760006003193601126100d95760025460ff600354166040516104e081610351565b6040516104f7816104f08161013c565b03826103e2565b8152604051610509816104f0816101fb565b60208201908152604051938452600483101561046d57610546610577928594602086015260606040860152516040606086015260a0850190610495565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0848303016080850152610495565b0390f35b346100d95760a06003193601126100d9576004356024359060643591608435916002600154146108cc57600260015560115473ffffffffffffffffffffffffffffffffffffffff600882901c1633036108a25760ff16610878576105e46105e0611b97565b1590565b61084e5761062b6000936105f6611198565b9060405196879586957f62b61c8b000000000000000000000000000000000000000000000000000000008752600487016112d6565b0381305afa9081156107c857600090600092610826575b5061064c906113a5565b6106a96020604051610676816106688685830160209181520190565b03601f1981018352826103e2565b604051809381927fcad31c74000000000000000000000000000000000000000000000000000000008352600483016115af565b03816000305af180156107c8576106f4916000916107f7575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601154169115151617601155565b60115460ff166107cd575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100d9576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107c8576107ad575b5060115460ff1661079a60018055565b6040805191151582526020820192909252f35b806107bc60006107c2936103e2565b806100de565b3861078a565b611347565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a16106ff565b610819915060203d60201161081f575b61081181836103e2565b8101906114c9565b386106c2565b503d610807565b61064c925061084891503d806000833e61084081836103e2565b810190611266565b91610642565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100d95790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a0608061096a6060850151838386015260c0850190610495565b93015191015290565b346100d95760206003193601126100d95760043567ffffffffffffffff81116100d9576109a76105779136906004016108f6565b6109af6116df565b5073ffffffffffffffffffffffffffffffffffffffff6000541690610a2960408201356109db8161170a565b73ffffffffffffffffffffffffffffffffffffffff6020840135610a058535956060810190611732565b92909360405197610a1589610372565b885216602087015260408601523691611783565b6060830152608082015260405191829182610904565b9181601f840112156100d95782359167ffffffffffffffff83116100d9576020808501948460051b0101116100d957565b929190610a87602091604086526040860190610495565b930152565b346100d95760c06003193601126100d95760243560043560643560443560843567ffffffffffffffff81116100d957610ac9903690600401610a3f565b92909160a4359567ffffffffffffffff87116100d957610af0610af69736906004016108f6565b9561190d565b9061057760405192839283610a70565b346100d95760006003193601126100d9576020610b21611b97565b6040519015158152f35b60095460009291610b3b826100e9565b80825291600181169081156101c15750600114610b56575050565b600960009081529293509091907f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af5b838310610b96575060209250010190565b600181602092949394548385870101520191019190610b85565b6040519061041f8261041881600c610280565b67ffffffffffffffff811161036d5760051b60200190565b600b5490610be882610bc3565b91610bf660405193846103e2565b808352600b60009081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9602085015b838310610c335750505050565b600160208192604051610c4a816104f08189610280565b815201920192019190610c26565b9080602083519182815201916020808360051b8301019401926000915b838310610c8457505050505090565b9091929394602080610ca283601f1986600196030187528951610495565b97019301930191939290610c75565b610d026060610d979493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c0830190610495565b90602081830391015267ffffffffffffffff825116815260c0610d86610d4c610d3a602086015160e0602087015260e0860190610c58565b60408601518582036040870152610495565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a0860152610495565b9201519060c0818403910152610495565b90565b346100d95760006003193601126100d957604051610db78161038e565b6006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152604051610df2816104f081610b2b565b606082015260405190610e04826103aa565b67ffffffffffffffff600a54168252610e1b610bdb565b6020830152610e28610bb0565b6040830152610e7c610e6b600d54610e5b610e4a8267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610e84610405565b60a0830152610e91610421565b60c083015261057760405192839283610cb1565b346100d95760006003193601126100d95760ff6011541615610878576040516000601254610ed2816100e9565b8084529060018116908115610f6d5750600114610f0e575b61057783610efa818503826103e2565b604051918291602083526020830190610495565b601260009081527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444939250905b808210610f5357509091508101602001610efa610eea565b919260018160209254838588010152019101909291610f3b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610efa9050610eea565b346100d95760006003193601126100d957610fc86116df565b506040517f5a509280000000000000000000000000000000000000000000000000000000008152602060048201526000818061100660248201611297565b0381305afa9081156107c857600091611028575b604051806105778482610904565b3d8083833e61103781836103e2565b8101906020818303126110d65780519067ffffffffffffffff82116110da570160a0818303126110d6576040519161106e83610372565b81516110798161170a565b835260208201516110898161170a565b602084015260408201516040840152606082015167ffffffffffffffff81116110d257936110bf83926105779660809501611224565b606085015250015160808201529061101a565b8480fd5b8280fd5b8380fd5b346100d95760606003193601126100d95760043567ffffffffffffffff81116100d95760e060031982360301126100d9576024359067ffffffffffffffff82116100d957366023830112156100d95781600401359167ffffffffffffffff83116100d95736602484830101116100d9576044359067ffffffffffffffff82116100d95761057793611186936111796024943690600401610a3f565b9490930190600401611f57565b60405190151581529081906020820190565b604051906111a76020836103e2565b600080835282815b8281106111bb57505050565b8060606020809385010152016111af565b60405161014091906111de83826103e2565b6009815291601f19018260005b8281106111f757505050565b8060606020809385010152016111eb565b67ffffffffffffffff811161036d57601f01601f191660200190565b81601f820112156100d957805161123a81611208565b9261124860405194856103e2565b818452602082840101116100d957610d979160208085019101610472565b91906040838203126100d957825167ffffffffffffffff81116100d957602091611291918501611224565b92015190565b6080610d97916006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b929360809461130593610d979793865260208601526040850152606084015260c08484015260c0830190610c58565b9060a08183039101526006548152600754602082015273ffffffffffffffffffffffffffffffffffffffff600854166040820152816060820152016009610280565b6040513d6000823e3d90fd5b601f821161136057505050565b6000526020600020906020601f840160051c8301931061139b575b601f0160051c01905b81811061138f575050565b60008155600101611384565b909150819061137b565b90815167ffffffffffffffff811161036d576113cd816113c66012546100e9565b6012611353565b602092601f821160011461142c5761141c92938291600092611421575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601255565b0151905038806113ea565b6012600052601f198216937fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34449160005b8681106114b1575083600195961061147a575b505050811b01601255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061146f565b9192602060018192868501518155019401920161145c565b908160209103126100d9575180151581036100d95790565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061151357505050505090565b90919293946020600161153083601f198684960301875289610280565b97019301930191939290611504565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061157157505050505090565b90919293946020600282601f19856001950301865260408152611597604082018a610280565b9083858b015491015297019301930191939290611562565b6116cf610d9792606083526115e2606084016115d4600a5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e060808401526116c161168f6116326116016101408701600b6114e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600c610280565b600d5467ffffffffffffffff811660c088015261165d9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600e610280565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa085820301610120860152600f610280565b908382036020850152610495565b906040818303910152601061153f565b604051906116ec82610372565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100d957565b35610d978161170a565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d9576020019181360383136100d957565b92919261178f82611208565b9161179d60405193846103e2565b8294818452818301116100d9578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117f65760200190565b6117ba565b8051600110156117f65760400190565b8051600210156117f65760600190565b8051600310156117f65760800190565b8051600410156117f65760a00190565b8051600510156117f65760c00190565b8051600610156117f65760e00190565b8051600710156117f6576101000190565b8051600810156117f6576101200190565b80518210156117f65760209160051b010190565b92919261189d82610bc3565b936118ab60405195866103e2565b602085848152019260051b8201918183116100d95780935b8385106118d1575050505050565b843567ffffffffffffffff81116100d957820183601f820112156100d9576020916119028583858095359101611783565b8152019401936118c3565b9592909194939461191c6111cc565b9661192a6020860135612066565b611933896117e9565b5261193d886117e9565b50611947906125f9565b611950906120b8565b611959886117fb565b52611963876117fb565b5061196d906125f9565b611976906120b8565b61197f8761180b565b526119898661180b565b50611993906125f9565b61199c906120b8565b6119a58661181b565b526119af8561181b565b506119b9906125f9565b6119c2906120b8565b6119cb8561182b565b526119d58461182b565b506119e260408201611728565b6119eb90612077565b6119f48561183b565b526119fe8461183b565b50611a098135612066565b611a128561184b565b52611a1c8461184b565b5060608101611a2a91611732565b3690611a3592611783565b611a3e906120b8565b611a478461185b565b52611a518361185b565b503690611a5d92611891565b611a669061224c565b611a6f8261186c565b52611a798161186c565b50611a839061224c565b611a8b612520565b611a94906120b8565b90611a9e91612367565b908151602083012090565b67ffffffffffffffff8116036100d957565b8091039060c082126100d95760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611afa8661038e565b8351611b0581611aa9565b86526020840151611b1581611aa9565b60208701526040840151611b2881611aa9565b60408701520112611b6d5760a09060405192611b43846103c6565b6060820151611b5181611aa9565b8452608082015160208501525001516040820152606082015290565b5080fd5b610d979060408152611b87604082016004610280565b9060208183039101526005610280565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611bcd60048201611b71565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156107c857600091611c87575b5060035460ff16611c2781610463565b60018103611c4057506060015160400151600254111590565b611c4981610463565b611c5d576060015160400151600254101590565b7f951a55bf0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ca9915060c03d60c011611caf575b611ca181836103e2565b810190611abb565b38611c17565b503d611c97565b35610d9781611aa9565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100d9570180359067ffffffffffffffff82116100d957602001918160051b360383136100d957565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100d957016020813591019167ffffffffffffffff82116100d95781360383136100d957565b90602083828152019160208260051b8501019381936000915b848310611dae5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100d957602080918760019401908280611e13611e058580611d35565b604086526040860191611d14565b9301359101529801930193019194939290611d9e565b90600282101561046d5752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff611e6695941681528160208201520191611d14565b938d6040818703910152808552602085019460208260051b82010195836000925b848410611f1f5750505050505094611ee98c9d60a0611ed861041f9e9f986101209e9c98611eca611f169f9d99611efa99611f079e8e6060818503910152611d14565b918b830360808d0152611d85565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152611d14565b91878303610100890152611d14565b93016001611e29565b909192939497602080611f4783601f198660019603018852611f418d88611d35565b90611d14565b9a01940194019294939190611e87565b9092939193611f6582611cb6565b92611f736020840184611cc0565b939092611f836040830183611732565b91909360608401611f9390611cb6565b91611fa060808601611cb6565b93611fae60a0870187611732565b97909660c08101611fbe91611732565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e611ff89f611e36565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107c85760009161204d575090565b610d97915060203d60201161081f5761081181836103e2565b612072610d97916125f9565b6120b8565b610d97906040519074140000000000000000000000000000000000000000186014820152603481016040526120b8565b9081518110156117f6570160200190565b60008151600181149081612234575b50156120d1575090565b815190603882101561212c5790610d9792917fff000000000000000000000000000000000000000000000000000000000000006121176080612111612408565b946126e4565b60f81b16901a612126826117e9565b53612367565b6001939092835b61213d8685612678565b1561215a5761214e612154916124f3565b956126b1565b94612133565b9092945092909261217261216d826126c8565b612446565b917fff000000000000000000000000000000000000000000000000000000000000006121a76121a26080856126e4565b6126d6565b60f81b16811a6121b6846117e9565b5360015b828111156121d057505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861222f96896124e6565b6126f1565b8b612678565b60ff1690565b60f81b16831a61222982876120a7565b536124f3565b6121ba565b9050156117f6576080602083015160f81c10386120c7565b6122559061278b565b8051600060388210156122965790610d9792917fff0000000000000000000000000000000000000000000000000000000000000061211760c0612111612408565b6001939092835b6122a78685612678565b156122be5761214e6122b8916124f3565b9461229d565b909294509290926122d161216d826126c8565b917fff000000000000000000000000000000000000000000000000000000000000006123016121a260c0856126e4565b60f81b16811a612310846117e9565b5360015b8281111561232a57505050610d97929350612367565b807fff0000000000000000000000000000000000000000000000000000000000000061221961221361220d61220861236296896124e6565b612314565b90604051918051908184526020840191840192602084019260208301905b8481106123d35750508051809386518201875294019360208086019201905b8281106123c35750509051603f92011590920101601f19166040525090565b81518152602091820191016123a4565b8151815260209182019101612385565b604080519091906123f483826103e2565b60208152918290601f190190369060200137565b6040805190919061241983826103e2565b6001815291601f1901366020840137565b604051906124396020836103e2565b6000808352366020840137565b9061245082611208565b61245d60405191826103e2565b828152601f1961246d8294611208565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60200390602082116124b457565b612477565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116124b457565b919082039182116124b457565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124b45760010190565b6125286123e3565b90600260208301526000915b602083106125b0575b61254961216d846124a6565b9060005b82518110156125a95760019061259561256f612568886124f3565b97856120a7565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a6125a282866120a7565b530161254d565b5090925050565b916125e66125c161256f83866120a7565b7fff000000000000000000000000000000000000000000000000000000000000001690565b6125f35760010191612534565b9161253d565b906126026123e3565b9160208301526000915b60208310612654575b61262161216d846124a6565b9060005b82518110156125a95760019061264061256f612568886124f3565b60001a61264d82866120a7565b5301612625565b916126656125c161256f83866120a7565b612672576001019161260c565b91612615565b8115612682570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b908160081b9180830461010014901517156124b457565b90600182018092116124b457565b90603782018092116124b457565b919082018092116124b457565b601f81116124b4576101000a90565b1561270757565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b9081511561282f57600091825b81518410156127d7576127cf6001916127bd6127b4878661187d565b51511515612700565b6127c7868561187d565b5151906126e4565b930192612798565b6127e391929350612446565b9060208201926000935b825185101561282857612820600191612816612809888761187d565b5160208151910183612839565b6127c7878661187d565b9401936127ed565b5092505090565b9050610d9761242a565b915b602081101561286e57602003602081116124b45761285b612860916126f1565b6124b9565b905182518216911916179052565b909182518152602081018091116124b45791602081018091116124b45790601f1981019081111561283b5761247756fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x7d9c2021f2c4b3a748b6e23f5260f6229b40a556dfc3ed2d7de5fbd79469cf9f", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea", + "0x60a034607357601f61582c38819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b03811690819003607357600160005560805260405161579d908161008f823960805181818160b001526103c90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780637fddd6021461004d5763b60bda491461004857600080fd5b6101e9565b610128565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761019a60209161018461019260243560405192839187830195869091604092825260208201520190565b03601f1981018352826102d6565b519020610b0d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357608060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff8211610083576102a39261026261027c9336906004016101b8565b9061026b6100e4565b9260843594600401906004016102fe565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176102f957604052565b6102a7565b9293949190916002600054146105d957600260005560405161033481610184602082019432869091604092825260208201520190565b5190209461035661034f876000526001602052604060002090565b5460ff1690565b6105af5761018461040b936103fb6104179661018461041196328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36149cf966103a660208901610603565b97808952610dc260208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109e7565b6040519485936020850190610ad6565b90610ad6565b83610ca3565b9161042181610b0d565b73ffffffffffffffffffffffffffffffffffffffff8416801591821561058e575b505061056157813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af190811561055c576104f0926104c592610541575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907ffb2d8b84e2e1acdcdbad3ce10c5a03d9f07b3f9f2e4a6d818a1a6a43610ac3b990602090a29061053f6001600055565b565b806105506000610556936102d6565b806100d9565b386104b4565b610b01565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff16141590503880610442565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b9061053f60405192836102d6565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b6106ef916106e16106d66106c88480610643565b604085526040850191610693565b926020810190610643565b916020818503910152610693565b90565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107b45750505050505090565b9091929394956020806107dc83601f1986600196030188526107d68b88610643565b90610693565b98019401940192949391906107a4565b6106ef9167ffffffffffffffff61080283610724565b1681526108b06108a561084a61082f61081e6020870187610739565b60e0602088015260e087019161078c565b61083c6040870187610643565b908683036040880152610693565b61086a61085960608701610724565b67ffffffffffffffff166060860152565b61088a61087960808701610724565b67ffffffffffffffff166080860152565b61089760a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761095e610953610942846106ef960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff61093260408301610107565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106f2565b9060208184039101526107ec565b90602083828152019260208260051b82010193836000925b8484106109945750505050505090565b90919293949560208082601f1985600195030187526109b38a87610611565b9082806109d16109c38580610643565b604086526040860191610693565b9301359101529801940194019294939190610984565b91909496959360a08352610a4f610a13610a018880610611565b608060a08701526101208601906106b4565b610a206020890189610611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608683030160c08701526106b4565b93604087013591600483101561008357610a8d608096610aba95606061053f9b610a9b9760e08b0152013561010089015287820360208901526108be565b91858303604087015261096c565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610aee575050016000815290565b8060208092840101518185015201610add565b6040513d6000823e3d90fd5b610c4a73ffffffffffffffffffffffffffffffffffffffff806106ef9360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b986075826102d6565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c2e816017840103601f1981018352826102d6565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c9e573d9067ffffffffffffffff82116102f95760405191610c92601f8201601f1916602001846102d6565b82523d6000602084013e565b606090565b919060405192610cb46040856102d6565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610ce781610b0d565b93843b610d97576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d6d5781600092918360208194519301915af1610d2b610c63565b50158015610d64575b610d3a57565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d34565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe6101208060405234611417576149cf803803809161001d8285611831565b8339810160a0828203126114175781516001600160401b038111611417578201916080838303126114175760405192610055846117e0565b80516001600160401b03811161141757836100719183016118cc565b845260208101516001600160401b03811161141757836100929183016118cc565b6020850152604081015190600482101561141757606091604086015201519060608401918252602081015160018060401b0381116114175781019160408385031261141757604051926100e4846117fb565b80516001600160401b038111611417578101608081870312611417576040519061010d826117e0565b80518252602081015160208301526101276040820161192d565b60408301526060810151906001600160401b0382116114175761014c91889101611877565b606082015284526020810151906001600160401b038211611417570160e081860312611417576040519061017f82611816565b61018881611941565b825260208101516001600160401b03811161141757810186601f820112156114175780516101b581611955565b916101c36040519384611831565b81835260208084019260051b820101918983116114175760208201905b8382106117b35750505050602083015260408101516001600160401b038111611417578661020f918301611877565b604083015261022060608201611941565b606083015261023160808201611941565b608083015260a08101516001600160401b0381116114175786610255918301611877565b60a083015260c0810151906001600160401b0382116114175761027a91879101611877565b60c0820152602084015260408201516001600160401b03811161141757820184601f82011215611417578051906102b082611955565b956102be6040519788611831565b82875260208088019360051b830101918183116114175760208101935b83851061174b5750505050506102ff60806102f86060850161192d565b930161192d565b602084015184519194916001600160a01b0385161561173a576001600160a01b038616156117295760a082015151156117185760c0820151511561170757604001516001600160a01b0316156116f65761090060805260406101008190528051919061036b9083611831565b600182526020820191601f196101005101368437600161038a8261196c565b52608051915161010080515163338c1f5160e01b81526001600160401b03909216600483015251602482015290516044820181905290926001600160a01b0390921691839160648301919060005b8181106116da5750505091818060009403915afa9081156114245760009161149e575b5061040c602061041692015161196c565b5151805190611a3b565b901561148d57600080546001600160a01b0319166001600160a01b039290921691909117905561090260a05261090360c05261010051516060949061045b8682611831565b60028152601f19860160005b81811061147d57505060208801515161047f8261196c565b526104898161196c565b50602080890151015161049b82611979565b526104a581611979565b506101005151906104b5826117fb565b600182526064602083015284516101005151908882016001600160401b0381118382101761075e57610100515281526020810191825261010051810192835260018060a01b0360c051169261010051519260208085015260c08401925161010051850152519160808a850152825180915260e0840190602060e08260051b8701019401916000905b828210611452575050505051608083016000905b6002821061143257505050600092826105786020946105c09403601f198101835282611831565b6101005151948580948193630b1e6daf60e31b835261010051600484015260096044840152681c1c9a58d95c1c995960ba1b6064840152608060248401526084830190611989565b03925af1908115611424576000916113e5575b50601180546001600160401b0319166001600160401b03929092169190911790556001600160a01b031660e05260005b855181101561079e576000865182101561078a575060208160051b870101516012546801000000000000000081101561075e5760018101806012558110156107745760126000528151805160019290921b7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444019291906001600160401b03821161075e5761069b8261069586546119ae565b866119ff565b602090601f83116001146106ef57926106d68360019796959460209489966000926106e4575b50508160011b916000199060031b1c19161790565b84555b015191015501610603565b0151905038806106c1565b90601f1983169185600052816000209260005b8181106107465750936020936001989796938996938388951061072d575b505050811b0184556106d9565b015160001960f88460031b161c19169055388080610720565b92936020600181928786015181550195019301610702565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b508551805180518892916001600160401b03821161075e576107c16001546119ae565b601f8111611396575b50602090601f831160011461132a5791806107ff92602095946000926111ac5750508160011b916000199060031b1c19161790565b6001555b01518051906001600160401b03821161075e576108216002546119ae565b601f81116112db575b50602090601f83116001146112725761085b92916000918361100f5750508160011b916000199060031b1c19161790565b6002555b602081015180518051906001600160401b03821161075e576108826003546119ae565b601f8111611223575b50602090601f83116001146111b75791806108c092602095946000926111ac5750508160011b916000199060031b1c19161790565b6003555b01518051906001600160401b03821161075e576108e26004546119ae565b601f811161115d575b50602090601f83116001146110f157918061092092604095946000926110e65750508160011b916000199060031b1c19161790565b6004555b01519160048310156110d05760009260ff801960055416911617600555516006558381518051600755602081015160085560018060a01b03610100518201511660018060a01b03196009541617600955015180519060018060401b038211610e7857610991600a546119ae565b601f8111611082575b50602090601f831160011461101a5791806109ce9260209594879261100f5750508160011b916000199060031b1c19161790565b600a555b01519260018060401b0384511660018060401b0319600b541617600b556020840151805190680100000000000000008211610e7857600c5482600c55808310610f7b575b50600c845283907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7906020015b838310610e8c575050610100518601518051925090506001600160401b038211610e7857610a72600d546119ae565b601f8111610e2a575b50602090601f8311600114610dc557610aab9291859183610d045750508160011b916000199060031b1c19161790565b600d555b830151600e80546080860151610100516001600160801b03199092166001600160401b0394851617911b6fffffffffffffffff00000000000000001617905560a084015180519094918111610cf057610b09600f546119ae565b601f8111610d77575b506020601f8211600114610d0f579080610b469285969760c09692610d045750508160011b916000199060031b1c19161790565b600f555b015180519092906001600160401b038111610cf057610b6a6010546119ae565b601f8111610c97575b506020601f8211600114610c345781908495610ba4949592610c295750508160011b916000199060031b1c19161790565b6010555b60138054610100600160a81b03191660089290921b610100600160a81b03169190911790554262015180810191908210610c1557506015556101005151612de29081611bed8239608051816123ea015260a05181611fa0015260c05181611ef2015260e051816106770152f35b634e487b7160e01b81526011600452602490fd5b0151905085806106c1565b6010845280842090601f198316855b818110610c7f57509583600195969710610c66575b505050811b01601055610ba8565b015160001960f88460031b161c19169055848080610c58565b9192602060018192868b015181550194019201610c43565b60108452610ce0907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672601f840160051c81019160208510610ce6575b601f0160051c01906119e8565b84610b73565b9091508190610cd3565b634e487b7160e01b83526041600452602483fd5b0151905087806106c1565b600f845280842095601f198316855b818110610d5f57509160c095969791846001959410610d46575b505050811b01600f55610b4a565b015160001960f88460031b161c19169055868080610d38565b83830151895560019098019760209384019301610d1e565b600f8452610dbf907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f840160051c81019160208510610ce657601f0160051c01906119e8565b85610b12565b600d85528185209190601f198416865b818110610e125750908460019594939210610df9575b505050811b01600d55610aaf565b015160001960f88460031b161c19169055868080610deb565b92936020600181928786015181550195019301610dd5565b600d8552610e72907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5601f850160051c81019160208610610ce657601f0160051c01906119e8565b86610a7b565b634e487b7160e01b84526041600452602484fd5b80518051906001600160401b038211610f6757610ead8261069586546119ae565b602090601f8311600114610efe5792610ee4836001959460209487968d92610ef35750508160011b916000199060031b1c19161790565b85555b01920192019190610a43565b015190508e806106c1565b8489528189209190601f1984168a5b818110610f4f5750936020936001969387969383889510610f36575b505050811b018555610ee7565b015160001960f88460031b161c191690558d8080610f29565b92936020600181928786015181550195019301610f0d565b634e487b7160e01b88526041600452602488fd5b600c85527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79081019083015b818110610fb45750610a16565b80610fc1600192546119ae565b80610fce575b5001610fa7565b601f81118314610fe357508681555b89610fc7565b81885260208820610ffe91601f0160051c81019084016119e8565b808752866020812081835555610fdd565b0151905088806106c1565b600a85528185209190601f198416865b81811061106a5750916001939185602097969410611051575b505050811b01600a556109d2565b015160001960f88460031b161c19169055878080611043565b9293602060018192878601518155019501930161102a565b600a85526110ca907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f850160051c81019160208610610ce657601f0160051c01906119e8565b8661099a565b634e487b7160e01b600052602160045260246000fd5b0151905089806106c1565b90601f198316916004600052816000209260005b818110611145575091600193918560409796941061112c575b505050811b01600455610924565b015160001960f88460031b161c1916905588808061111e565b92936020600181928786015181550195019301611105565b60046000526111a6907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610ce657601f0160051c01906119e8565b876108eb565b015190508a806106c1565b90601f198316916003600052816000209260005b81811061120b57509160019391856020979694106111f2575b505050811b016003556108c4565b015160001960f88460031b161c191690558980806111e4565b929360206001819287860151815501950193016111cb565b600360005261126c907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c81019160208610610ce657601f0160051c01906119e8565b8861088b565b90601f198316916002600052816000209260005b8181106112c357509084600195949392106112aa575b505050811b0160025561085f565b015160001960f88460031b161c1916905587808061129c565b92936020600181928786015181550195019301611286565b6002600052611324907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f850160051c81019160208610610ce657601f0160051c01906119e8565b8761082a565b90601f198316916001600052816000209260005b81811061137e5750916001939185602097969410611365575b505050811b01600155610803565b015160001960f88460031b161c19169055898080611357565b9293602060018192878601518155019501930161133e565b60016000526113df907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c81019160208610610ce657601f0160051c01906119e8565b886107ca565b90506020813d60201161141c575b8161140060209383611831565b810103126114175761141190611941565b386105d3565b600080fd5b3d91506113f3565b61010051513d6000823e3d90fd5b82516001600160401b031681526020928301926001929092019101610551565b9091929460208061146f60019360df198b82030186528951611989565b97019201920190929161053d565b8088602080938601015201610467565b6307456b9160e21b60005260046000fd5b3d8083833e6114ad8183611831565b60208282810103126116d65781516001600160401b0381116116cd578201610100518183850103126116cd576101005151936114e8856117fb565b81516001600160401b0381116116d257820160e08185870103126116d25761010051519061151582611816565b61151e81611941565b825261152c60208201611941565b602083015261153f610100518201611941565b61010051830152606081015160038110156116cd57606083015260808101516001600160401b0381116116cd5761159d9161158160c092888a01908301611877565b608085015261159260a08201611941565b60a085015201611941565b60c082015285526020820151906001600160401b0382116116cf57838501601f8385010112156116cf5781830151926115d584611955565b956115e561010051519788611831565b848752602087019386820160208760051b8386010101116116cd57602081840101945b60208760051b8386010101861061163357505050505060208501939093525061040c91506103fb9050565b85516001600160401b0381116116c957610100518584018201858b0103601f1901126116c957610100515190611668826117fb565b8584018101602001516001600160401b0381116116c5576116959060208c88019184888b01010101611877565b8252610100519084870101015160038110156116c1576020828101919091529082529586019501611608565b8680fd5b8780fd5b8580fd5b835b80fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103d8565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116114175782016040818503601f1901126114175760405191611778836117fb565b6020820151926001600160401b038411611417576040836117a0886020809881980101611877565b83520151838201528152019401936102db565b81516001600160401b038111611417576020916117d58d848094880101611877565b8152019101906101e0565b608081019081106001600160401b0382111761075e57604052565b604081019081106001600160401b0382111761075e57604052565b60e081019081106001600160401b0382111761075e57604052565b601f909101601f19168101906001600160401b0382119082101761075e57604052565b60005b8381106118675750506000910152565b8181015183820152602001611857565b81601f820112156114175780516020909101906001600160401b03811161075e57604051926118b0601f8301601f191660200185611831565b81845281830111611417576118c9916020840190611854565b90565b919060408382031261141757604051906118e5826117fb565b8351919384926001600160401b0381116114175782611905918301611877565b83526020810151916001600160401b038311611417576020926119289201611877565b910152565b51906001600160a01b038216820361141757565b51906001600160401b038216820361141757565b6001600160401b03811161075e5760051b60200190565b8051156107745760200190565b8051600110156107745760400190565b906020916119a281518092818552858086019101611854565b601f01601f1916010190565b90600182811c921680156119de575b60208310146119c857565b634e487b7160e01b600052602260045260246000fd5b91607f16916119bd565b8181106119f3575050565b600081556001016119e8565b9190601f8111611a0e57505050565b611a39926000526020600020906020601f840160051c83019310610ce657601f0160051c01906119e8565b565b90600061060f60f31b61ffff60f01b602085015116148060011b9080820460021490151715611a9c576028019081602811610c1557508103611a92576000611a8292611ab0565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611b44576000948101809111611b66579192905b818310611b005750505060019190565b9092919360ff611b1a8160f81b6020888601015116611b7a565b16600f8111611b5a578160041b9180830460101490151715611b4457600191019401919290611af0565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f811180611be2575b15611b9657602f190160ff1690565b6060811180611bd8575b15611baf576056190160ff1690565b6040811180611bce575b15611bc8576036190160ff1690565b5060ff90565b5060478110611bb9565b5060678110611ba0565b50603a8110611b8756fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100d7578063229e81fb146100d257806342859ab3146100cd5780635a509280146100c857806362b61c8b146100c357806378b90337146100be578063819ef8ba146100b957806388328a69146100b4578063b3d7ad48146100af578063cad31c74146100aa578063cbe61e59146100a55763d47e4eeb146100a057600080fd5b61112d565b611105565b61104b565b610f1c565b610e12565b610d07565b610a3c565b6109c2565b6108a9565b6104c9565b61042e565b6100ec565b60009103126100e757565b600080fd5b346100e75760006003193601126100e757602060ff601354166040519015158152f35b90600182811c92168015610158575b602083101461012957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161011e565b600092918154916101728361010f565b80835292600181169081156101c8575060011461018e57505050565b60009081526020812093945091925b8383106101ae575060209250010190565b60018160209294939454838587010152019101919061019d565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761024f57604052565b610204565b60a0810190811067ffffffffffffffff82111761024f57604052565b6080810190811067ffffffffffffffff82111761024f57604052565b60e0810190811067ffffffffffffffff82111761024f57604052565b6060810190811067ffffffffffffffff82111761024f57604052565b6020810190811067ffffffffffffffff82111761024f57604052565b90601f601f19910116810190811067ffffffffffffffff82111761024f57604052565b6040519061031d8261031681600f610162565b03836102e0565b565b6040519061031d82610316816010610162565b6040519061033f82610233565b8160405161035981610352816003610162565b03826102e0565b815260206040519161037783610370816004610162565b03846102e0565b0152565b60005b83811061038e5750506000910152565b818101518382015260200161037e565b90601f19601f6020936103bc8151809281875287808801910161037b565b0116010190565b6103ed9160206103dc835160408452604084019061039e565b92015190602081840391015261039e565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561042957565b6103f0565b346100e75760006003193601126100e75760405161044b81610233565b60405161045d81610352816001610162565b815260405161047181610352816002610162565b602082015261047e610332565b60ff60055416906104af600654916104a1604051956080875260808701906103c3565b9085820360208701526103c3565b906004831015610429578392604084015260608301520390f35b346100e75760a06003193601126100e7576004356024359060643591608435916013546105296105108273ffffffffffffffffffffffffffffffffffffffff9060081c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036108025760ff166107d857610545610541611e75565b1590565b6107ae5761058c600093610557611149565b9060405196879586957f62b61c8b00000000000000000000000000000000000000000000000000000000875260048701611294565b0381305afa90811561072857600090600092610786575b506105ad90611363565b61060a60206040516105d7816105c98685830160209181520190565b03601f1981018352826102e0565b604051809381927fcad31c740000000000000000000000000000000000000000000000000000000083526004830161156d565b03816000305af180156107285761065591600091610757575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601354169115151617601355565b60135460ff1661072d575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100e7576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107285761070d575b5060135460ff16604080519115158252602082019290925290819081015b0390f35b8061071c6000610722936102e0565b806100dc565b386106eb565b611305565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a1610660565b610779915060203d60201161077f575b61077181836102e0565b810190611487565b38610623565b503d610767565b6105ad92506107a891503d806000833e6107a081836102e0565b810190611224565b916105a3565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100e75790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a060806108a06060850151838386015260c085019061039e565b93015191015290565b346100e75760206003193601126100e75760043567ffffffffffffffff81116100e7576108dd61070991369060040161082c565b6108e561169d565b5073ffffffffffffffffffffffffffffffffffffffff600054169061095f6040820135610911816116c8565b73ffffffffffffffffffffffffffffffffffffffff602084013561093b85359560608101906116f0565b9290936040519761094b89610254565b885216602087015260408601523691611741565b606083015260808201526040519182918261083a565b9181601f840112156100e75782359167ffffffffffffffff83116100e7576020808501948460051b0101116100e757565b9291906109bd60209160408652604086019061039e565b930152565b346100e75760c06003193601126100e75760243560043560643560443560843567ffffffffffffffff81116100e7576109ff903690600401610975565b92909160a4359567ffffffffffffffff87116100e757610a26610a2c97369060040161082c565b956118cb565b90610709604051928392836109a6565b346100e75760006003193601126100e7576020610a57611e75565b6040519015158152f35b600a5460009291610a718261010f565b8082529160018116908115610ae65750600114610a8c575050565b600a60009081529293509091907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b838310610acc575060209250010190565b600181602092949394548385870101520191019190610abb565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040519061031d8261031681600d610162565b67ffffffffffffffff811161024f5760051b60200190565b600c5490610b5882610b33565b91610b6660405193846102e0565b808352600c60009081527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7602085015b838310610ba35750505050565b600160208192604051610bba816103528189610162565b815201920192019190610b96565b9080602083519182815201916020808360051b8301019401926000915b838310610bf457505050505090565b9091929394602080610c1283601f198660019603018752895161039e565b97019301930191939290610be5565b610c7260606103ed9493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c083019061039e565b90602081830391015267ffffffffffffffff825116815260c0610cf6610cbc610caa602086015160e0602087015260e0860190610bc8565b6040860151858203604087015261039e565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a086015261039e565b9201519060c081840391015261039e565b346100e75760006003193601126100e757604051610d2481610270565b6007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff600954166040820152604051610d5f8161035281610a61565b606082015260405190610d718261028c565b67ffffffffffffffff600b54168252610d88610b4b565b6020830152610d95610b20565b6040830152610de9610dd8600e54610dc8610db78267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610df1610303565b60a0830152610dfe61031f565b60c083015261070960405192839283610c21565b346100e75760006003193601126100e75760ff60135416156107d8576040516000601454610e3f8161010f565b8084529060018116908115610eda5750600114610e7b575b61070983610e67818503826102e0565b60405191829160208352602083019061039e565b601460009081527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec939250905b808210610ec057509091508101602001610e67610e57565b919260018160209254838588010152019101909291610ea8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610e679050610e57565b346100e75760006003193601126100e757610f3561169d565b506040517f5a5092800000000000000000000000000000000000000000000000000000000081526020600482015260008180610f7360248201611255565b0381305afa90811561072857600091610f95575b60405180610709848261083a565b3d8083833e610fa481836102e0565b8101906020818303126110435780519067ffffffffffffffff8211611047570160a0818303126110435760405191610fdb83610254565b8151610fe6816116c8565b83526020820151610ff6816116c8565b602084015260408201516040840152606082015167ffffffffffffffff811161103f579361102c8392610709966080950161120a565b6060850152500151608082015290610f87565b8480fd5b8280fd5b8380fd5b346100e75760606003193601126100e75760043567ffffffffffffffff81116100e75760e060031982360301126100e7576024359067ffffffffffffffff82116100e757366023830112156100e75781600401359167ffffffffffffffff83116100e75736602484830101116100e7576044359067ffffffffffffffff82116100e757610709936110f3936110e66024943690600401610975565b9490930190600401612345565b60405190151581529081906020820190565b346100e75760006003193601126100e757602067ffffffffffffffff60115416604051908152f35b346100e75760006003193601126100e757602060405160108152f35b604051906111586020836102e0565b600080835282815b82811061116c57505050565b806060602080938501015201611160565b604051610140919061118f83826102e0565b6009815291601f19018260005b8281106111a857505050565b80606060208093850101520161119c565b67ffffffffffffffff811161024f57601f01601f191660200190565b909291926111e2816111b9565b916111f060405193846102e0565b8294828452828201116100e757602061031d93019061037b565b9080601f830112156100e75781516103ed926020016111d5565b91906040838203126100e757825167ffffffffffffffff81116100e75760209161124f91850161120a565b92015190565b60806103ed916007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b92936080946112c3936103ed9793865260208601526040850152606084015260c08484015260c0830190610bc8565b9060a08183039101526007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b6040513d6000823e3d90fd5b601f821161131e57505050565b6000526020600020906020601f840160051c83019310611359575b601f0160051c01905b81811061134d575050565b60008155600101611342565b9091508190611339565b90815167ffffffffffffffff811161024f5761138b8161138460145461010f565b6014611311565b602092601f82116001146113ea576113da929382916000926113df575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601455565b0151905038806113a8565b6014600052601f198216937fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9160005b86811061146f5750836001959610611438575b505050811b01601455565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061142d565b9192602060018192868501518155019401920161141a565b908160209103126100e7575180151581036100e75790565b90806020835491828152019160208260051b820101936000526020600020926000915b8383106114d157505050505090565b9091929394602060016114ee83601f198684960301875289610162565b970193019301919392906114c2565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061152f57505050505090565b90919293946020600282601f19856001950301865260408152611555604082018a610162565b9083858b015491015297019301930191939290611520565b61168d6103ed92606083526115a060608401611592600b5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e0608084015261167f61164d6115f06115bf6101408701600c61149f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600d610162565b600e5467ffffffffffffffff811660c088015261161b9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600f610162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101208601526010610162565b90838203602085015261039e565b90604081830391015260126114fd565b604051906116aa82610254565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100e757565b356103ed816116c8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e7576020019181360383136100e757565b92919261174d826111b9565b9161175b60405193846102e0565b8294818452818301116100e7578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117b45760200190565b611778565b8051600110156117b45760400190565b8051600210156117b45760600190565b8051600310156117b45760800190565b8051600410156117b45760a00190565b8051600510156117b45760c00190565b8051600610156117b45760e00190565b8051600710156117b4576101000190565b8051600810156117b4576101200190565b80518210156117b45760209160051b010190565b92919261185b82610b33565b9361186960405195866102e0565b602085848152019260051b8201918183116100e75780935b83851061188f575050505050565b843567ffffffffffffffff81116100e757820183601f820112156100e7576020916118c08583858095359101611741565b815201940193611881565b959290919493946118da61117d565b966118e86020860135612454565b6118f1896117a7565b526118fb886117a7565b5061190590612b80565b61190e906124a6565b611917886117b9565b52611921876117b9565b5061192b90612b80565b611934906124a6565b61193d876117c9565b52611947866117c9565b5061195190612b80565b61195a906124a6565b611963866117d9565b5261196d856117d9565b5061197790612b80565b611980906124a6565b611989856117e9565b52611993846117e9565b506119a0604082016116e6565b6119a990612465565b6119b2856117f9565b526119bc846117f9565b506119c78135612454565b6119d085611809565b526119da84611809565b50606081016119e8916116f0565b36906119f392611741565b6119fc906124a6565b611a0584611819565b52611a0f83611819565b503690611a1b9261184f565b611a249061263a565b611a2d8261182a565b52611a378161182a565b50611a419061263a565b611a49612aa7565b611a52906124a6565b90611a5c91612755565b908151602083012090565b67ffffffffffffffff8116036100e757565b9080601f830112156100e757815191611a9183610b33565b92611a9f60405194856102e0565b80845260208085019160051b830101918383116100e75760208101915b838310611acb57505050505090565b825167ffffffffffffffff81116100e7578201906060601f1983880301126100e75760405191611afa836102a8565b6020810151611b0881611a67565b835260408101519067ffffffffffffffff82116100e757611b3088602060609484010161120a565b602085015201519060038210156100e7578260209392604085940152815201920191611abc565b91906060838203126100e75760405190611b70826102a8565b81938051611b7d81611a67565b8352602081015167ffffffffffffffff81116100e75782611b9f91830161120a565b602084015260408101519167ffffffffffffffff83116100e757604092611bc6920161120a565b910152565b6020818303126100e75780519067ffffffffffffffff82116100e75701906020828203126100e75760405191611c00836102c4565b80519067ffffffffffffffff82116100e757016060818303126100e75760405191611c2a836102a8565b815167ffffffffffffffff81116100e75782016080818303126100e75760405190611c5482610270565b8051611c5f81611a67565b82526020810151611c6f816116c8565b6020830152604081015167ffffffffffffffff81116100e757810183601f820112156100e75783816020611ca5935191016111d5565b604083015260608101519067ffffffffffffffff82116100e757611ccb9184910161120a565b60608201528352602082015167ffffffffffffffff81116100e75781611cf2918401611a79565b6020840152604082015167ffffffffffffffff81116100e757611d159201611b57565b6040820152815290565b6020818303126100e75780519067ffffffffffffffff82116100e757019080601f830112156100e7578151611d5381610b33565b92611d6160405194856102e0565b81845260208085019260051b8201019283116100e757602001905b828210611d895750505090565b8151815260209182019101611d7c565b8091039060c082126100e75760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611dd886610270565b8351611de381611a67565b86526020840151611df381611a67565b60208701526040840151611e0681611a67565b60408701520112611e4b5760a09060405192611e21846102a8565b6060820151611e2f81611a67565b8452608082015160208501525001516040820152606082015290565b5080fd5b6103ed9060408152611e65604082016001610162565b9060208183039101526002610162565b601554421161209f57611ed96000611e9660115467ffffffffffffffff1690565b6040517f012d56e000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156107285760409160009161207c575b50510151805167ffffffffffffffff1615612076576020611f5191015160208082518301019101611d1f565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611f8760048201611e4f565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610728576103ed9261203b92600092612041575b5080612003611ff3611fec612008946117a7565b51926117b9565b5191662386f26fc100009061282a565b61283d565b6120356120286040806060860151015194015167ffffffffffffffff1690565b67ffffffffffffffff1690565b916128be565b90612928565b6120089192506120689060c03d60c01161206f575b61206081836102e0565b810190611d99565b9190611fd8565b503d612056565b50600090565b61209991503d806000833e61209181836102e0565b810190611bcb565b38611f25565b600090565b356103ed81611a67565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e757602001918160051b360383136100e757565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100e757016020813591019167ffffffffffffffff82116100e75781360383136100e757565b90602083828152019160208260051b8501019381936000915b84831061219c5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100e7576020809187600194019082806122016121f38580612123565b604086526040860191612102565b930135910152980193019301919493929061218c565b9060028210156104295752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff61225495941681528160208201520191612102565b938d6040818703910152808552602085019460208260051b82010195836000925b84841061230d57505050505050946122d78c9d60a06122c661031d9e9f986101209e9c986122b86123049f9d996122e8996122f59e8e6060818503910152612102565b918b830360808d0152612173565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152612102565b91878303610100890152612102565b93016001612217565b90919293949760208061233583601f19866001960301885261232f8d88612123565b90612102565b9a01940194019294939190612275565b9092939193612353826120a4565b9261236160208401846120ae565b93909261237160408301836116f0565b91909360608401612381906120a4565b9161238e608086016120a4565b9361239c60a08701876116f0565b97909660c081016123ac916116f0565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e6123e69f612224565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107285760009161243b575090565b6103ed915060203d60201161077f5761077181836102e0565b6124606103ed91612b80565b6124a6565b6103ed906040519074140000000000000000000000000000000000000000186014820152603481016040526124a6565b9081518110156117b4570160200190565b60008151600181149081612622575b50156124bf575090565b815190603882101561251a57906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560806124ff612a0b565b94612c1b565b60f81b16901a612514826117a7565b53612755565b6001939092835b61252b868561283d565b156125485761253c61254291612a7a565b95612813565b94612521565b9092945092909261256061255b82612bff565b612a49565b917fff00000000000000000000000000000000000000000000000000000000000000612595612590608085612c1b565b612c0d565b60f81b16811a6125a4846117a7565b5360015b828111156125be575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661261d96896128b1565b612c28565b8b61283d565b60ff1690565b60f81b16831a6126178287612495565b53612a7a565b6125a8565b9050156117b4576080602083015160f81c10386124b5565b61264390612cc2565b80516000603882101561268457906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560c06124ff612a0b565b6001939092835b612695868561283d565b156126ac5761253c6126a691612a7a565b9461268b565b909294509290926126bf61255b82612bff565b917fff000000000000000000000000000000000000000000000000000000000000006126ef61259060c085612c1b565b60f81b16811a6126fe846117a7565b5360015b82811115612718575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661275096896128b1565b612702565b90604051918051908184526020840191840192602084019260208301905b8481106127c15750508051809386518201875294019360208086019201905b8281106127b15750509051603f92011590920101601f19166040525090565b8151815260209182019101612792565b8151815260209182019101612773565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b604d811161280e57600a0a90565b6127d1565b908160081b91808304610100149015171561280e57565b8181029291811591840414171561280e57565b8115612847570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b602003906020821161280e57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161280e57565b9190820391821161280e57565b90929190601082111561292057815b82039082821161280e576128e36128e992612800565b9061282a565b927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0820191821161280e576128e36103ed92612800565b6010916128cd565b60ff60055416916129388361041f565b6001831492836129db575b83156129b8575b8315612994575b8315612969575b50505061296457600090565b600190565b6002919293506129788161041f565b14918261298a575b5050388080612958565b1090503880612980565b925061299f8361041f565b60038314806129af575b92612951565b508082116129a9565b92506129c38361041f565b8215806129d1575b9261294a565b50808211156129cb565b818310159350612943565b604080519091906129f783826102e0565b60208152918290601f190190369060200137565b60408051909190612a1c83826102e0565b6001815291601f1901366020840137565b60405190612a3c6020836102e0565b6000808352366020840137565b90612a53826111b9565b612a6060405191826102e0565b828152601f19612a7082946111b9565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461280e5760010190565b612aaf6129e6565b90600260208301526000915b60208310612b37575b612ad061255b84612876565b9060005b8251811015612b3057600190612b1c612af6612aef88612a7a565b9785612495565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612b298286612495565b5301612ad4565b5090925050565b91612b6d612b48612af68386612495565b7fff000000000000000000000000000000000000000000000000000000000000001690565b612b7a5760010191612abb565b91612ac4565b90612b896129e6565b9160208301526000915b60208310612bdb575b612ba861255b84612876565b9060005b8251811015612b3057600190612bc7612af6612aef88612a7a565b60001a612bd48286612495565b5301612bac565b91612bec612b48612af68386612495565b612bf95760010191612b93565b91612b9c565b906001820180921161280e57565b906037820180921161280e57565b9190820180921161280e57565b601f811161280e576101000a90565b15612c3e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b90815115612d6657600091825b8151841015612d0e57612d06600191612cf4612ceb878661183b565b51511515612c37565b612cfe868561183b565b515190612c1b565b930192612ccf565b612d1a91929350612a49565b9060208201926000935b8251851015612d5f57612d57600191612d4d612d40888761183b565b5160208151910183612d70565b612cfe878661183b565b940193612d24565b5092505090565b90506103ed612a2d565b915b6020811015612da5576020036020811161280e57612d92612d9791612c28565b612884565b905182518216911916179052565b9091825181526020810180911161280e57916020810180911161280e5790601f19810190811115612d72576127d156fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0x6dbe2c", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000584c60a034607357601f61582c38819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b03811690819003607357600160005560805260405161579d908161008f823960805181818160b001526103c90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780637fddd6021461004d5763b60bda491461004857600080fd5b6101e9565b610128565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761019a60209161018461019260243560405192839187830195869091604092825260208201520190565b03601f1981018352826102d6565b519020610b0d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357608060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff8211610083576102a39261026261027c9336906004016101b8565b9061026b6100e4565b9260843594600401906004016102fe565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176102f957604052565b6102a7565b9293949190916002600054146105d957600260005560405161033481610184602082019432869091604092825260208201520190565b5190209461035661034f876000526001602052604060002090565b5460ff1690565b6105af5761018461040b936103fb6104179661018461041196328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36149cf966103a660208901610603565b97808952610dc260208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109e7565b6040519485936020850190610ad6565b90610ad6565b83610ca3565b9161042181610b0d565b73ffffffffffffffffffffffffffffffffffffffff8416801591821561058e575b505061056157813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af190811561055c576104f0926104c592610541575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907ffb2d8b84e2e1acdcdbad3ce10c5a03d9f07b3f9f2e4a6d818a1a6a43610ac3b990602090a29061053f6001600055565b565b806105506000610556936102d6565b806100d9565b386104b4565b610b01565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff16141590503880610442565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b9061053f60405192836102d6565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b6106ef916106e16106d66106c88480610643565b604085526040850191610693565b926020810190610643565b916020818503910152610693565b90565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107b45750505050505090565b9091929394956020806107dc83601f1986600196030188526107d68b88610643565b90610693565b98019401940192949391906107a4565b6106ef9167ffffffffffffffff61080283610724565b1681526108b06108a561084a61082f61081e6020870187610739565b60e0602088015260e087019161078c565b61083c6040870187610643565b908683036040880152610693565b61086a61085960608701610724565b67ffffffffffffffff166060860152565b61088a61087960808701610724565b67ffffffffffffffff166080860152565b61089760a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761095e610953610942846106ef960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff61093260408301610107565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106f2565b9060208184039101526107ec565b90602083828152019260208260051b82010193836000925b8484106109945750505050505090565b90919293949560208082601f1985600195030187526109b38a87610611565b9082806109d16109c38580610643565b604086526040860191610693565b9301359101529801940194019294939190610984565b91909496959360a08352610a4f610a13610a018880610611565b608060a08701526101208601906106b4565b610a206020890189610611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608683030160c08701526106b4565b93604087013591600483101561008357610a8d608096610aba95606061053f9b610a9b9760e08b0152013561010089015287820360208901526108be565b91858303604087015261096c565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610aee575050016000815290565b8060208092840101518185015201610add565b6040513d6000823e3d90fd5b610c4a73ffffffffffffffffffffffffffffffffffffffff806106ef9360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b986075826102d6565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c2e816017840103601f1981018352826102d6565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c9e573d9067ffffffffffffffff82116102f95760405191610c92601f8201601f1916602001846102d6565b82523d6000602084013e565b606090565b919060405192610cb46040856102d6565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610ce781610b0d565b93843b610d97576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d6d5781600092918360208194519301915af1610d2b610c63565b50158015610d64575b610d3a57565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d34565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe6101208060405234611417576149cf803803809161001d8285611831565b8339810160a0828203126114175781516001600160401b038111611417578201916080838303126114175760405192610055846117e0565b80516001600160401b03811161141757836100719183016118cc565b845260208101516001600160401b03811161141757836100929183016118cc565b6020850152604081015190600482101561141757606091604086015201519060608401918252602081015160018060401b0381116114175781019160408385031261141757604051926100e4846117fb565b80516001600160401b038111611417578101608081870312611417576040519061010d826117e0565b80518252602081015160208301526101276040820161192d565b60408301526060810151906001600160401b0382116114175761014c91889101611877565b606082015284526020810151906001600160401b038211611417570160e081860312611417576040519061017f82611816565b61018881611941565b825260208101516001600160401b03811161141757810186601f820112156114175780516101b581611955565b916101c36040519384611831565b81835260208084019260051b820101918983116114175760208201905b8382106117b35750505050602083015260408101516001600160401b038111611417578661020f918301611877565b604083015261022060608201611941565b606083015261023160808201611941565b608083015260a08101516001600160401b0381116114175786610255918301611877565b60a083015260c0810151906001600160401b0382116114175761027a91879101611877565b60c0820152602084015260408201516001600160401b03811161141757820184601f82011215611417578051906102b082611955565b956102be6040519788611831565b82875260208088019360051b830101918183116114175760208101935b83851061174b5750505050506102ff60806102f86060850161192d565b930161192d565b602084015184519194916001600160a01b0385161561173a576001600160a01b038616156117295760a082015151156117185760c0820151511561170757604001516001600160a01b0316156116f65761090060805260406101008190528051919061036b9083611831565b600182526020820191601f196101005101368437600161038a8261196c565b52608051915161010080515163338c1f5160e01b81526001600160401b03909216600483015251602482015290516044820181905290926001600160a01b0390921691839160648301919060005b8181106116da5750505091818060009403915afa9081156114245760009161149e575b5061040c602061041692015161196c565b5151805190611a3b565b901561148d57600080546001600160a01b0319166001600160a01b039290921691909117905561090260a05261090360c05261010051516060949061045b8682611831565b60028152601f19860160005b81811061147d57505060208801515161047f8261196c565b526104898161196c565b50602080890151015161049b82611979565b526104a581611979565b506101005151906104b5826117fb565b600182526064602083015284516101005151908882016001600160401b0381118382101761075e57610100515281526020810191825261010051810192835260018060a01b0360c051169261010051519260208085015260c08401925161010051850152519160808a850152825180915260e0840190602060e08260051b8701019401916000905b828210611452575050505051608083016000905b6002821061143257505050600092826105786020946105c09403601f198101835282611831565b6101005151948580948193630b1e6daf60e31b835261010051600484015260096044840152681c1c9a58d95c1c995960ba1b6064840152608060248401526084830190611989565b03925af1908115611424576000916113e5575b50601180546001600160401b0319166001600160401b03929092169190911790556001600160a01b031660e05260005b855181101561079e576000865182101561078a575060208160051b870101516012546801000000000000000081101561075e5760018101806012558110156107745760126000528151805160019290921b7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444019291906001600160401b03821161075e5761069b8261069586546119ae565b866119ff565b602090601f83116001146106ef57926106d68360019796959460209489966000926106e4575b50508160011b916000199060031b1c19161790565b84555b015191015501610603565b0151905038806106c1565b90601f1983169185600052816000209260005b8181106107465750936020936001989796938996938388951061072d575b505050811b0184556106d9565b015160001960f88460031b161c19169055388080610720565b92936020600181928786015181550195019301610702565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b508551805180518892916001600160401b03821161075e576107c16001546119ae565b601f8111611396575b50602090601f831160011461132a5791806107ff92602095946000926111ac5750508160011b916000199060031b1c19161790565b6001555b01518051906001600160401b03821161075e576108216002546119ae565b601f81116112db575b50602090601f83116001146112725761085b92916000918361100f5750508160011b916000199060031b1c19161790565b6002555b602081015180518051906001600160401b03821161075e576108826003546119ae565b601f8111611223575b50602090601f83116001146111b75791806108c092602095946000926111ac5750508160011b916000199060031b1c19161790565b6003555b01518051906001600160401b03821161075e576108e26004546119ae565b601f811161115d575b50602090601f83116001146110f157918061092092604095946000926110e65750508160011b916000199060031b1c19161790565b6004555b01519160048310156110d05760009260ff801960055416911617600555516006558381518051600755602081015160085560018060a01b03610100518201511660018060a01b03196009541617600955015180519060018060401b038211610e7857610991600a546119ae565b601f8111611082575b50602090601f831160011461101a5791806109ce9260209594879261100f5750508160011b916000199060031b1c19161790565b600a555b01519260018060401b0384511660018060401b0319600b541617600b556020840151805190680100000000000000008211610e7857600c5482600c55808310610f7b575b50600c845283907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7906020015b838310610e8c575050610100518601518051925090506001600160401b038211610e7857610a72600d546119ae565b601f8111610e2a575b50602090601f8311600114610dc557610aab9291859183610d045750508160011b916000199060031b1c19161790565b600d555b830151600e80546080860151610100516001600160801b03199092166001600160401b0394851617911b6fffffffffffffffff00000000000000001617905560a084015180519094918111610cf057610b09600f546119ae565b601f8111610d77575b506020601f8211600114610d0f579080610b469285969760c09692610d045750508160011b916000199060031b1c19161790565b600f555b015180519092906001600160401b038111610cf057610b6a6010546119ae565b601f8111610c97575b506020601f8211600114610c345781908495610ba4949592610c295750508160011b916000199060031b1c19161790565b6010555b60138054610100600160a81b03191660089290921b610100600160a81b03169190911790554262015180810191908210610c1557506015556101005151612de29081611bed8239608051816123ea015260a05181611fa0015260c05181611ef2015260e051816106770152f35b634e487b7160e01b81526011600452602490fd5b0151905085806106c1565b6010845280842090601f198316855b818110610c7f57509583600195969710610c66575b505050811b01601055610ba8565b015160001960f88460031b161c19169055848080610c58565b9192602060018192868b015181550194019201610c43565b60108452610ce0907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672601f840160051c81019160208510610ce6575b601f0160051c01906119e8565b84610b73565b9091508190610cd3565b634e487b7160e01b83526041600452602483fd5b0151905087806106c1565b600f845280842095601f198316855b818110610d5f57509160c095969791846001959410610d46575b505050811b01600f55610b4a565b015160001960f88460031b161c19169055868080610d38565b83830151895560019098019760209384019301610d1e565b600f8452610dbf907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f840160051c81019160208510610ce657601f0160051c01906119e8565b85610b12565b600d85528185209190601f198416865b818110610e125750908460019594939210610df9575b505050811b01600d55610aaf565b015160001960f88460031b161c19169055868080610deb565b92936020600181928786015181550195019301610dd5565b600d8552610e72907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5601f850160051c81019160208610610ce657601f0160051c01906119e8565b86610a7b565b634e487b7160e01b84526041600452602484fd5b80518051906001600160401b038211610f6757610ead8261069586546119ae565b602090601f8311600114610efe5792610ee4836001959460209487968d92610ef35750508160011b916000199060031b1c19161790565b85555b01920192019190610a43565b015190508e806106c1565b8489528189209190601f1984168a5b818110610f4f5750936020936001969387969383889510610f36575b505050811b018555610ee7565b015160001960f88460031b161c191690558d8080610f29565b92936020600181928786015181550195019301610f0d565b634e487b7160e01b88526041600452602488fd5b600c85527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79081019083015b818110610fb45750610a16565b80610fc1600192546119ae565b80610fce575b5001610fa7565b601f81118314610fe357508681555b89610fc7565b81885260208820610ffe91601f0160051c81019084016119e8565b808752866020812081835555610fdd565b0151905088806106c1565b600a85528185209190601f198416865b81811061106a5750916001939185602097969410611051575b505050811b01600a556109d2565b015160001960f88460031b161c19169055878080611043565b9293602060018192878601518155019501930161102a565b600a85526110ca907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f850160051c81019160208610610ce657601f0160051c01906119e8565b8661099a565b634e487b7160e01b600052602160045260246000fd5b0151905089806106c1565b90601f198316916004600052816000209260005b818110611145575091600193918560409796941061112c575b505050811b01600455610924565b015160001960f88460031b161c1916905588808061111e565b92936020600181928786015181550195019301611105565b60046000526111a6907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610ce657601f0160051c01906119e8565b876108eb565b015190508a806106c1565b90601f198316916003600052816000209260005b81811061120b57509160019391856020979694106111f2575b505050811b016003556108c4565b015160001960f88460031b161c191690558980806111e4565b929360206001819287860151815501950193016111cb565b600360005261126c907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c81019160208610610ce657601f0160051c01906119e8565b8861088b565b90601f198316916002600052816000209260005b8181106112c357509084600195949392106112aa575b505050811b0160025561085f565b015160001960f88460031b161c1916905587808061129c565b92936020600181928786015181550195019301611286565b6002600052611324907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f850160051c81019160208610610ce657601f0160051c01906119e8565b8761082a565b90601f198316916001600052816000209260005b81811061137e5750916001939185602097969410611365575b505050811b01600155610803565b015160001960f88460031b161c19169055898080611357565b9293602060018192878601518155019501930161133e565b60016000526113df907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c81019160208610610ce657601f0160051c01906119e8565b886107ca565b90506020813d60201161141c575b8161140060209383611831565b810103126114175761141190611941565b386105d3565b600080fd5b3d91506113f3565b61010051513d6000823e3d90fd5b82516001600160401b031681526020928301926001929092019101610551565b9091929460208061146f60019360df198b82030186528951611989565b97019201920190929161053d565b8088602080938601015201610467565b6307456b9160e21b60005260046000fd5b3d8083833e6114ad8183611831565b60208282810103126116d65781516001600160401b0381116116cd578201610100518183850103126116cd576101005151936114e8856117fb565b81516001600160401b0381116116d257820160e08185870103126116d25761010051519061151582611816565b61151e81611941565b825261152c60208201611941565b602083015261153f610100518201611941565b61010051830152606081015160038110156116cd57606083015260808101516001600160401b0381116116cd5761159d9161158160c092888a01908301611877565b608085015261159260a08201611941565b60a085015201611941565b60c082015285526020820151906001600160401b0382116116cf57838501601f8385010112156116cf5781830151926115d584611955565b956115e561010051519788611831565b848752602087019386820160208760051b8386010101116116cd57602081840101945b60208760051b8386010101861061163357505050505060208501939093525061040c91506103fb9050565b85516001600160401b0381116116c957610100518584018201858b0103601f1901126116c957610100515190611668826117fb565b8584018101602001516001600160401b0381116116c5576116959060208c88019184888b01010101611877565b8252610100519084870101015160038110156116c1576020828101919091529082529586019501611608565b8680fd5b8780fd5b8580fd5b835b80fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103d8565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116114175782016040818503601f1901126114175760405191611778836117fb565b6020820151926001600160401b038411611417576040836117a0886020809881980101611877565b83520151838201528152019401936102db565b81516001600160401b038111611417576020916117d58d848094880101611877565b8152019101906101e0565b608081019081106001600160401b0382111761075e57604052565b604081019081106001600160401b0382111761075e57604052565b60e081019081106001600160401b0382111761075e57604052565b601f909101601f19168101906001600160401b0382119082101761075e57604052565b60005b8381106118675750506000910152565b8181015183820152602001611857565b81601f820112156114175780516020909101906001600160401b03811161075e57604051926118b0601f8301601f191660200185611831565b81845281830111611417576118c9916020840190611854565b90565b919060408382031261141757604051906118e5826117fb565b8351919384926001600160401b0381116114175782611905918301611877565b83526020810151916001600160401b038311611417576020926119289201611877565b910152565b51906001600160a01b038216820361141757565b51906001600160401b038216820361141757565b6001600160401b03811161075e5760051b60200190565b8051156107745760200190565b8051600110156107745760400190565b906020916119a281518092818552858086019101611854565b601f01601f1916010190565b90600182811c921680156119de575b60208310146119c857565b634e487b7160e01b600052602260045260246000fd5b91607f16916119bd565b8181106119f3575050565b600081556001016119e8565b9190601f8111611a0e57505050565b611a39926000526020600020906020601f840160051c83019310610ce657601f0160051c01906119e8565b565b90600061060f60f31b61ffff60f01b602085015116148060011b9080820460021490151715611a9c576028019081602811610c1557508103611a92576000611a8292611ab0565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611b44576000948101809111611b66579192905b818310611b005750505060019190565b9092919360ff611b1a8160f81b6020888601015116611b7a565b16600f8111611b5a578160041b9180830460101490151715611b4457600191019401919290611af0565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f811180611be2575b15611b9657602f190160ff1690565b6060811180611bd8575b15611baf576056190160ff1690565b6040811180611bce575b15611bc8576036190160ff1690565b5060ff90565b5060478110611bb9565b5060678110611ba0565b50603a8110611b8756fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100d7578063229e81fb146100d257806342859ab3146100cd5780635a509280146100c857806362b61c8b146100c357806378b90337146100be578063819ef8ba146100b957806388328a69146100b4578063b3d7ad48146100af578063cad31c74146100aa578063cbe61e59146100a55763d47e4eeb146100a057600080fd5b61112d565b611105565b61104b565b610f1c565b610e12565b610d07565b610a3c565b6109c2565b6108a9565b6104c9565b61042e565b6100ec565b60009103126100e757565b600080fd5b346100e75760006003193601126100e757602060ff601354166040519015158152f35b90600182811c92168015610158575b602083101461012957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161011e565b600092918154916101728361010f565b80835292600181169081156101c8575060011461018e57505050565b60009081526020812093945091925b8383106101ae575060209250010190565b60018160209294939454838587010152019101919061019d565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761024f57604052565b610204565b60a0810190811067ffffffffffffffff82111761024f57604052565b6080810190811067ffffffffffffffff82111761024f57604052565b60e0810190811067ffffffffffffffff82111761024f57604052565b6060810190811067ffffffffffffffff82111761024f57604052565b6020810190811067ffffffffffffffff82111761024f57604052565b90601f601f19910116810190811067ffffffffffffffff82111761024f57604052565b6040519061031d8261031681600f610162565b03836102e0565b565b6040519061031d82610316816010610162565b6040519061033f82610233565b8160405161035981610352816003610162565b03826102e0565b815260206040519161037783610370816004610162565b03846102e0565b0152565b60005b83811061038e5750506000910152565b818101518382015260200161037e565b90601f19601f6020936103bc8151809281875287808801910161037b565b0116010190565b6103ed9160206103dc835160408452604084019061039e565b92015190602081840391015261039e565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561042957565b6103f0565b346100e75760006003193601126100e75760405161044b81610233565b60405161045d81610352816001610162565b815260405161047181610352816002610162565b602082015261047e610332565b60ff60055416906104af600654916104a1604051956080875260808701906103c3565b9085820360208701526103c3565b906004831015610429578392604084015260608301520390f35b346100e75760a06003193601126100e7576004356024359060643591608435916013546105296105108273ffffffffffffffffffffffffffffffffffffffff9060081c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036108025760ff166107d857610545610541611e75565b1590565b6107ae5761058c600093610557611149565b9060405196879586957f62b61c8b00000000000000000000000000000000000000000000000000000000875260048701611294565b0381305afa90811561072857600090600092610786575b506105ad90611363565b61060a60206040516105d7816105c98685830160209181520190565b03601f1981018352826102e0565b604051809381927fcad31c740000000000000000000000000000000000000000000000000000000083526004830161156d565b03816000305af180156107285761065591600091610757575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601354169115151617601355565b60135460ff1661072d575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100e7576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107285761070d575b5060135460ff16604080519115158252602082019290925290819081015b0390f35b8061071c6000610722936102e0565b806100dc565b386106eb565b611305565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a1610660565b610779915060203d60201161077f575b61077181836102e0565b810190611487565b38610623565b503d610767565b6105ad92506107a891503d806000833e6107a081836102e0565b810190611224565b916105a3565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100e75790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a060806108a06060850151838386015260c085019061039e565b93015191015290565b346100e75760206003193601126100e75760043567ffffffffffffffff81116100e7576108dd61070991369060040161082c565b6108e561169d565b5073ffffffffffffffffffffffffffffffffffffffff600054169061095f6040820135610911816116c8565b73ffffffffffffffffffffffffffffffffffffffff602084013561093b85359560608101906116f0565b9290936040519761094b89610254565b885216602087015260408601523691611741565b606083015260808201526040519182918261083a565b9181601f840112156100e75782359167ffffffffffffffff83116100e7576020808501948460051b0101116100e757565b9291906109bd60209160408652604086019061039e565b930152565b346100e75760c06003193601126100e75760243560043560643560443560843567ffffffffffffffff81116100e7576109ff903690600401610975565b92909160a4359567ffffffffffffffff87116100e757610a26610a2c97369060040161082c565b956118cb565b90610709604051928392836109a6565b346100e75760006003193601126100e7576020610a57611e75565b6040519015158152f35b600a5460009291610a718261010f565b8082529160018116908115610ae65750600114610a8c575050565b600a60009081529293509091907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b838310610acc575060209250010190565b600181602092949394548385870101520191019190610abb565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040519061031d8261031681600d610162565b67ffffffffffffffff811161024f5760051b60200190565b600c5490610b5882610b33565b91610b6660405193846102e0565b808352600c60009081527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7602085015b838310610ba35750505050565b600160208192604051610bba816103528189610162565b815201920192019190610b96565b9080602083519182815201916020808360051b8301019401926000915b838310610bf457505050505090565b9091929394602080610c1283601f198660019603018752895161039e565b97019301930191939290610be5565b610c7260606103ed9493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c083019061039e565b90602081830391015267ffffffffffffffff825116815260c0610cf6610cbc610caa602086015160e0602087015260e0860190610bc8565b6040860151858203604087015261039e565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a086015261039e565b9201519060c081840391015261039e565b346100e75760006003193601126100e757604051610d2481610270565b6007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff600954166040820152604051610d5f8161035281610a61565b606082015260405190610d718261028c565b67ffffffffffffffff600b54168252610d88610b4b565b6020830152610d95610b20565b6040830152610de9610dd8600e54610dc8610db78267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610df1610303565b60a0830152610dfe61031f565b60c083015261070960405192839283610c21565b346100e75760006003193601126100e75760ff60135416156107d8576040516000601454610e3f8161010f565b8084529060018116908115610eda5750600114610e7b575b61070983610e67818503826102e0565b60405191829160208352602083019061039e565b601460009081527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec939250905b808210610ec057509091508101602001610e67610e57565b919260018160209254838588010152019101909291610ea8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610e679050610e57565b346100e75760006003193601126100e757610f3561169d565b506040517f5a5092800000000000000000000000000000000000000000000000000000000081526020600482015260008180610f7360248201611255565b0381305afa90811561072857600091610f95575b60405180610709848261083a565b3d8083833e610fa481836102e0565b8101906020818303126110435780519067ffffffffffffffff8211611047570160a0818303126110435760405191610fdb83610254565b8151610fe6816116c8565b83526020820151610ff6816116c8565b602084015260408201516040840152606082015167ffffffffffffffff811161103f579361102c8392610709966080950161120a565b6060850152500151608082015290610f87565b8480fd5b8280fd5b8380fd5b346100e75760606003193601126100e75760043567ffffffffffffffff81116100e75760e060031982360301126100e7576024359067ffffffffffffffff82116100e757366023830112156100e75781600401359167ffffffffffffffff83116100e75736602484830101116100e7576044359067ffffffffffffffff82116100e757610709936110f3936110e66024943690600401610975565b9490930190600401612345565b60405190151581529081906020820190565b346100e75760006003193601126100e757602067ffffffffffffffff60115416604051908152f35b346100e75760006003193601126100e757602060405160108152f35b604051906111586020836102e0565b600080835282815b82811061116c57505050565b806060602080938501015201611160565b604051610140919061118f83826102e0565b6009815291601f19018260005b8281106111a857505050565b80606060208093850101520161119c565b67ffffffffffffffff811161024f57601f01601f191660200190565b909291926111e2816111b9565b916111f060405193846102e0565b8294828452828201116100e757602061031d93019061037b565b9080601f830112156100e75781516103ed926020016111d5565b91906040838203126100e757825167ffffffffffffffff81116100e75760209161124f91850161120a565b92015190565b60806103ed916007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b92936080946112c3936103ed9793865260208601526040850152606084015260c08484015260c0830190610bc8565b9060a08183039101526007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b6040513d6000823e3d90fd5b601f821161131e57505050565b6000526020600020906020601f840160051c83019310611359575b601f0160051c01905b81811061134d575050565b60008155600101611342565b9091508190611339565b90815167ffffffffffffffff811161024f5761138b8161138460145461010f565b6014611311565b602092601f82116001146113ea576113da929382916000926113df575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601455565b0151905038806113a8565b6014600052601f198216937fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9160005b86811061146f5750836001959610611438575b505050811b01601455565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061142d565b9192602060018192868501518155019401920161141a565b908160209103126100e7575180151581036100e75790565b90806020835491828152019160208260051b820101936000526020600020926000915b8383106114d157505050505090565b9091929394602060016114ee83601f198684960301875289610162565b970193019301919392906114c2565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061152f57505050505090565b90919293946020600282601f19856001950301865260408152611555604082018a610162565b9083858b015491015297019301930191939290611520565b61168d6103ed92606083526115a060608401611592600b5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e0608084015261167f61164d6115f06115bf6101408701600c61149f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600d610162565b600e5467ffffffffffffffff811660c088015261161b9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600f610162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101208601526010610162565b90838203602085015261039e565b90604081830391015260126114fd565b604051906116aa82610254565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100e757565b356103ed816116c8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e7576020019181360383136100e757565b92919261174d826111b9565b9161175b60405193846102e0565b8294818452818301116100e7578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117b45760200190565b611778565b8051600110156117b45760400190565b8051600210156117b45760600190565b8051600310156117b45760800190565b8051600410156117b45760a00190565b8051600510156117b45760c00190565b8051600610156117b45760e00190565b8051600710156117b4576101000190565b8051600810156117b4576101200190565b80518210156117b45760209160051b010190565b92919261185b82610b33565b9361186960405195866102e0565b602085848152019260051b8201918183116100e75780935b83851061188f575050505050565b843567ffffffffffffffff81116100e757820183601f820112156100e7576020916118c08583858095359101611741565b815201940193611881565b959290919493946118da61117d565b966118e86020860135612454565b6118f1896117a7565b526118fb886117a7565b5061190590612b80565b61190e906124a6565b611917886117b9565b52611921876117b9565b5061192b90612b80565b611934906124a6565b61193d876117c9565b52611947866117c9565b5061195190612b80565b61195a906124a6565b611963866117d9565b5261196d856117d9565b5061197790612b80565b611980906124a6565b611989856117e9565b52611993846117e9565b506119a0604082016116e6565b6119a990612465565b6119b2856117f9565b526119bc846117f9565b506119c78135612454565b6119d085611809565b526119da84611809565b50606081016119e8916116f0565b36906119f392611741565b6119fc906124a6565b611a0584611819565b52611a0f83611819565b503690611a1b9261184f565b611a249061263a565b611a2d8261182a565b52611a378161182a565b50611a419061263a565b611a49612aa7565b611a52906124a6565b90611a5c91612755565b908151602083012090565b67ffffffffffffffff8116036100e757565b9080601f830112156100e757815191611a9183610b33565b92611a9f60405194856102e0565b80845260208085019160051b830101918383116100e75760208101915b838310611acb57505050505090565b825167ffffffffffffffff81116100e7578201906060601f1983880301126100e75760405191611afa836102a8565b6020810151611b0881611a67565b835260408101519067ffffffffffffffff82116100e757611b3088602060609484010161120a565b602085015201519060038210156100e7578260209392604085940152815201920191611abc565b91906060838203126100e75760405190611b70826102a8565b81938051611b7d81611a67565b8352602081015167ffffffffffffffff81116100e75782611b9f91830161120a565b602084015260408101519167ffffffffffffffff83116100e757604092611bc6920161120a565b910152565b6020818303126100e75780519067ffffffffffffffff82116100e75701906020828203126100e75760405191611c00836102c4565b80519067ffffffffffffffff82116100e757016060818303126100e75760405191611c2a836102a8565b815167ffffffffffffffff81116100e75782016080818303126100e75760405190611c5482610270565b8051611c5f81611a67565b82526020810151611c6f816116c8565b6020830152604081015167ffffffffffffffff81116100e757810183601f820112156100e75783816020611ca5935191016111d5565b604083015260608101519067ffffffffffffffff82116100e757611ccb9184910161120a565b60608201528352602082015167ffffffffffffffff81116100e75781611cf2918401611a79565b6020840152604082015167ffffffffffffffff81116100e757611d159201611b57565b6040820152815290565b6020818303126100e75780519067ffffffffffffffff82116100e757019080601f830112156100e7578151611d5381610b33565b92611d6160405194856102e0565b81845260208085019260051b8201019283116100e757602001905b828210611d895750505090565b8151815260209182019101611d7c565b8091039060c082126100e75760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611dd886610270565b8351611de381611a67565b86526020840151611df381611a67565b60208701526040840151611e0681611a67565b60408701520112611e4b5760a09060405192611e21846102a8565b6060820151611e2f81611a67565b8452608082015160208501525001516040820152606082015290565b5080fd5b6103ed9060408152611e65604082016001610162565b9060208183039101526002610162565b601554421161209f57611ed96000611e9660115467ffffffffffffffff1690565b6040517f012d56e000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156107285760409160009161207c575b50510151805167ffffffffffffffff1615612076576020611f5191015160208082518301019101611d1f565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611f8760048201611e4f565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610728576103ed9261203b92600092612041575b5080612003611ff3611fec612008946117a7565b51926117b9565b5191662386f26fc100009061282a565b61283d565b6120356120286040806060860151015194015167ffffffffffffffff1690565b67ffffffffffffffff1690565b916128be565b90612928565b6120089192506120689060c03d60c01161206f575b61206081836102e0565b810190611d99565b9190611fd8565b503d612056565b50600090565b61209991503d806000833e61209181836102e0565b810190611bcb565b38611f25565b600090565b356103ed81611a67565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e757602001918160051b360383136100e757565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100e757016020813591019167ffffffffffffffff82116100e75781360383136100e757565b90602083828152019160208260051b8501019381936000915b84831061219c5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100e7576020809187600194019082806122016121f38580612123565b604086526040860191612102565b930135910152980193019301919493929061218c565b9060028210156104295752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff61225495941681528160208201520191612102565b938d6040818703910152808552602085019460208260051b82010195836000925b84841061230d57505050505050946122d78c9d60a06122c661031d9e9f986101209e9c986122b86123049f9d996122e8996122f59e8e6060818503910152612102565b918b830360808d0152612173565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152612102565b91878303610100890152612102565b93016001612217565b90919293949760208061233583601f19866001960301885261232f8d88612123565b90612102565b9a01940194019294939190612275565b9092939193612353826120a4565b9261236160208401846120ae565b93909261237160408301836116f0565b91909360608401612381906120a4565b9161238e608086016120a4565b9361239c60a08701876116f0565b97909660c081016123ac916116f0565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e6123e69f612224565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107285760009161243b575090565b6103ed915060203d60201161077f5761077181836102e0565b6124606103ed91612b80565b6124a6565b6103ed906040519074140000000000000000000000000000000000000000186014820152603481016040526124a6565b9081518110156117b4570160200190565b60008151600181149081612622575b50156124bf575090565b815190603882101561251a57906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560806124ff612a0b565b94612c1b565b60f81b16901a612514826117a7565b53612755565b6001939092835b61252b868561283d565b156125485761253c61254291612a7a565b95612813565b94612521565b9092945092909261256061255b82612bff565b612a49565b917fff00000000000000000000000000000000000000000000000000000000000000612595612590608085612c1b565b612c0d565b60f81b16811a6125a4846117a7565b5360015b828111156125be575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661261d96896128b1565b612c28565b8b61283d565b60ff1690565b60f81b16831a6126178287612495565b53612a7a565b6125a8565b9050156117b4576080602083015160f81c10386124b5565b61264390612cc2565b80516000603882101561268457906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560c06124ff612a0b565b6001939092835b612695868561283d565b156126ac5761253c6126a691612a7a565b9461268b565b909294509290926126bf61255b82612bff565b917fff000000000000000000000000000000000000000000000000000000000000006126ef61259060c085612c1b565b60f81b16811a6126fe846117a7565b5360015b82811115612718575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661275096896128b1565b612702565b90604051918051908184526020840191840192602084019260208301905b8481106127c15750508051809386518201875294019360208086019201905b8281106127b15750509051603f92011590920101601f19166040525090565b8151815260209182019101612792565b8151815260209182019101612773565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b604d811161280e57600a0a90565b6127d1565b908160081b91808304610100149015171561280e57565b8181029291811591840414171561280e57565b8115612847570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b602003906020821161280e57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161280e57565b9190820391821161280e57565b90929190601082111561292057815b82039082821161280e576128e36128e992612800565b9061282a565b927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0820191821161280e576128e36103ed92612800565b6010916128cd565b60ff60055416916129388361041f565b6001831492836129db575b83156129b8575b8315612994575b8315612969575b50505061296457600090565b600190565b6002919293506129788161041f565b14918261298a575b5050388080612958565b1090503880612980565b925061299f8361041f565b60038314806129af575b92612951565b508082116129a9565b92506129c38361041f565b8215806129d1575b9261294a565b50808211156129cb565b818310159350612943565b604080519091906129f783826102e0565b60208152918290601f190190369060200137565b60408051909190612a1c83826102e0565b6001815291601f1901366020840137565b60405190612a3c6020836102e0565b6000808352366020840137565b90612a53826111b9565b612a6060405191826102e0565b828152601f19612a7082946111b9565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461280e5760010190565b612aaf6129e6565b90600260208301526000915b60208310612b37575b612ad061255b84612876565b9060005b8251811015612b3057600190612b1c612af6612aef88612a7a565b9785612495565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612b298286612495565b5301612ad4565b5090925050565b91612b6d612b48612af68386612495565b7fff000000000000000000000000000000000000000000000000000000000000001690565b612b7a5760010191612abb565b91612ac4565b90612b896129e6565b9160208301526000915b60208310612bdb575b612ba861255b84612876565b9060005b8251811015612b3057600190612bc7612af6612aef88612a7a565b60001a612bd48286612495565b5301612bac565b91612bec612b48612af68386612495565b612bf95760010191612b93565b91612b9c565b906001820180921161280e57565b906037820180921161280e57565b9190820180921161280e57565b601f811161280e576101000a90565b15612c3e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b90815115612d6657600091825b8151841015612d0e57612d06600191612cf4612ceb878661183b565b51511515612c37565b612cfe868561183b565b515190612c1b565b930192612ccf565b612d1a91929350612a49565b9060208201926000935b8251851015612d5f57612d57600191612d4d612d40888761183b565b5160208151910183612d70565b612cfe878661183b565b940193612d24565b5092505090565b90506103ed612a2d565b915b6020811015612da5576020036020811161280e57612d92612d9791612c28565b612884565b905182518216911916179052565b9091825181526020810180911161280e57916020810180911161280e5790601f19810190811115612d72576127d156fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000000000000000000000", + "nonce": "0x3", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xdba8408ef5cb6ab6fcfa274ba815eb2a4740165b", + "initCode": "0x60a034607357601f61582c38819003918201601f19168301916001600160401b03831184841017607857808492602094604052833981010312607357516001600160a01b03811690819003607357600160005560805260405161579d908161008f823960805181818160b001526103c90152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806306433b1b146100885780630b0fdb3d146100525780637fddd6021461004d5763b60bda491461004857600080fd5b6101e9565b610128565b34610083576020600319360112610083576004356000526001602052602060ff604060002054166040519015158152f35b600080fd5b346100835760006003193601126100835773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660805260206080f35b600091031261008357565b6064359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b359073ffffffffffffffffffffffffffffffffffffffff8216820361008357565b346100835760406003193601126100835760043573ffffffffffffffffffffffffffffffffffffffff81168091036100835761019a60209161018461019260243560405192839187830195869091604092825260208201520190565b03601f1981018352826102d6565b519020610b0d565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b9181601f840112156100835782359167ffffffffffffffff8311610083576020808501948460051b01011161008357565b346100835760a06003193601126100835760043567ffffffffffffffff811161008357608060031982360301126100835760243567ffffffffffffffff81116100835760406003198236030112610083576044359067ffffffffffffffff8211610083576102a39261026261027c9336906004016101b8565b9061026b6100e4565b9260843594600401906004016102fe565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176102f957604052565b6102a7565b9293949190916002600054146105d957600260005560405161033481610184602082019432869091604092825260208201520190565b5190209461035661034f876000526001602052604060002090565b5460ff1690565b6105af5761018461040b936103fb6104179661018461041196328c7f4d26f9b035ac4dafb21ce257260243ad6adf7e105ac6517fe42bebde1d0828ca600080a36149cf966103a660208901610603565b97808952610dc260208a013973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169b8c92604051978896602088016109e7565b6040519485936020850190610ad6565b90610ad6565b83610ca3565b9161042181610b0d565b73ffffffffffffffffffffffffffffffffffffffff8416801591821561058e575b505061056157813b15610083576040517f4420e48600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152916000908390602490829084905af190811561055c576104f0926104c592610541575b506000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b60405173ffffffffffffffffffffffffffffffffffffffff8216815233907ffb2d8b84e2e1acdcdbad3ce10c5a03d9f07b3f9f2e4a6d818a1a6a43610ac3b990602090a29061053f6001600055565b565b806105506000610556936102d6565b806100d9565b386104b4565b610b01565b7f8e6ae65f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff16141590503880610442565b7f0ced30430000000000000000000000000000000000000000000000000000000060005260046000fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b9061053f60405192836102d6565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc182360301811215610083570190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff821161008357813603831361008357565b601f8260209493601f19938186528686013760008582860101520116010190565b6106ef916106e16106d66106c88480610643565b604085526040850191610693565b926020810190610643565b916020818503910152610693565b90565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2182360301811215610083570190565b359067ffffffffffffffff8216820361008357565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561008357016020813591019167ffffffffffffffff8211610083578160051b3603831361008357565b90602083828152019260208260051b82010193836000925b8484106107b45750505050505090565b9091929394956020806107dc83601f1986600196030188526107d68b88610643565b90610693565b98019401940192949391906107a4565b6106ef9167ffffffffffffffff61080283610724565b1681526108b06108a561084a61082f61081e6020870187610739565b60e0602088015260e087019161078c565b61083c6040870187610643565b908683036040880152610693565b61086a61085960608701610724565b67ffffffffffffffff166060860152565b61088a61087960808701610724565b67ffffffffffffffff166080860152565b61089760a0860186610643565b9085830360a0870152610693565b9260c0810190610643565b9160c0818503910152610693565b8035917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81823603018312156100835761095e610953610942846106ef960160408552803560408601526020810135606086015273ffffffffffffffffffffffffffffffffffffffff61093260408301610107565b1660808601526060810190610643565b608060a086015260c0850191610693565b9260208101906106f2565b9060208184039101526107ec565b90602083828152019260208260051b82010193836000925b8484106109945750505050505090565b90919293949560208082601f1985600195030187526109b38a87610611565b9082806109d16109c38580610643565b604086526040860191610693565b9301359101529801940194019294939190610984565b91909496959360a08352610a4f610a13610a018880610611565b608060a08701526101208601906106b4565b610a206020890189610611565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608683030160c08701526106b4565b93604087013591600483101561008357610a8d608096610aba95606061053f9b610a9b9760e08b0152013561010089015287820360208901526108be565b91858303604087015261096c565b73ffffffffffffffffffffffffffffffffffffffff9097166060830152565b019073ffffffffffffffffffffffffffffffffffffffff169052565b9081519160005b838110610aee575050016000815290565b8060208092840101518185015201610add565b6040513d6000823e3d90fd5b610c4a73ffffffffffffffffffffffffffffffffffffffff806106ef9360405160208101917fff0000000000000000000000000000000000000000000000000000000000000083523060601b602183015260358201527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f605582015260558152610b986075826102d6565b51902016166040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060208201927fd694000000000000000000000000000000000000000000000000000000000000845260601b1660028301527f01000000000000000000000000000000000000000000000000000000000000006016830152610c2e816017840103601f1981018352826102d6565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b3d15610c9e573d9067ffffffffffffffff82116102f95760405191610c92601f8201601f1916602001846102d6565b82523d6000602084013e565b606090565b919060405192610cb46040856102d6565b601084527f67363d3d37363d34f03d5260086018f3000000000000000000000000000000006020850152610ce781610b0d565b93843b610d97576020815191016000f573ffffffffffffffffffffffffffffffffffffffff811615610d6d5781600092918360208194519301915af1610d2b610c63565b50158015610d64575b610d3a57565b7f53de54b90000000000000000000000000000000000000000000000000000000060005260046000fd5b50813b15610d34565b7fbbd2fe870000000000000000000000000000000000000000000000000000000060005260046000fd5b7fcd43efa10000000000000000000000000000000000000000000000000000000060005260046000fdfe6101208060405234611417576149cf803803809161001d8285611831565b8339810160a0828203126114175781516001600160401b038111611417578201916080838303126114175760405192610055846117e0565b80516001600160401b03811161141757836100719183016118cc565b845260208101516001600160401b03811161141757836100929183016118cc565b6020850152604081015190600482101561141757606091604086015201519060608401918252602081015160018060401b0381116114175781019160408385031261141757604051926100e4846117fb565b80516001600160401b038111611417578101608081870312611417576040519061010d826117e0565b80518252602081015160208301526101276040820161192d565b60408301526060810151906001600160401b0382116114175761014c91889101611877565b606082015284526020810151906001600160401b038211611417570160e081860312611417576040519061017f82611816565b61018881611941565b825260208101516001600160401b03811161141757810186601f820112156114175780516101b581611955565b916101c36040519384611831565b81835260208084019260051b820101918983116114175760208201905b8382106117b35750505050602083015260408101516001600160401b038111611417578661020f918301611877565b604083015261022060608201611941565b606083015261023160808201611941565b608083015260a08101516001600160401b0381116114175786610255918301611877565b60a083015260c0810151906001600160401b0382116114175761027a91879101611877565b60c0820152602084015260408201516001600160401b03811161141757820184601f82011215611417578051906102b082611955565b956102be6040519788611831565b82875260208088019360051b830101918183116114175760208101935b83851061174b5750505050506102ff60806102f86060850161192d565b930161192d565b602084015184519194916001600160a01b0385161561173a576001600160a01b038616156117295760a082015151156117185760c0820151511561170757604001516001600160a01b0316156116f65761090060805260406101008190528051919061036b9083611831565b600182526020820191601f196101005101368437600161038a8261196c565b52608051915161010080515163338c1f5160e01b81526001600160401b03909216600483015251602482015290516044820181905290926001600160a01b0390921691839160648301919060005b8181106116da5750505091818060009403915afa9081156114245760009161149e575b5061040c602061041692015161196c565b5151805190611a3b565b901561148d57600080546001600160a01b0319166001600160a01b039290921691909117905561090260a05261090360c05261010051516060949061045b8682611831565b60028152601f19860160005b81811061147d57505060208801515161047f8261196c565b526104898161196c565b50602080890151015161049b82611979565b526104a581611979565b506101005151906104b5826117fb565b600182526064602083015284516101005151908882016001600160401b0381118382101761075e57610100515281526020810191825261010051810192835260018060a01b0360c051169261010051519260208085015260c08401925161010051850152519160808a850152825180915260e0840190602060e08260051b8701019401916000905b828210611452575050505051608083016000905b6002821061143257505050600092826105786020946105c09403601f198101835282611831565b6101005151948580948193630b1e6daf60e31b835261010051600484015260096044840152681c1c9a58d95c1c995960ba1b6064840152608060248401526084830190611989565b03925af1908115611424576000916113e5575b50601180546001600160401b0319166001600160401b03929092169190911790556001600160a01b031660e05260005b855181101561079e576000865182101561078a575060208160051b870101516012546801000000000000000081101561075e5760018101806012558110156107745760126000528151805160019290921b7fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444019291906001600160401b03821161075e5761069b8261069586546119ae565b866119ff565b602090601f83116001146106ef57926106d68360019796959460209489966000926106e4575b50508160011b916000199060031b1c19161790565b84555b015191015501610603565b0151905038806106c1565b90601f1983169185600052816000209260005b8181106107465750936020936001989796938996938388951061072d575b505050811b0184556106d9565b015160001960f88460031b161c19169055388080610720565b92936020600181928786015181550195019301610702565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b81526032600452602490fd5b508551805180518892916001600160401b03821161075e576107c16001546119ae565b601f8111611396575b50602090601f831160011461132a5791806107ff92602095946000926111ac5750508160011b916000199060031b1c19161790565b6001555b01518051906001600160401b03821161075e576108216002546119ae565b601f81116112db575b50602090601f83116001146112725761085b92916000918361100f5750508160011b916000199060031b1c19161790565b6002555b602081015180518051906001600160401b03821161075e576108826003546119ae565b601f8111611223575b50602090601f83116001146111b75791806108c092602095946000926111ac5750508160011b916000199060031b1c19161790565b6003555b01518051906001600160401b03821161075e576108e26004546119ae565b601f811161115d575b50602090601f83116001146110f157918061092092604095946000926110e65750508160011b916000199060031b1c19161790565b6004555b01519160048310156110d05760009260ff801960055416911617600555516006558381518051600755602081015160085560018060a01b03610100518201511660018060a01b03196009541617600955015180519060018060401b038211610e7857610991600a546119ae565b601f8111611082575b50602090601f831160011461101a5791806109ce9260209594879261100f5750508160011b916000199060031b1c19161790565b600a555b01519260018060401b0384511660018060401b0319600b541617600b556020840151805190680100000000000000008211610e7857600c5482600c55808310610f7b575b50600c845283907fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7906020015b838310610e8c575050610100518601518051925090506001600160401b038211610e7857610a72600d546119ae565b601f8111610e2a575b50602090601f8311600114610dc557610aab9291859183610d045750508160011b916000199060031b1c19161790565b600d555b830151600e80546080860151610100516001600160801b03199092166001600160401b0394851617911b6fffffffffffffffff00000000000000001617905560a084015180519094918111610cf057610b09600f546119ae565b601f8111610d77575b506020601f8211600114610d0f579080610b469285969760c09692610d045750508160011b916000199060031b1c19161790565b600f555b015180519092906001600160401b038111610cf057610b6a6010546119ae565b601f8111610c97575b506020601f8211600114610c345781908495610ba4949592610c295750508160011b916000199060031b1c19161790565b6010555b60138054610100600160a81b03191660089290921b610100600160a81b03169190911790554262015180810191908210610c1557506015556101005151612de29081611bed8239608051816123ea015260a05181611fa0015260c05181611ef2015260e051816106770152f35b634e487b7160e01b81526011600452602490fd5b0151905085806106c1565b6010845280842090601f198316855b818110610c7f57509583600195969710610c66575b505050811b01601055610ba8565b015160001960f88460031b161c19169055848080610c58565b9192602060018192868b015181550194019201610c43565b60108452610ce0907f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae672601f840160051c81019160208510610ce6575b601f0160051c01906119e8565b84610b73565b9091508190610cd3565b634e487b7160e01b83526041600452602483fd5b0151905087806106c1565b600f845280842095601f198316855b818110610d5f57509160c095969791846001959410610d46575b505050811b01600f55610b4a565b015160001960f88460031b161c19169055868080610d38565b83830151895560019098019760209384019301610d1e565b600f8452610dbf907f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802601f840160051c81019160208510610ce657601f0160051c01906119e8565b85610b12565b600d85528185209190601f198416865b818110610e125750908460019594939210610df9575b505050811b01600d55610aaf565b015160001960f88460031b161c19169055868080610deb565b92936020600181928786015181550195019301610dd5565b600d8552610e72907fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5601f850160051c81019160208610610ce657601f0160051c01906119e8565b86610a7b565b634e487b7160e01b84526041600452602484fd5b80518051906001600160401b038211610f6757610ead8261069586546119ae565b602090601f8311600114610efe5792610ee4836001959460209487968d92610ef35750508160011b916000199060031b1c19161790565b85555b01920192019190610a43565b015190508e806106c1565b8489528189209190601f1984168a5b818110610f4f5750936020936001969387969383889510610f36575b505050811b018555610ee7565b015160001960f88460031b161c191690558d8080610f29565b92936020600181928786015181550195019301610f0d565b634e487b7160e01b88526041600452602488fd5b600c85527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79081019083015b818110610fb45750610a16565b80610fc1600192546119ae565b80610fce575b5001610fa7565b601f81118314610fe357508681555b89610fc7565b81885260208820610ffe91601f0160051c81019084016119e8565b808752866020812081835555610fdd565b0151905088806106c1565b600a85528185209190601f198416865b81811061106a5750916001939185602097969410611051575b505050811b01600a556109d2565b015160001960f88460031b161c19169055878080611043565b9293602060018192878601518155019501930161102a565b600a85526110ca907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f850160051c81019160208610610ce657601f0160051c01906119e8565b8661099a565b634e487b7160e01b600052602160045260246000fd5b0151905089806106c1565b90601f198316916004600052816000209260005b818110611145575091600193918560409796941061112c575b505050811b01600455610924565b015160001960f88460031b161c1916905588808061111e565b92936020600181928786015181550195019301611105565b60046000526111a6907f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f850160051c81019160208610610ce657601f0160051c01906119e8565b876108eb565b015190508a806106c1565b90601f198316916003600052816000209260005b81811061120b57509160019391856020979694106111f2575b505050811b016003556108c4565b015160001960f88460031b161c191690558980806111e4565b929360206001819287860151815501950193016111cb565b600360005261126c907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f850160051c81019160208610610ce657601f0160051c01906119e8565b8861088b565b90601f198316916002600052816000209260005b8181106112c357509084600195949392106112aa575b505050811b0160025561085f565b015160001960f88460031b161c1916905587808061129c565b92936020600181928786015181550195019301611286565b6002600052611324907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace601f850160051c81019160208610610ce657601f0160051c01906119e8565b8761082a565b90601f198316916001600052816000209260005b81811061137e5750916001939185602097969410611365575b505050811b01600155610803565b015160001960f88460031b161c19169055898080611357565b9293602060018192878601518155019501930161133e565b60016000526113df907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f850160051c81019160208610610ce657601f0160051c01906119e8565b886107ca565b90506020813d60201161141c575b8161140060209383611831565b810103126114175761141190611941565b386105d3565b600080fd5b3d91506113f3565b61010051513d6000823e3d90fd5b82516001600160401b031681526020928301926001929092019101610551565b9091929460208061146f60019360df198b82030186528951611989565b97019201920190929161053d565b8088602080938601015201610467565b6307456b9160e21b60005260046000fd5b3d8083833e6114ad8183611831565b60208282810103126116d65781516001600160401b0381116116cd578201610100518183850103126116cd576101005151936114e8856117fb565b81516001600160401b0381116116d257820160e08185870103126116d25761010051519061151582611816565b61151e81611941565b825261152c60208201611941565b602083015261153f610100518201611941565b61010051830152606081015160038110156116cd57606083015260808101516001600160401b0381116116cd5761159d9161158160c092888a01908301611877565b608085015261159260a08201611941565b60a085015201611941565b60c082015285526020820151906001600160401b0382116116cf57838501601f8385010112156116cf5781830151926115d584611955565b956115e561010051519788611831565b848752602087019386820160208760051b8386010101116116cd57602081840101945b60208760051b8386010101861061163357505050505060208501939093525061040c91506103fb9050565b85516001600160401b0381116116c957610100518584018201858b0103601f1901126116c957610100515190611668826117fb565b8584018101602001516001600160401b0381116116c5576116959060208c88019184888b01010101611877565b8252610100519084870101015160038110156116c1576020828101919091529082529586019501611608565b8680fd5b8780fd5b8580fd5b835b80fd5b5080fd5b8280fd5b825160030b8452869450602093840193909201916001016103d8565b630695a62360e51b60005260046000fd5b636fc5f47160e01b60005260046000fd5b63460be67160e11b60005260046000fd5b6311a1e69760e01b60005260046000fd5b63bcda548360e01b60005260046000fd5b84516001600160401b0381116114175782016040818503601f1901126114175760405191611778836117fb565b6020820151926001600160401b038411611417576040836117a0886020809881980101611877565b83520151838201528152019401936102db565b81516001600160401b038111611417576020916117d58d848094880101611877565b8152019101906101e0565b608081019081106001600160401b0382111761075e57604052565b604081019081106001600160401b0382111761075e57604052565b60e081019081106001600160401b0382111761075e57604052565b601f909101601f19168101906001600160401b0382119082101761075e57604052565b60005b8381106118675750506000910152565b8181015183820152602001611857565b81601f820112156114175780516020909101906001600160401b03811161075e57604051926118b0601f8301601f191660200185611831565b81845281830111611417576118c9916020840190611854565b90565b919060408382031261141757604051906118e5826117fb565b8351919384926001600160401b0381116114175782611905918301611877565b83526020810151916001600160401b038311611417576020926119289201611877565b910152565b51906001600160a01b038216820361141757565b51906001600160401b038216820361141757565b6001600160401b03811161075e5760051b60200190565b8051156107745760200190565b8051600110156107745760400190565b906020916119a281518092818552858086019101611854565b601f01601f1916010190565b90600182811c921680156119de575b60208310146119c857565b634e487b7160e01b600052602260045260246000fd5b91607f16916119bd565b8181106119f3575050565b600081556001016119e8565b9190601f8111611a0e57505050565b611a39926000526020600020906020601f840160051c83019310610ce657601f0160051c01906119e8565b565b90600061060f60f31b61ffff60f01b602085015116148060011b9080820460021490151715611a9c576028019081602811610c1557508103611a92576000611a8292611ab0565b90916001600160a01b0390911690565b5050600090600090565b634e487b7160e01b82526011600452602482fd5b6020818301015161060f60f31b6001600160f01b031990911614600181901b94929080860460021490151715611b44576000948101809111611b66579192905b818310611b005750505060019190565b9092919360ff611b1a8160f81b6020888601015116611b7a565b16600f8111611b5a578160041b9180830460101490151715611b4457600191019401919290611af0565b634e487b7160e01b600052601160045260246000fd5b50600094508493505050565b634e487b7160e01b85526011600452602485fd5b60f81c602f811180611be2575b15611b9657602f190160ff1690565b6060811180611bd8575b15611baf576056190160ff1690565b6040811180611bce575b15611bc8576036190160ff1690565b5060ff90565b5060478110611bb9565b5060678110611ba0565b50603a8110611b8756fe6080604052600436101561001257600080fd5b60003560e01c80631c9feaa5146100d7578063229e81fb146100d257806342859ab3146100cd5780635a509280146100c857806362b61c8b146100c357806378b90337146100be578063819ef8ba146100b957806388328a69146100b4578063b3d7ad48146100af578063cad31c74146100aa578063cbe61e59146100a55763d47e4eeb146100a057600080fd5b61112d565b611105565b61104b565b610f1c565b610e12565b610d07565b610a3c565b6109c2565b6108a9565b6104c9565b61042e565b6100ec565b60009103126100e757565b600080fd5b346100e75760006003193601126100e757602060ff601354166040519015158152f35b90600182811c92168015610158575b602083101461012957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161011e565b600092918154916101728361010f565b80835292600181169081156101c8575060011461018e57505050565b60009081526020812093945091925b8383106101ae575060209250010190565b60018160209294939454838587010152019101919061019d565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761024f57604052565b610204565b60a0810190811067ffffffffffffffff82111761024f57604052565b6080810190811067ffffffffffffffff82111761024f57604052565b60e0810190811067ffffffffffffffff82111761024f57604052565b6060810190811067ffffffffffffffff82111761024f57604052565b6020810190811067ffffffffffffffff82111761024f57604052565b90601f601f19910116810190811067ffffffffffffffff82111761024f57604052565b6040519061031d8261031681600f610162565b03836102e0565b565b6040519061031d82610316816010610162565b6040519061033f82610233565b8160405161035981610352816003610162565b03826102e0565b815260206040519161037783610370816004610162565b03846102e0565b0152565b60005b83811061038e5750506000910152565b818101518382015260200161037e565b90601f19601f6020936103bc8151809281875287808801910161037b565b0116010190565b6103ed9160206103dc835160408452604084019061039e565b92015190602081840391015261039e565b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004111561042957565b6103f0565b346100e75760006003193601126100e75760405161044b81610233565b60405161045d81610352816001610162565b815260405161047181610352816002610162565b602082015261047e610332565b60ff60055416906104af600654916104a1604051956080875260808701906103c3565b9085820360208701526103c3565b906004831015610429578392604084015260608301520390f35b346100e75760a06003193601126100e7576004356024359060643591608435916013546105296105108273ffffffffffffffffffffffffffffffffffffffff9060081c1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b33036108025760ff166107d857610545610541611e75565b1590565b6107ae5761058c600093610557611149565b9060405196879586957f62b61c8b00000000000000000000000000000000000000000000000000000000875260048701611294565b0381305afa90811561072857600090600092610786575b506105ad90611363565b61060a60206040516105d7816105c98685830160209181520190565b03601f1981018352826102e0565b604051809381927fcad31c740000000000000000000000000000000000000000000000000000000083526004830161156d565b03816000305af180156107285761065591600091610757575b5060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00601354169115151617601355565b60135460ff1661072d575b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803b156100e7576040517faa733a4400000000000000000000000000000000000000000000000000000000815232600482015260248101839052906000908290604490829084905af180156107285761070d575b5060135460ff16604080519115158252602082019290925290819081015b0390f35b8061071c6000610722936102e0565b806100dc565b386106eb565b611305565b7f68f46c45a243a0e9065a97649faf9a5afe1692f2679e650c2f853b9cd734cc0e600080a1610660565b610779915060203d60201161077f575b61077181836102e0565b810190611487565b38610623565b503d610767565b6105ad92506107a891503d806000833e6107a081836102e0565b810190611224565b916105a3565b7f741926a10000000000000000000000000000000000000000000000000000000060005260046000fd5b7ff44909800000000000000000000000000000000000000000000000000000000060005260046000fd5b7f82b429000000000000000000000000000000000000000000000000000000000060005260046000fd5b908160809103126100e75790565b6020815273ffffffffffffffffffffffffffffffffffffffff825116602082015273ffffffffffffffffffffffffffffffffffffffff60208301511660408201526040820151606082015260a060806108a06060850151838386015260c085019061039e565b93015191015290565b346100e75760206003193601126100e75760043567ffffffffffffffff81116100e7576108dd61070991369060040161082c565b6108e561169d565b5073ffffffffffffffffffffffffffffffffffffffff600054169061095f6040820135610911816116c8565b73ffffffffffffffffffffffffffffffffffffffff602084013561093b85359560608101906116f0565b9290936040519761094b89610254565b885216602087015260408601523691611741565b606083015260808201526040519182918261083a565b9181601f840112156100e75782359167ffffffffffffffff83116100e7576020808501948460051b0101116100e757565b9291906109bd60209160408652604086019061039e565b930152565b346100e75760c06003193601126100e75760243560043560643560443560843567ffffffffffffffff81116100e7576109ff903690600401610975565b92909160a4359567ffffffffffffffff87116100e757610a26610a2c97369060040161082c565b956118cb565b90610709604051928392836109a6565b346100e75760006003193601126100e7576020610a57611e75565b6040519015158152f35b600a5460009291610a718261010f565b8082529160018116908115610ae65750600114610a8c575050565b600a60009081529293509091907fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b838310610acc575060209250010190565b600181602092949394548385870101520191019190610abb565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040519061031d8261031681600d610162565b67ffffffffffffffff811161024f5760051b60200190565b600c5490610b5882610b33565b91610b6660405193846102e0565b808352600c60009081527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7602085015b838310610ba35750505050565b600160208192604051610bba816103528189610162565b815201920192019190610b96565b9080602083519182815201916020808360051b8301019401926000915b838310610bf457505050505090565b9091929394602080610c1283601f198660019603018752895161039e565b97019301930191939290610be5565b610c7260606103ed9493604084528051604085015260208101518285015273ffffffffffffffffffffffffffffffffffffffff60408201511660808501520151608060a084015260c083019061039e565b90602081830391015267ffffffffffffffff825116815260c0610cf6610cbc610caa602086015160e0602087015260e0860190610bc8565b6040860151858203604087015261039e565b60608581015167ffffffffffffffff169085015260808581015167ffffffffffffffff169085015260a085015184820360a086015261039e565b9201519060c081840391015261039e565b346100e75760006003193601126100e757604051610d2481610270565b6007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff600954166040820152604051610d5f8161035281610a61565b606082015260405190610d718261028c565b67ffffffffffffffff600b54168252610d88610b4b565b6020830152610d95610b20565b6040830152610de9610dd8600e54610dc8610db78267ffffffffffffffff1690565b67ffffffffffffffff166060870152565b60401c67ffffffffffffffff1690565b67ffffffffffffffff166080840152565b610df1610303565b60a0830152610dfe61031f565b60c083015261070960405192839283610c21565b346100e75760006003193601126100e75760ff60135416156107d8576040516000601454610e3f8161010f565b8084529060018116908115610eda5750600114610e7b575b61070983610e67818503826102e0565b60405191829160208352602083019061039e565b601460009081527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec939250905b808210610ec057509091508101602001610e67610e57565b919260018160209254838588010152019101909291610ea8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b84019091019150610e679050610e57565b346100e75760006003193601126100e757610f3561169d565b506040517f5a5092800000000000000000000000000000000000000000000000000000000081526020600482015260008180610f7360248201611255565b0381305afa90811561072857600091610f95575b60405180610709848261083a565b3d8083833e610fa481836102e0565b8101906020818303126110435780519067ffffffffffffffff8211611047570160a0818303126110435760405191610fdb83610254565b8151610fe6816116c8565b83526020820151610ff6816116c8565b602084015260408201516040840152606082015167ffffffffffffffff811161103f579361102c8392610709966080950161120a565b6060850152500151608082015290610f87565b8480fd5b8280fd5b8380fd5b346100e75760606003193601126100e75760043567ffffffffffffffff81116100e75760e060031982360301126100e7576024359067ffffffffffffffff82116100e757366023830112156100e75781600401359167ffffffffffffffff83116100e75736602484830101116100e7576044359067ffffffffffffffff82116100e757610709936110f3936110e66024943690600401610975565b9490930190600401612345565b60405190151581529081906020820190565b346100e75760006003193601126100e757602067ffffffffffffffff60115416604051908152f35b346100e75760006003193601126100e757602060405160108152f35b604051906111586020836102e0565b600080835282815b82811061116c57505050565b806060602080938501015201611160565b604051610140919061118f83826102e0565b6009815291601f19018260005b8281106111a857505050565b80606060208093850101520161119c565b67ffffffffffffffff811161024f57601f01601f191660200190565b909291926111e2816111b9565b916111f060405193846102e0565b8294828452828201116100e757602061031d93019061037b565b9080601f830112156100e75781516103ed926020016111d5565b91906040838203126100e757825167ffffffffffffffff81116100e75760209161124f91850161120a565b92015190565b60806103ed916007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b92936080946112c3936103ed9793865260208601526040850152606084015260c08484015260c0830190610bc8565b9060a08183039101526007548152600854602082015273ffffffffffffffffffffffffffffffffffffffff60095416604082015281606082015201600a610162565b6040513d6000823e3d90fd5b601f821161131e57505050565b6000526020600020906020601f840160051c83019310611359575b601f0160051c01905b81811061134d575050565b60008155600101611342565b9091508190611339565b90815167ffffffffffffffff811161024f5761138b8161138460145461010f565b6014611311565b602092601f82116001146113ea576113da929382916000926113df575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b601455565b0151905038806113a8565b6014600052601f198216937fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec9160005b86811061146f5750836001959610611438575b505050811b01601455565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061142d565b9192602060018192868501518155019401920161141a565b908160209103126100e7575180151581036100e75790565b90806020835491828152019160208260051b820101936000526020600020926000915b8383106114d157505050505090565b9091929394602060016114ee83601f198684960301875289610162565b970193019301919392906114c2565b90806020835491828152019160208260051b820101936000526020600020926000915b83831061152f57505050505090565b90919293946020600282601f19856001950301865260408152611555604082018a610162565b9083858b015491015297019301930191939290611520565b61168d6103ed92606083526115a060608401611592600b5467ffffffffffffffff1690565b67ffffffffffffffff169052565b60e0608084015261167f61164d6115f06115bf6101408701600c61149f565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08782030160a0880152600d610162565b600e5467ffffffffffffffff811660c088015261161b9060401c67ffffffffffffffff1660e0880152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa086820301610100870152600f610162565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0858203016101208601526010610162565b90838203602085015261039e565b90604081830391015260126114fd565b604051906116aa82610254565b60006080838281528260208201528260408201526060808201520152565b73ffffffffffffffffffffffffffffffffffffffff8116036100e757565b356103ed816116c8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e7576020019181360383136100e757565b92919261174d826111b9565b9161175b60405193846102e0565b8294818452818301116100e7578281602093846000960137010152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156117b45760200190565b611778565b8051600110156117b45760400190565b8051600210156117b45760600190565b8051600310156117b45760800190565b8051600410156117b45760a00190565b8051600510156117b45760c00190565b8051600610156117b45760e00190565b8051600710156117b4576101000190565b8051600810156117b4576101200190565b80518210156117b45760209160051b010190565b92919261185b82610b33565b9361186960405195866102e0565b602085848152019260051b8201918183116100e75780935b83851061188f575050505050565b843567ffffffffffffffff81116100e757820183601f820112156100e7576020916118c08583858095359101611741565b815201940193611881565b959290919493946118da61117d565b966118e86020860135612454565b6118f1896117a7565b526118fb886117a7565b5061190590612b80565b61190e906124a6565b611917886117b9565b52611921876117b9565b5061192b90612b80565b611934906124a6565b61193d876117c9565b52611947866117c9565b5061195190612b80565b61195a906124a6565b611963866117d9565b5261196d856117d9565b5061197790612b80565b611980906124a6565b611989856117e9565b52611993846117e9565b506119a0604082016116e6565b6119a990612465565b6119b2856117f9565b526119bc846117f9565b506119c78135612454565b6119d085611809565b526119da84611809565b50606081016119e8916116f0565b36906119f392611741565b6119fc906124a6565b611a0584611819565b52611a0f83611819565b503690611a1b9261184f565b611a249061263a565b611a2d8261182a565b52611a378161182a565b50611a419061263a565b611a49612aa7565b611a52906124a6565b90611a5c91612755565b908151602083012090565b67ffffffffffffffff8116036100e757565b9080601f830112156100e757815191611a9183610b33565b92611a9f60405194856102e0565b80845260208085019160051b830101918383116100e75760208101915b838310611acb57505050505090565b825167ffffffffffffffff81116100e7578201906060601f1983880301126100e75760405191611afa836102a8565b6020810151611b0881611a67565b835260408101519067ffffffffffffffff82116100e757611b3088602060609484010161120a565b602085015201519060038210156100e7578260209392604085940152815201920191611abc565b91906060838203126100e75760405190611b70826102a8565b81938051611b7d81611a67565b8352602081015167ffffffffffffffff81116100e75782611b9f91830161120a565b602084015260408101519167ffffffffffffffff83116100e757604092611bc6920161120a565b910152565b6020818303126100e75780519067ffffffffffffffff82116100e75701906020828203126100e75760405191611c00836102c4565b80519067ffffffffffffffff82116100e757016060818303126100e75760405191611c2a836102a8565b815167ffffffffffffffff81116100e75782016080818303126100e75760405190611c5482610270565b8051611c5f81611a67565b82526020810151611c6f816116c8565b6020830152604081015167ffffffffffffffff81116100e757810183601f820112156100e75783816020611ca5935191016111d5565b604083015260608101519067ffffffffffffffff82116100e757611ccb9184910161120a565b60608201528352602082015167ffffffffffffffff81116100e75781611cf2918401611a79565b6020840152604082015167ffffffffffffffff81116100e757611d159201611b57565b6040820152815290565b6020818303126100e75780519067ffffffffffffffff82116100e757019080601f830112156100e7578151611d5381610b33565b92611d6160405194856102e0565b81845260208085019260051b8201019283116100e757602001905b828210611d895750505090565b8151815260209182019101611d7c565b8091039060c082126100e75760009060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa060405194611dd886610270565b8351611de381611a67565b86526020840151611df381611a67565b60208701526040840151611e0681611a67565b60408701520112611e4b5760a09060405192611e21846102a8565b6060820151611e2f81611a67565b8452608082015160208501525001516040820152606082015290565b5080fd5b6103ed9060408152611e65604082016001610162565b9060208183039101526002610162565b601554421161209f57611ed96000611e9660115467ffffffffffffffff1690565b6040517f012d56e000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156107285760409160009161207c575b50510151805167ffffffffffffffff1615612076576020611f5191015160208082518301019101611d1f565b6040517f3d0f34da00000000000000000000000000000000000000000000000000000000815260c08180611f8760048201611e4f565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610728576103ed9261203b92600092612041575b5080612003611ff3611fec612008946117a7565b51926117b9565b5191662386f26fc100009061282a565b61283d565b6120356120286040806060860151015194015167ffffffffffffffff1690565b67ffffffffffffffff1690565b916128be565b90612928565b6120089192506120689060c03d60c01161206f575b61206081836102e0565b810190611d99565b9190611fd8565b503d612056565b50600090565b61209991503d806000833e61209181836102e0565b810190611bcb565b38611f25565b600090565b356103ed81611a67565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156100e7570180359067ffffffffffffffff82116100e757602001918160051b360383136100e757565b601f8260209493601f19938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100e757016020813591019167ffffffffffffffff82116100e75781360383136100e757565b90602083828152019160208260051b8501019381936000915b84831061219c5750505050505090565b909192939495601f198282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100e7576020809187600194019082806122016121f38580612123565b604086526040860191612102565b930135910152980193019301919493929061218c565b9060028210156104295752565b9e9b999f9d9c9a9896949593928f6101409067ffffffffffffffff61225495941681528160208201520191612102565b938d6040818703910152808552602085019460208260051b82010195836000925b84841061230d57505050505050946122d78c9d60a06122c661031d9e9f986101209e9c986122b86123049f9d996122e8996122f59e8e6060818503910152612102565b918b830360808d0152612173565b97019067ffffffffffffffff169052565b67ffffffffffffffff1660c08d0152565b8a830360e08c0152612102565b91878303610100890152612102565b93016001612217565b90919293949760208061233583601f19866001960301885261232f8d88612123565b90612102565b9a01940194019294939190612275565b9092939193612353826120a4565b9261236160208401846120ae565b93909261237160408301836116f0565b91909360608401612381906120a4565b9161238e608086016120a4565b9361239c60a08701876116f0565b97909660c081016123ac916116f0565b9a90996040519e8f9e8f7f07d145e90000000000000000000000000000000000000000000000000000000081526004019e6123e69f612224565b03817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1691815a602094600091f19081156107285760009161243b575090565b6103ed915060203d60201161077f5761077181836102e0565b6124606103ed91612b80565b6124a6565b6103ed906040519074140000000000000000000000000000000000000000186014820152603481016040526124a6565b9081518110156117b4570160200190565b60008151600181149081612622575b50156124bf575090565b815190603882101561251a57906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560806124ff612a0b565b94612c1b565b60f81b16901a612514826117a7565b53612755565b6001939092835b61252b868561283d565b156125485761253c61254291612a7a565b95612813565b94612521565b9092945092909261256061255b82612bff565b612a49565b917fff00000000000000000000000000000000000000000000000000000000000000612595612590608085612c1b565b612c0d565b60f81b16811a6125a4846117a7565b5360015b828111156125be575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661261d96896128b1565b612c28565b8b61283d565b60ff1690565b60f81b16831a6126178287612495565b53612a7a565b6125a8565b9050156117b4576080602083015160f81c10386124b5565b61264390612cc2565b80516000603882101561268457906103ed92917fff0000000000000000000000000000000000000000000000000000000000000061250560c06124ff612a0b565b6001939092835b612695868561283d565b156126ac5761253c6126a691612a7a565b9461268b565b909294509290926126bf61255b82612bff565b917fff000000000000000000000000000000000000000000000000000000000000006126ef61259060c085612c1b565b60f81b16811a6126fe846117a7565b5360015b82811115612718575050506103ed929350612755565b807fff000000000000000000000000000000000000000000000000000000000000006126076126016125fb6125f661275096896128b1565b612702565b90604051918051908184526020840191840192602084019260208301905b8481106127c15750508051809386518201875294019360208086019201905b8281106127b15750509051603f92011590920101601f19166040525090565b8151815260209182019101612792565b8151815260209182019101612773565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b604d811161280e57600a0a90565b6127d1565b908160081b91808304610100149015171561280e57565b8181029291811591840414171561280e57565b8115612847570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b602003906020821161280e57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161280e57565b9190820391821161280e57565b90929190601082111561292057815b82039082821161280e576128e36128e992612800565b9061282a565b927ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0820191821161280e576128e36103ed92612800565b6010916128cd565b60ff60055416916129388361041f565b6001831492836129db575b83156129b8575b8315612994575b8315612969575b50505061296457600090565b600190565b6002919293506129788161041f565b14918261298a575b5050388080612958565b1090503880612980565b925061299f8361041f565b60038314806129af575b92612951565b508082116129a9565b92506129c38361041f565b8215806129d1575b9261294a565b50808211156129cb565b818310159350612943565b604080519091906129f783826102e0565b60208152918290601f190190369060200137565b60408051909190612a1c83826102e0565b6001815291601f1901366020840137565b60405190612a3c6020836102e0565b6000808352366020840137565b90612a53826111b9565b612a6060405191826102e0565b828152601f19612a7082946111b9565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461280e5760010190565b612aaf6129e6565b90600260208301526000915b60208310612b37575b612ad061255b84612876565b9060005b8251811015612b3057600190612b1c612af6612aef88612a7a565b9785612495565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60001a612b298286612495565b5301612ad4565b5090925050565b91612b6d612b48612af68386612495565b7fff000000000000000000000000000000000000000000000000000000000000001690565b612b7a5760010191612abb565b91612ac4565b90612b896129e6565b9160208301526000915b60208310612bdb575b612ba861255b84612876565b9060005b8251811015612b3057600190612bc7612af6612aef88612a7a565b60001a612bd48286612495565b5301612bac565b91612bec612b48612af68386612495565b612bf95760010191612b93565b91612b9c565b906001820180921161280e57565b906037820180921161280e57565b9190820180921161280e57565b601f811161280e576101000a90565b15612c3e57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f416e206974656d20696e20746865206c69737420746f20626520524c5020656e60448201527f636f646564206973206e756c6c2e0000000000000000000000000000000000006064820152fd5b90815115612d6657600091825b8151841015612d0e57612d06600191612cf4612ceb878661183b565b51511515612c37565b612cfe868561183b565b515190612c1b565b930192612ccf565b612d1a91929350612a49565b9060208201926000935b8251851015612d5f57612d57600191612d4d612d40888761183b565b5160208151910183612d70565b612cfe878661183b565b940193612d24565b5092505090565b90506103ed612a2d565b915b6020811015612da5576020036020811161280e57612d92612d9791612c28565b612884565b905182518216911916179052565b9091825181526020810180911161280e57916020810180911161280e5790601f19810190811115612d72576127d156fea164736f6c634300081c000aa164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d2592528987" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x9e6711063a479a230728154843e8106fc5a46e47e85622cb1fe6b5892aba12c3", + "transactionType": "CALL", + "contractName": "Create2", + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "function": "deploy(bytes32,bytes)", + "arguments": [ + "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea", + "0x60e03461019c57601f61153938819003918201601f19168301916001600160401b038311848410176101a15780849260a09460405283398101031261019c57610047816101b7565b90610054602082016101b7565b90610061604082016101b7565b9061007a6080610073606084016101b7565b92016101b7565b6001600160a01b0390921693841561018657600080546001600160a01b031981168717825560405196916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316928315610175576001600160a01b0316928315610164576080526001600160a01b0390811660a0521660c052600380546001600160a01b03191691909117905561136d90816101cc823960805181610cf9015260a051818181610269015281816104b10152610864015260c0518181816103740152818161042c0152610b3f0152f35b637d8ed95960e11b60005260046000fd5b637bfd2e8360e01b60005260046000fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361019c5756fe608080604052600436101561001357600080fd5b60003560e01c90816306433b1b14610cce5750806315a96ae9146106225780633f6746ce14610553578063715018a6146104d557806372bdda54146104845780638da5cb5b14610450578063aa638107146103ff578063d1ad17bf146103cb578063f04e5bed146101ce578063f2fde38b146100fa5763f40e84711461009857600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff6100c6610d1d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610128610d1d565b610130611311565b16801561019f5773ffffffffffffffffffffffffffffffffffffffff600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346100f55760606003193601126100f5576101e7610d1d565b60243560443560028110156100f557600090806102f55750506040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916102bc575b505b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6102dc9150823d84116102e2575b6102d48183610d40565b810190610e68565b8261029c565b503d6102ca565b6040513d6000823e3d90fd5b90919060011461030a575b506020915061029e565b6040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830152506020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916103ae575b5082610300565b6103c59150823d84116102e2576102d48183610d40565b826103a7565b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f5576104ee611311565b600073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610581610d1d565b610589611311565b1680156105f85773ffffffffffffffffffffffffffffffffffffffff600354827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600355167fd8a42eaab83c563642705bc71a5905c29682aa5bf997aaa24b2ff7b3f32ed0b6600080a3005b7ffb1db2b20000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760a06003193601126100f55760043567ffffffffffffffff81116100f557366023820112156100f557806004013567ffffffffffffffff81116100f557602482019082019060248201913683116100f5576024359167ffffffffffffffff83116100f55760406003198460040194360301126100f5576044359067ffffffffffffffff82116100f557366023830112156100f55781600401359567ffffffffffffffff87116100f5576024830192602436918960051b0101116100f5576064359160028310156100f55760843592600260015414610ca4576002600155600090806109905750506020828603126100f5573567ffffffffffffffff81116100f5570192606090849003126100f557604051956060870187811067ffffffffffffffff821117610961576040526024840135875260448401359260048410156100f5576020880193845260648501359167ffffffffffffffff83116100f55761082c60a09761081a6107a460209b602461083e9860049c0101610df6565b60408d0190815261080773ffffffffffffffffffffffffffffffffffffffff60035416996040519e8f9d8e9d8e7f3dc48a3400000000000000000000000000000000000000000000000000000000815201525160a48d01525160c48c0190610f20565b51606060e48b01526101048a0190610ef3565b906003198983030160248a0152611000565b9160031987840301604488015261124f565b91606484015260848301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156102e957602091600091610944575b5073ffffffffffffffffffffffffffffffffffffffff81168060005260028352604060002073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556000337f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c88280a45b6001805573ffffffffffffffffffffffffffffffffffffffff60405191168152f35b61095b9150823d84116102e2576102d48183610d40565b82610897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9098969796939493929190600103610c7c57602082870312610c47573567ffffffffffffffff8111610c4757019360809085900312610c7857604051946080860186811067ffffffffffffffff821117610c4b57604052602485013567ffffffffffffffff8111610c4757816024610a0a92880101610df6565b865260448501359067ffffffffffffffff8211610c47576024610a2f92870101610df6565b956020860196875260648501356004811015610c475760408701908152606087019560840135865260035473ffffffffffffffffffffffffffffffffffffffff16956040519889987fb60bda49000000000000000000000000000000000000000000000000000000008a5260048a0160a090525160a48a01608090526101248a01610ab991610ef3565b9051908981037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c0160c48b0152610aef91610ef3565b915160e48901610afe91610f20565b51610104880152868103600319016024880152610b1a91611000565b90858203600319016044870152610b309261124f565b916064840152608483015203817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169181855a94602095f1908115610c3c57916020928192610c1d575b50600173ffffffffffffffffffffffffffffffffffffffff831691828152600285526040812073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c8339180a4610922565b610c35919250833d85116102e2576102d48183610d40565b9083610b8f565b6040513d84823e3d90fd5b8880fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8680fd5b6004897fa3c0e0d1000000000000000000000000000000000000000000000000000000008152fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760006003193601126100f55760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096157604052565b81601f820112156100f55780359067ffffffffffffffff82116109615760405192610dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610d40565b828452602083830101116100f557816000926020809301838601378301015290565b91906040838203126100f557604051906040820182811067ffffffffffffffff821117610961576040528193803567ffffffffffffffff81116100f55782610e3f918301610d81565b835260208101359167ffffffffffffffff83116100f557602092610e639201610d81565b910152565b908160209103126100f5575173ffffffffffffffffffffffffffffffffffffffff811681036100f55790565b919082519283825260005b848110610ede5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e9f565b610f1d916020610f0c8351604084526040840190610e94565b920151906020818403910152610e94565b90565b906004821015610f2d5752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100f557016020813591019167ffffffffffffffff82116100f55781360383136100f557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b359067ffffffffffffffff821682036100f557565b9190823592803603937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8185018112156100f5578101604083528035604084015260208101356060840152604081013573ffffffffffffffffffffffffffffffffffffffff81168091036100f557611095916110849160808601526060810190610f5c565b608060a086015260c0850191610fac565b937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21602083013591018112156100f5570190602081850391015260e083019267ffffffffffffffff6110e683610feb565b16815260208201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112156100f55782016020813591019467ffffffffffffffff82116100f5578160051b9081360387136100f55760e0602085015282905282016101009081019591906000908401835b8383106111fb5750505050506111ed6111e2611191610f1d95966111836040870187610f5c565b908683036040880152610fac565b67ffffffffffffffff6111a660608701610feb565b16606085015267ffffffffffffffff6111c160808701610feb565b1660808501526111d460a0860186610f5c565b9085830360a0870152610fac565b9260c0810190610f5c565b9160c0818503910152610fac565b9091929397602080611240837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008a6001960301875261123a8d87610f5c565b90610fac565b9a01930193019193929061115c565b90602083828152019160208260051b8501019381936000915b8483106112785750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100f5576020809187600194019082806112fb6112ed8580610f5c565b604086526040860191610fac565b9301359101529801930193019194939290611268565b73ffffffffffffffffffffffffffffffffffffffff60005416330361133257565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fdfea164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000008f3415f4fed95503e1893ba98714129cc106b172000000000000000000000000dba8408ef5cb6ab6fcfa274ba815eb2a4740165b" + ], + "transaction": { + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "gas": "0x194b7f", + "value": "0x0", + "input": "0xcdcb760addcc06f98a7c71ab602b8247d540da5bd8f5d2a20000000000000000000003ea000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000015d960e03461019c57601f61153938819003918201601f19168301916001600160401b038311848410176101a15780849260a09460405283398101031261019c57610047816101b7565b90610054602082016101b7565b90610061604082016101b7565b9061007a6080610073606084016101b7565b92016101b7565b6001600160a01b0390921693841561018657600080546001600160a01b031981168717825560405196916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316928315610175576001600160a01b0316928315610164576080526001600160a01b0390811660a0521660c052600380546001600160a01b03191691909117905561136d90816101cc823960805181610cf9015260a051818181610269015281816104b10152610864015260c0518181816103740152818161042c0152610b3f0152f35b637d8ed95960e11b60005260046000fd5b637bfd2e8360e01b60005260046000fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361019c5756fe608080604052600436101561001357600080fd5b60003560e01c90816306433b1b14610cce5750806315a96ae9146106225780633f6746ce14610553578063715018a6146104d557806372bdda54146104845780638da5cb5b14610450578063aa638107146103ff578063d1ad17bf146103cb578063f04e5bed146101ce578063f2fde38b146100fa5763f40e84711461009857600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff6100c6610d1d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610128610d1d565b610130611311565b16801561019f5773ffffffffffffffffffffffffffffffffffffffff600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346100f55760606003193601126100f5576101e7610d1d565b60243560443560028110156100f557600090806102f55750506040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916102bc575b505b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6102dc9150823d84116102e2575b6102d48183610d40565b810190610e68565b8261029c565b503d6102ca565b6040513d6000823e3d90fd5b90919060011461030a575b506020915061029e565b6040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830152506020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916103ae575b5082610300565b6103c59150823d84116102e2576102d48183610d40565b826103a7565b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f5576104ee611311565b600073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610581610d1d565b610589611311565b1680156105f85773ffffffffffffffffffffffffffffffffffffffff600354827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600355167fd8a42eaab83c563642705bc71a5905c29682aa5bf997aaa24b2ff7b3f32ed0b6600080a3005b7ffb1db2b20000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760a06003193601126100f55760043567ffffffffffffffff81116100f557366023820112156100f557806004013567ffffffffffffffff81116100f557602482019082019060248201913683116100f5576024359167ffffffffffffffff83116100f55760406003198460040194360301126100f5576044359067ffffffffffffffff82116100f557366023830112156100f55781600401359567ffffffffffffffff87116100f5576024830192602436918960051b0101116100f5576064359160028310156100f55760843592600260015414610ca4576002600155600090806109905750506020828603126100f5573567ffffffffffffffff81116100f5570192606090849003126100f557604051956060870187811067ffffffffffffffff821117610961576040526024840135875260448401359260048410156100f5576020880193845260648501359167ffffffffffffffff83116100f55761082c60a09761081a6107a460209b602461083e9860049c0101610df6565b60408d0190815261080773ffffffffffffffffffffffffffffffffffffffff60035416996040519e8f9d8e9d8e7f3dc48a3400000000000000000000000000000000000000000000000000000000815201525160a48d01525160c48c0190610f20565b51606060e48b01526101048a0190610ef3565b906003198983030160248a0152611000565b9160031987840301604488015261124f565b91606484015260848301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156102e957602091600091610944575b5073ffffffffffffffffffffffffffffffffffffffff81168060005260028352604060002073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556000337f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c88280a45b6001805573ffffffffffffffffffffffffffffffffffffffff60405191168152f35b61095b9150823d84116102e2576102d48183610d40565b82610897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9098969796939493929190600103610c7c57602082870312610c47573567ffffffffffffffff8111610c4757019360809085900312610c7857604051946080860186811067ffffffffffffffff821117610c4b57604052602485013567ffffffffffffffff8111610c4757816024610a0a92880101610df6565b865260448501359067ffffffffffffffff8211610c47576024610a2f92870101610df6565b956020860196875260648501356004811015610c475760408701908152606087019560840135865260035473ffffffffffffffffffffffffffffffffffffffff16956040519889987fb60bda49000000000000000000000000000000000000000000000000000000008a5260048a0160a090525160a48a01608090526101248a01610ab991610ef3565b9051908981037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c0160c48b0152610aef91610ef3565b915160e48901610afe91610f20565b51610104880152868103600319016024880152610b1a91611000565b90858203600319016044870152610b309261124f565b916064840152608483015203817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169181855a94602095f1908115610c3c57916020928192610c1d575b50600173ffffffffffffffffffffffffffffffffffffffff831691828152600285526040812073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c8339180a4610922565b610c35919250833d85116102e2576102d48183610d40565b9083610b8f565b6040513d84823e3d90fd5b8880fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8680fd5b6004897fa3c0e0d1000000000000000000000000000000000000000000000000000000008152fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760006003193601126100f55760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096157604052565b81601f820112156100f55780359067ffffffffffffffff82116109615760405192610dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610d40565b828452602083830101116100f557816000926020809301838601378301015290565b91906040838203126100f557604051906040820182811067ffffffffffffffff821117610961576040528193803567ffffffffffffffff81116100f55782610e3f918301610d81565b835260208101359167ffffffffffffffff83116100f557602092610e639201610d81565b910152565b908160209103126100f5575173ffffffffffffffffffffffffffffffffffffffff811681036100f55790565b919082519283825260005b848110610ede5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e9f565b610f1d916020610f0c8351604084526040840190610e94565b920151906020818403910152610e94565b90565b906004821015610f2d5752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100f557016020813591019167ffffffffffffffff82116100f55781360383136100f557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b359067ffffffffffffffff821682036100f557565b9190823592803603937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8185018112156100f5578101604083528035604084015260208101356060840152604081013573ffffffffffffffffffffffffffffffffffffffff81168091036100f557611095916110849160808601526060810190610f5c565b608060a086015260c0850191610fac565b937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21602083013591018112156100f5570190602081850391015260e083019267ffffffffffffffff6110e683610feb565b16815260208201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112156100f55782016020813591019467ffffffffffffffff82116100f5578160051b9081360387136100f55760e0602085015282905282016101009081019591906000908401835b8383106111fb5750505050506111ed6111e2611191610f1d95966111836040870187610f5c565b908683036040880152610fac565b67ffffffffffffffff6111a660608701610feb565b16606085015267ffffffffffffffff6111c160808701610feb565b1660808501526111d460a0860186610f5c565b9085830360a0870152610fac565b9260c0810190610f5c565b9160c0818503910152610fac565b9091929397602080611240837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008a6001960301875261123a8d87610f5c565b90610fac565b9a01930193019193929061115c565b90602083828152019160208260051b8501019381936000915b8483106112785750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100f5576020809187600194019082806112fb6112ed8580610f5c565b604086526040860191610fac565b9301359101529801930193019194939290611268565b73ffffffffffffffffffffffffffffffffffffffff60005416330361133257565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fdfea164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000008f3415f4fed95503e1893ba98714129cc106b172000000000000000000000000dba8408ef5cb6ab6fcfa274ba815eb2a4740165b00000000000000", + "nonce": "0x4", + "chainId": "0x271a" + }, + "additionalContracts": [ + { + "transactionType": "CREATE2", + "address": "0xa5799a7b0323fd47d73d8df9b8617002d4b7fb32", + "initCode": "0x60e03461019c57601f61153938819003918201601f19168301916001600160401b038311848410176101a15780849260a09460405283398101031261019c57610047816101b7565b90610054602082016101b7565b90610061604082016101b7565b9061007a6080610073606084016101b7565b92016101b7565b6001600160a01b0390921693841561018657600080546001600160a01b031981168717825560405196916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3600180556001600160a01b0316928315610175576001600160a01b0316928315610164576080526001600160a01b0390811660a0521660c052600380546001600160a01b03191691909117905561136d90816101cc823960805181610cf9015260a051818181610269015281816104b10152610864015260c0518181816103740152818161042c0152610b3f0152f35b637d8ed95960e11b60005260046000fd5b637bfd2e8360e01b60005260046000fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b038216820361019c5756fe608080604052600436101561001357600080fd5b60003560e01c90816306433b1b14610cce5750806315a96ae9146106225780633f6746ce14610553578063715018a6146104d557806372bdda54146104845780638da5cb5b14610450578063aa638107146103ff578063d1ad17bf146103cb578063f04e5bed146101ce578063f2fde38b146100fa5763f40e84711461009857600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff6100c6610d1d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b600080fd5b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610128610d1d565b610130611311565b16801561019f5773ffffffffffffffffffffffffffffffffffffffff600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346100f55760606003193601126100f5576101e7610d1d565b60243560443560028110156100f557600090806102f55750506040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916102bc575b505b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b6102dc9150823d84116102e2575b6102d48183610d40565b810190610e68565b8261029c565b503d6102ca565b6040513d6000823e3d90fd5b90919060011461030a575b506020915061029e565b6040517f7fddd60200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90931660048401526024830152506020818060448101038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa80156102e9576020916000916103ae575b5082610300565b6103c59150823d84116102e2576102d48183610d40565b826103a7565b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100f55760006003193601126100f557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f55760006003193601126100f5576104ee611311565b600073ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346100f55760206003193601126100f55773ffffffffffffffffffffffffffffffffffffffff610581610d1d565b610589611311565b1680156105f85773ffffffffffffffffffffffffffffffffffffffff600354827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600355167fd8a42eaab83c563642705bc71a5905c29682aa5bf997aaa24b2ff7b3f32ed0b6600080a3005b7ffb1db2b20000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760a06003193601126100f55760043567ffffffffffffffff81116100f557366023820112156100f557806004013567ffffffffffffffff81116100f557602482019082019060248201913683116100f5576024359167ffffffffffffffff83116100f55760406003198460040194360301126100f5576044359067ffffffffffffffff82116100f557366023830112156100f55781600401359567ffffffffffffffff87116100f5576024830192602436918960051b0101116100f5576064359160028310156100f55760843592600260015414610ca4576002600155600090806109905750506020828603126100f5573567ffffffffffffffff81116100f5570192606090849003126100f557604051956060870187811067ffffffffffffffff821117610961576040526024840135875260448401359260048410156100f5576020880193845260648501359167ffffffffffffffff83116100f55761082c60a09761081a6107a460209b602461083e9860049c0101610df6565b60408d0190815261080773ffffffffffffffffffffffffffffffffffffffff60035416996040519e8f9d8e9d8e7f3dc48a3400000000000000000000000000000000000000000000000000000000815201525160a48d01525160c48c0190610f20565b51606060e48b01526101048a0190610ef3565b906003198983030160248a0152611000565b9160031987840301604488015261124f565b91606484015260848301520381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156102e957602091600091610944575b5073ffffffffffffffffffffffffffffffffffffffff81168060005260028352604060002073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556000337f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c88280a45b6001805573ffffffffffffffffffffffffffffffffffffffff60405191168152f35b61095b9150823d84116102e2576102d48183610d40565b82610897565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9098969796939493929190600103610c7c57602082870312610c47573567ffffffffffffffff8111610c4757019360809085900312610c7857604051946080860186811067ffffffffffffffff821117610c4b57604052602485013567ffffffffffffffff8111610c4757816024610a0a92880101610df6565b865260448501359067ffffffffffffffff8211610c47576024610a2f92870101610df6565b956020860196875260648501356004811015610c475760408701908152606087019560840135865260035473ffffffffffffffffffffffffffffffffffffffff16956040519889987fb60bda49000000000000000000000000000000000000000000000000000000008a5260048a0160a090525160a48a01608090526101248a01610ab991610ef3565b9051908981037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5c0160c48b0152610aef91610ef3565b915160e48901610afe91610f20565b51610104880152868103600319016024880152610b1a91611000565b90858203600319016044870152610b309261124f565b916064840152608483015203817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169181855a94602095f1908115610c3c57916020928192610c1d575b50600173ffffffffffffffffffffffffffffffffffffffff831691828152600285526040812073ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557f08e9a1418653bd72d79048c016f319d58d60c2615929361e4c38adc69265c4c8339180a4610922565b610c35919250833d85116102e2576102d48183610d40565b9083610b8f565b6040513d84823e3d90fd5b8880fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8680fd5b6004897fa3c0e0d1000000000000000000000000000000000000000000000000000000008152fd5b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b346100f55760006003193601126100f55760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f557565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761096157604052565b81601f820112156100f55780359067ffffffffffffffff82116109615760405192610dd460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610d40565b828452602083830101116100f557816000926020809301838601378301015290565b91906040838203126100f557604051906040820182811067ffffffffffffffff821117610961576040528193803567ffffffffffffffff81116100f55782610e3f918301610d81565b835260208101359167ffffffffffffffff83116100f557602092610e639201610d81565b910152565b908160209103126100f5575173ffffffffffffffffffffffffffffffffffffffff811681036100f55790565b919082519283825260005b848110610ede5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e9f565b610f1d916020610f0c8351604084526040840190610e94565b920151906020818403910152610e94565b90565b906004821015610f2d5752565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156100f557016020813591019167ffffffffffffffff82116100f55781360383136100f557565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b359067ffffffffffffffff821682036100f557565b9190823592803603937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8185018112156100f5578101604083528035604084015260208101356060840152604081013573ffffffffffffffffffffffffffffffffffffffff81168091036100f557611095916110849160808601526060810190610f5c565b608060a086015260c0850191610fac565b937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21602083013591018112156100f5570190602081850391015260e083019267ffffffffffffffff6110e683610feb565b16815260208201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112156100f55782016020813591019467ffffffffffffffff82116100f5578160051b9081360387136100f55760e0602085015282905282016101009081019591906000908401835b8383106111fb5750505050506111ed6111e2611191610f1d95966111836040870187610f5c565b908683036040880152610fac565b67ffffffffffffffff6111a660608701610feb565b16606085015267ffffffffffffffff6111c160808701610feb565b1660808501526111d460a0860186610f5c565b9085830360a0870152610fac565b9260c0810190610f5c565b9160c0818503910152610fac565b9091929397602080611240837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008a6001960301875261123a8d87610f5c565b90610fac565b9a01930193019193929061115c565b90602083828152019160208260051b8501019381936000915b8483106112785750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08282030183528635907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1863603018212156100f5576020809187600194019082806112fb6112ed8580610f5c565b604086526040860191610fac565b9301359101529801930193019194939290611268565b73ffffffffffffffffffffffffffffffffffffffff60005416330361133257565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fdfea164736f6c634300081c000a000000000000000000000000324faaf2281c7fe53197800d3fde0d25925289870000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c300000000000000000000000008f3415f4fed95503e1893ba98714129cc106b172000000000000000000000000dba8408ef5cb6ab6fcfa274ba815eb2a4740165b" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x44906", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xcfcb2d0db51fa9c7cb8d99e09dcd6ac8733094a26c390bc92de8c05443794e61", + "transactionIndex": "0x0", + "blockHash": "0x5a2f53e9e0e707e9259cce2bc3589270b42f916fd88b3dfd08ac41f06dfd48bc", + "blockNumber": "0x1887ee", + "gasUsed": "0x2d252", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": null, + "contractAddress": "0xf3451c19a70852533c3416e76e229e15166d5f33" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0xb051e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x74f818d9e09c6482f38109e1e08fee11dcbbfbd45f4e4af5a9870cc6a500912d", + "transactionIndex": "0x0", + "blockHash": "0x0145fec755ee5120d0d962361b18b4585b9dec95bffb3d863661e346bc0a7b66", + "blockNumber": "0x1887ef", + "gasUsed": "0x98e6a", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x46286a", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8791336ed32c4debdd384b3159101f055bc818463fa680e26de8c130752c1249", + "transactionIndex": "0x0", + "blockHash": "0xc47f71ffa06f1586dc74a664b2331bf9d4b27c7afd97aff7b085fc5258e5ac9e", + "blockNumber": "0x1887f0", + "gasUsed": "0x43132f", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4c8065", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x7d9c2021f2c4b3a748b6e23f5260f6229b40a556dfc3ed2d7de5fbd79469cf9f", + "transactionIndex": "0x0", + "blockHash": "0x1f105363449d0cc41dd0e3f1efd661afb0ff05a8a37d0676b6f8a456cbbe8cbe", + "blockNumber": "0x1887f1", + "gasUsed": "0x4b09b1", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x125025", + "logs": [ + { + "address": "0xa5799a7b0323fd47d73d8df9b8617002d4b7fb32", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000006ea8ac1673402989e7b653ae4e83b54173719c30" + ], + "data": "0x", + "blockHash": "0x3bb79ddb0f03b3ffd9ad4b56aec4071995759a6596644f8788c2e2f35a5bc7bc", + "blockNumber": "0x1887f2", + "transactionHash": "0x9e6711063a479a230728154843e8106fc5a46e47e85622cb1fe6b5892aba12c3", + "transactionIndex": "0x0", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000004000000000000200020000000000000000000800000000200000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000020000000000000000000000000000000000000000000000000000000000080000000", + "type": "0x2", + "transactionHash": "0x9e6711063a479a230728154843e8106fc5a46e47e85622cb1fe6b5892aba12c3", + "transactionIndex": "0x0", + "blockHash": "0x3bb79ddb0f03b3ffd9ad4b56aec4071995759a6596644f8788c2e2f35a5bc7bc", + "blockNumber": "0x1887f2", + "gasUsed": "0x125025", + "effectiveGasPrice": "0x8", + "from": "0xddcc06f98a7c71ab602b8247d540da5bd8f5d2a2", + "to": "0xf3451c19a70852533c3416e76e229e15166d5f33", + "contractAddress": null + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1739040681, + "chain": 10010, + "commit": "c60ce65" +} \ No newline at end of file diff --git a/clone-agent/contracts/foundry.toml b/clone-agent/contracts/foundry.toml new file mode 100644 index 00000000..621e76b7 --- /dev/null +++ b/clone-agent/contracts/foundry.toml @@ -0,0 +1,39 @@ +[profile.default] +auto_detect_solc = false +block_timestamp = 1_680_220_800 # March 31, 2023 at 00:00 GMT +bytecode_hash = "none" +evm_version = "paris" +fuzz = { runs = 1_000 } +gas_reports = ["*"] +optimizer = true +optimizer_runs = 10_000 +out = "out" +script = "script" +test = "test" +via_ir = true +fs_permissions = [ + { access = "read-write", path = "./broadcast" }, + { access = "read-write", path = "./broadcast/Deploy.s.sol" }, +] +libs = ["lib"] + +[profile.ci] +fuzz = { runs = 10_000 } +verbosity = 4 + +[fmt] +bracket_spacing = true +int_types = "long" +line_length = 120 +multiline_func_header = "all" +number_underscore = "thousands" +quote_style = "double" +tab_width = 4 +wrap_comments = true + +remappings = [ + "forge-std/=lib/forge-std/src/", + "@openzeppelin/=lib/openzeppelin-contracts/", + "ds-test/=lib/forge-std/lib/ds-test/src/", + "@0xsequence/create3/=lib/create3/", +] diff --git a/clone-agent/contracts/mocks/MockAsyncPrecompile.sol b/clone-agent/contracts/mocks/MockAsyncPrecompile.sol new file mode 100644 index 00000000..ddbe5a3d --- /dev/null +++ b/clone-agent/contracts/mocks/MockAsyncPrecompile.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { + Future, + FutureByIdResponse, + FutureResponse, + FuturesResponse, + FutureResult, + FutureVote, + IAsync, + PendingFuturesResponse +} from "../src/interfaces/IAsync.sol"; +import { Types } from "../src/Types.sol"; + +contract MockAsyncPrecompile is IAsync { + uint64 public futuresCount = 0; + mapping(uint64 id => FutureByIdResponse output) public _futures; + mapping(address orderAddress => address orderCreator) public orders; + + function addFuture(string calldata handler, bytes calldata input) external returns (uint64 futureId) { + futureId = uint64(++futuresCount); + Future memory future = Future({ + id: futureId, + // solhint-disable-next-line + creator: tx.origin, + handler: handler, + input: input + }); + + FutureVote[] memory emptyVotes = new FutureVote[](0); + bytes memory emptySubmitter; + FutureResult memory futureResult = FutureResult({ id: futureId, output: input, submitter: emptySubmitter }); + FutureResponse memory futureResponse = + FutureResponse({ future: future, votes: emptyVotes, result: futureResult }); + _futures[futureId] = FutureByIdResponse({ futureResponse: futureResponse }); + } + + function futureById(uint64 futureId) external view returns (FutureByIdResponse memory response) { + response = _futures[futureId]; + } + + function futures(Types.PageRequest calldata, address) external pure returns (FuturesResponse memory) { + // solhint-disable-next-line + revert("Unimplemented"); + } + + function pendingFutures(Types.PageRequest calldata) external pure returns (PendingFuturesResponse memory) { + // solhint-disable-next-line + revert("Unimplemented"); + } +} diff --git a/clone-agent/contracts/mocks/MockSlinkyPrecompile.sol b/clone-agent/contracts/mocks/MockSlinkyPrecompile.sol new file mode 100644 index 00000000..b119cc89 --- /dev/null +++ b/clone-agent/contracts/mocks/MockSlinkyPrecompile.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { GetPriceResponse, QuotePrice, ISlinky } from "../src/interfaces/ISlinky.sol"; + +contract MockSlinkyPrecompile is ISlinky { + mapping(string base => mapping(string quote => uint256 price)) private prices; + + function getPrice( + string calldata base, + string calldata quote + ) + external + view + returns (GetPriceResponse memory response) + { + uint256 price = prices[base][quote]; + if (price == 0) { + string memory s1 = string.concat("no price / nonce reported for CurrencyPair: ", base); + string memory s2 = string.concat(s1, "/"); + string memory s3 = string.concat(s2, quote); + string memory s4 = string.concat(s3, ", the module is not tracking this CurrencyPair"); + revert(s4); + } + + QuotePrice memory quotePrice = QuotePrice({ blockHeight: 0, blockTimestamp: 0, price: price }); + + response = GetPriceResponse({ id: 0, nonce: 0, decimals: 9, price: quotePrice }); + } + + function setPrice(string calldata base, string calldata quote, uint256 price) external { + prices[base][quote] = price; + } +} diff --git a/clone-agent/contracts/mocks/MockWardenPrecompile.sol b/clone-agent/contracts/mocks/MockWardenPrecompile.sol new file mode 100644 index 00000000..617b2fcf --- /dev/null +++ b/clone-agent/contracts/mocks/MockWardenPrecompile.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { AddressesResponse, AddressType, BroadcastType, Key, KeyResponse } from "../src/interfaces/IWarden.sol"; +import { Types } from "../src/Types.sol"; + +contract MockWardenPrecompile { + mapping(uint64 keyId => KeyResponse keyResponse) private keys; + mapping(uint64 keyId => bool isGood) private goodKeys; + + function keyById(uint64, int32[] calldata) external pure returns (KeyResponse memory keyResponse) { + Key memory key; + AddressesResponse[] memory addresses = new AddressesResponse[](1); + addresses[0] = AddressesResponse({ + addressValue: "0x0000000000000000000000000000000000000000", + addressType: AddressType.Ethereum + }); + keyResponse = KeyResponse({ key: key, addresses: addresses }); + } + + function newSignRequest( + uint64 keyId, + bytes calldata, + bytes[] calldata, + bytes calldata, + Types.Coin[] calldata, + uint64, + uint64, + string calldata, + string calldata, + BroadcastType + ) + external + view + returns (bool isGood) + { + isGood = goodKeys[keyId]; + } + + function addKey(uint64 keyId, bool isGood) external { + goodKeys[keyId] = isGood; + } +} diff --git a/clone-agent/contracts/package.json b/clone-agent/contracts/package.json new file mode 100644 index 00000000..db011bc5 --- /dev/null +++ b/clone-agent/contracts/package.json @@ -0,0 +1,27 @@ +{ + "name": "contracts", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "devDependencies": { + "forge-std": "github:foundry-rs/forge-std#v1.8.1", + "prettier": "^3.0.0", + "solhint": "^3.6.2" + }, + "dependencies": { + "@0xsequence/create3": "https://github.com/0xsequence/create3#acc4703a21ec1d71dc2a99db088c4b1f467530fd", + "@openzeppelin/contracts": "^5.0.1" + }, + "scripts": { + "clean": "rm -rf cache out", + "build": "forge build src --via-ir", + "lint": "yarn run lint:sol && yarn run prettier:check", + "lint:sol": "forge fmt --check && yarn solhint \"{script,src,test}/**/*.sol\"", + "prettier:check": "prettier --check \"**/*.{json,md,yml}\" --ignore-path \".prettierignore\"", + "prettier:write": "prettier --write \"**/*.{json,md,yml}\" --ignore-path \".prettierignore\"", + "test": "forge test --via-ir", + "test:coverage": "forge coverage", + "test:coverage:report": "forge coverage --report lcov && genhtml lcov.info --branch-coverage --output-dir coverage", + "deploy": "forge script script/Deploy.s.sol:Deploy --chain $CHAIN_ID --rpc-url $RPC_URL --broadcast -vvvv --via-ir --slow" + } +} \ No newline at end of file diff --git a/clone-agent/contracts/remappings.txt b/clone-agent/contracts/remappings.txt new file mode 100644 index 00000000..dcf95a25 --- /dev/null +++ b/clone-agent/contracts/remappings.txt @@ -0,0 +1,4 @@ +forge-std/=lib/forge-std/src/ +@openzeppelin/=lib/openzeppelin-contracts/ +ds-test/=lib/forge-std/lib/ds-test/src/ +@0xsequence/create3/=lib/create3/ \ No newline at end of file diff --git a/clone-agent/contracts/script/CreateOrder.s.sol b/clone-agent/contracts/script/CreateOrder.s.sol new file mode 100644 index 00000000..3dbbb8b2 --- /dev/null +++ b/clone-agent/contracts/script/CreateOrder.s.sol @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { IWARDEN_PRECOMPILE_ADDRESS } from "../src/interfaces/IWarden.sol"; +import { ISLINKY_PRECOMPILE_ADDRESS } from "../src/interfaces/ISlinky.sol"; +import { IASYNC_PRECOMPILE_ADDRESS } from "../src/interfaces/IAsync.sol"; +import { Script } from "forge-std/Script.sol"; +import { Types as CommonTypes } from "../src/Types.sol"; +import { MockWardenPrecompile } from "../mocks/MockWardenPrecompile.sol"; +import { MockSlinkyPrecompile } from "../mocks/MockSlinkyPrecompile.sol"; +import { MockAsyncPrecompile } from "../mocks/MockAsyncPrecompile.sol"; +import { OrderFactory, OrderType } from "../src/OrderFactory.sol"; +import { Types } from "../src/Types.sol"; + +contract CreateOrder is Script { + address internal broadcaster; + OrderFactory private immutable FACTORY; + + error InvalidFactory(); + + constructor() { + (broadcaster,) = deriveRememberKey({ mnemonic: vm.envString("MNEMONIC"), index: 0 }); + address factory = vm.envAddress("FACTORY_ADDRESS"); + if (factory == address(0)) { + revert InvalidFactory(); + } + FACTORY = OrderFactory(factory); + } + + function basic( + uint256 thresholdPrice, + Types.PriceCondition priceCondition, + Types.PricePair calldata pricePair, + Types.CreatorDefinedTxFields calldata creatorDefinedTxFields, + uint64 keyId, + uint64 spaceNonce, + uint64 actionTimeoutHeight, + bytes calldata expectedApproveExpression, + bytes calldata expectedRejectExpression, + bytes32 salt + ) + external + { + MockSlinkyPrecompile mSlinkyPrecompile = new MockSlinkyPrecompile(); + MockWardenPrecompile wPrecompile = new MockWardenPrecompile(); + + bytes[] memory analyzers = new bytes[](0); + bytes memory encryptionKey = new bytes(0); + Types.SignRequestData memory signRequestData = Types.SignRequestData({ + keyId: keyId, + analyzers: analyzers, + encryptionKey: encryptionKey, + spaceNonce: spaceNonce, + actionTimeoutHeight: actionTimeoutHeight, + expectedApproveExpression: string(expectedApproveExpression), + expectedRejectExpression: string(expectedRejectExpression) + }); + CommonTypes.Coin[] memory maxKeychainFees = new CommonTypes.Coin[](0); + Types.BasicOrderData memory orderData = Types.BasicOrderData({ + thresholdPrice: thresholdPrice, + priceCondition: priceCondition, + pricePair: pricePair + }); + Types.CommonExecutionData memory commonExecutionData = Types.CommonExecutionData({ + creatorDefinedTxFields: creatorDefinedTxFields, + signRequestData: signRequestData + }); + vm.etch(ISLINKY_PRECOMPILE_ADDRESS, address(mSlinkyPrecompile).code); + MockSlinkyPrecompile mockSlinkyPrecompile = MockSlinkyPrecompile(ISLINKY_PRECOMPILE_ADDRESS); + mockSlinkyPrecompile.setPrice(pricePair.base, pricePair.quote, thresholdPrice); + vm.etch(IWARDEN_PRECOMPILE_ADDRESS, address(wPrecompile).code); + vm.startBroadcast(broadcaster); + FACTORY.createOrder(abi.encode(orderData), commonExecutionData, maxKeychainFees, OrderType.Basic, salt); + + vm.stopBroadcast(); + } + + function advanced( + Types.PriceCondition priceCondition, + Types.PricePair calldata oraclePricePair, + Types.PricePair calldata predictPricePair, + Types.CreatorDefinedTxFields calldata creatorDefinedTxFields, + uint64 keyId, + uint64 spaceNonce, + uint64 actionTimeoutHeight, + bytes calldata expectedApproveExpression, + bytes calldata expectedRejectExpression, + bytes32 salt + ) + external + { + MockSlinkyPrecompile mSlinkyPrecompile = new MockSlinkyPrecompile(); + MockWardenPrecompile wPrecompile = new MockWardenPrecompile(); + MockAsyncPrecompile aPrecompile = new MockAsyncPrecompile(); + + bytes[] memory analyzers = new bytes[](0); + bytes memory encryptionKey = new bytes(0); + Types.SignRequestData memory signRequestData = Types.SignRequestData({ + keyId: keyId, + analyzers: analyzers, + encryptionKey: encryptionKey, + spaceNonce: spaceNonce, + actionTimeoutHeight: actionTimeoutHeight, + expectedApproveExpression: string(expectedApproveExpression), + expectedRejectExpression: string(expectedRejectExpression) + }); + CommonTypes.Coin[] memory maxKeychainFees = new CommonTypes.Coin[](0); + Types.AdvancedOrderData memory orderData = Types.AdvancedOrderData({ + priceCondition: priceCondition, + oraclePricePair: oraclePricePair, + predictPricePair: predictPricePair, + pricePredictDate: block.timestamp + 24 hours + }); + Types.CommonExecutionData memory commonExecutionData = Types.CommonExecutionData({ + creatorDefinedTxFields: creatorDefinedTxFields, + signRequestData: signRequestData + }); + vm.etch(ISLINKY_PRECOMPILE_ADDRESS, address(mSlinkyPrecompile).code); + MockSlinkyPrecompile mockSlinkyPrecompile = MockSlinkyPrecompile(ISLINKY_PRECOMPILE_ADDRESS); + mockSlinkyPrecompile.setPrice(oraclePricePair.base, oraclePricePair.quote, 1); + vm.etch(IWARDEN_PRECOMPILE_ADDRESS, address(wPrecompile).code); + vm.etch(IASYNC_PRECOMPILE_ADDRESS, address(aPrecompile).code); + vm.startBroadcast(broadcaster); + FACTORY.createOrder(abi.encode(orderData), commonExecutionData, maxKeychainFees, OrderType.Advanced, salt); + + vm.stopBroadcast(); + } +} diff --git a/clone-agent/contracts/script/Deploy.s.sol b/clone-agent/contracts/script/Deploy.s.sol new file mode 100644 index 00000000..34c9ab84 --- /dev/null +++ b/clone-agent/contracts/script/Deploy.s.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { Create2 } from "../src/Create2.sol"; +import { Script } from "forge-std/Script.sol"; +import { Registry } from "../src/Registry.sol"; +import { OrderFactory } from "../src/OrderFactory.sol"; +import { BasicOrderFactory } from "../src/BasicOrderFactory.sol"; +import { AdvancedOrderFactory } from "../src/AdvancedOrderFactory.sol"; + +contract Deploy is Script { + address internal broadcaster; + address internal scheduler; + address internal factoryOwner; + address internal create2Address; + address internal registryAddress; + + error InvalidScheduler(); + error InvalidFactory(); + error AddressMismatch(string name); + + constructor() { + (broadcaster,) = deriveRememberKey({ mnemonic: vm.envString("MNEMONIC"), index: 0 }); + scheduler = vm.envAddress("SCHEDULER_ADDRESS"); + factoryOwner = vm.envAddress("FACTORY_OWNER_ADDRESS"); + create2Address = vm.envOr("CREATE2_ADDRESS", address(0)); + registryAddress = vm.envOr("REGISTRY_ADDRESS", address(0)); + + if (scheduler == address(0)) revert InvalidScheduler(); + if (factoryOwner == address(0)) revert InvalidFactory(); + } + + function run() external { + vm.startBroadcast(broadcaster); + + bytes11 registrySaltValue = bytes11(vm.envOr("REGISTRY_SALT", bytes11(uint88(1001)))); + bytes11 factorySaltValue = bytes11(vm.envOr("FACTORY_SALT", bytes11(uint88(1002)))); + + if (registryAddress == address(0)) { + bytes32 registrySalt = bytes32(abi.encodePacked(broadcaster, hex"00", registrySaltValue)); + bytes memory registryInitCode = type(Registry).creationCode; + + registryAddress = deployWithCreate2(registrySalt, registryInitCode, "Registry"); + } + + bytes32 factorySalt = bytes32(abi.encodePacked(broadcaster, hex"00", factorySaltValue)); + + bytes memory basicFactoryInitCode = + abi.encodePacked(type(BasicOrderFactory).creationCode, abi.encode(registryAddress)); + + address basicFactoryAddress = deployWithCreate2(factorySalt, basicFactoryInitCode, "BasicOrder"); + + bytes memory advancedFactoryInitCode = + abi.encodePacked(type(AdvancedOrderFactory).creationCode, abi.encode(registryAddress)); + + address advancedFactoryAddress = deployWithCreate2(factorySalt, advancedFactoryInitCode, "AdvancedOrder"); + + bytes memory factoryInitCode = abi.encodePacked( + type(OrderFactory).creationCode, + abi.encode(registryAddress, scheduler, factoryOwner, basicFactoryAddress, advancedFactoryAddress) + ); + + address factoryAddress = deployWithCreate2(factorySalt, factoryInitCode, "OrderFactory"); + + vm.stopBroadcast(); + + string memory chainId = vm.envString("CHAIN_ID"); + string memory deploymentPath = string.concat("broadcast/Deploy.s.sol/", chainId); + + // Create directory if it doesn't exist + vm.createDir(deploymentPath, true); + + // Write the output + string memory output = "output"; + string memory registryK = "registry"; + string memory factoryK = "orderFactory"; + vm.serializeString(output, registryK, vm.toString(registryAddress)); + string memory out = vm.serializeString(output, factoryK, vm.toString(factoryAddress)); + string memory path = string.concat(deploymentPath, "/run-latest.json"); + vm.writeJson(out, path); + } + + function deployWithCreate2(bytes32 salt, bytes memory initCode, string memory name) internal returns (address) { + Create2 create2; + if (create2Address == address(0)) { + create2 = new Create2(); + create2Address = address(create2); + } else { + create2 = Create2(create2Address); + } + + bytes32 initCodeHash = keccak256(initCode); + + address computedAddress = create2.computeAddress(salt, initCodeHash); + address deployedAddress = create2.deploy(salt, initCode); + + if (computedAddress != deployedAddress) revert AddressMismatch(name); + + return deployedAddress; + } +} diff --git a/clone-agent/contracts/src/AbstractOrder.sol b/clone-agent/contracts/src/AbstractOrder.sol new file mode 100644 index 00000000..3c32ba65 --- /dev/null +++ b/clone-agent/contracts/src/AbstractOrder.sol @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { BroadcastType, IWarden, IWARDEN_PRECOMPILE_ADDRESS, KeyResponse } from "../src/interfaces/IWarden.sol"; +import { Types as CommonTypes } from "../src/Types.sol"; +import { RLPEncode } from "./RLPEncode.sol"; +import { Types } from "./Types.sol"; +import { ExecutionData } from "./IExecution.sol"; +import { Strings } from "./Strings.sol"; + +error InvalidScheduler(); +error InvalidRegistry(); +error InvalidExpectedApproveExpression(); +error InvalidExpectedRejectExpression(); +error InvalidTxTo(); + +abstract contract AbstractOrder { + using Strings for *; + + IWarden private immutable WARDEN_PRECOMPILE; + address private _keyAddress; + int32 private constant ETHEREUM_ADDRESS_TYPE = 1; + + constructor( + Types.SignRequestData memory signRequestData, + Types.CreatorDefinedTxFields memory creatorDefinedTxFields, + address scheduler, + address registry + ) { + if (scheduler == address(0)) { + revert InvalidScheduler(); + } + + if (registry == address(0)) { + revert InvalidRegistry(); + } + + if (bytes(signRequestData.expectedApproveExpression).length == 0) { + revert InvalidExpectedApproveExpression(); + } + + if (bytes(signRequestData.expectedRejectExpression).length == 0) { + revert InvalidExpectedRejectExpression(); + } + + if (creatorDefinedTxFields.to == address(0)) { + revert InvalidTxTo(); + } + + WARDEN_PRECOMPILE = IWarden(IWARDEN_PRECOMPILE_ADDRESS); + int32[] memory addressTypes = new int32[](1); + addressTypes[0] = ETHEREUM_ADDRESS_TYPE; + KeyResponse memory keyResponse = WARDEN_PRECOMPILE.keyById(signRequestData.keyId, addressTypes); + _keyAddress = keyResponse.addresses[0].addressValue.parseAddress(); + } + + function encodeUnsignedEIP1559( + uint256 nonce, + uint256 gas, + uint256 maxPriorityFeePerGas, + uint256 maxFeePerGas, + bytes[] calldata accessList, + Types.CreatorDefinedTxFields calldata creatorDefinedTxFields + ) + public + pure + returns (bytes memory unsignedTx, bytes32 txHash) + { + uint256 txType = 2; // eip1559 tx type + bytes[] memory txArray = new bytes[](9); + txArray[0] = RLPEncode.encodeUint(creatorDefinedTxFields.chainId); + txArray[1] = RLPEncode.encodeUint(nonce); + txArray[2] = RLPEncode.encodeUint(maxPriorityFeePerGas); + txArray[3] = RLPEncode.encodeUint(maxFeePerGas); + txArray[4] = RLPEncode.encodeUint(gas); + txArray[5] = RLPEncode.encodeAddress(creatorDefinedTxFields.to); + txArray[6] = RLPEncode.encodeUint(creatorDefinedTxFields.value); + txArray[7] = RLPEncode.encodeBytes(creatorDefinedTxFields.data); + txArray[8] = RLPEncode.encodeList(accessList); + bytes memory unsignedTxEncoded = RLPEncode.encodeList(txArray); + unsignedTx = RLPEncode.concat(RLPEncode.encodeUint(txType), unsignedTxEncoded); + txHash = keccak256(unsignedTx); + } + + function buildExecutionData(Types.CreatorDefinedTxFields calldata creatorDefinedTxFields) + public + view + returns (ExecutionData memory data) + { + data = ExecutionData({ + caller: _keyAddress, + to: creatorDefinedTxFields.to, + chainId: creatorDefinedTxFields.chainId, + value: creatorDefinedTxFields.value, + data: creatorDefinedTxFields.data + }); + } + + function createSignRequest( + Types.SignRequestData calldata signRequestData, + bytes calldata signRequestInput, + CommonTypes.Coin[] calldata maxKeychainFees + ) + public + returns (bool) + { + return WARDEN_PRECOMPILE.newSignRequest( + signRequestData.keyId, + signRequestInput, + signRequestData.analyzers, + signRequestData.encryptionKey, + maxKeychainFees, + signRequestData.spaceNonce, + signRequestData.actionTimeoutHeight, + signRequestData.expectedApproveExpression, + signRequestData.expectedRejectExpression, + BroadcastType.Automatic + ); + } +} diff --git a/clone-agent/contracts/src/AdvancedOrder.sol b/clone-agent/contracts/src/AdvancedOrder.sol new file mode 100644 index 00000000..29ee73c4 --- /dev/null +++ b/clone-agent/contracts/src/AdvancedOrder.sol @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.25 <0.9.0; + +import { GetPriceResponse, ISlinky, ISLINKY_PRECOMPILE_ADDRESS } from "../src/interfaces/ISlinky.sol"; +import { FutureByIdResponse, IAsync, IASYNC_PRECOMPILE_ADDRESS } from "../src/interfaces/IAsync.sol"; +import { Types as CommonTypes } from "../src/Types.sol"; +import { AbstractOrder } from "./AbstractOrder.sol"; +import { ExecutionData, IExecution } from "./IExecution.sol"; +import { Registry } from "./Registry.sol"; +import { Types } from "./Types.sol"; + +error ConditionNotMet(); +error ExecutedError(); +error Unauthorized(); + +event Executed(); + +struct PricePredictInput { + uint256 date; + string[] tokens; + uint64[2] falsePositiveRate; +} + +contract AdvancedOrder is AbstractOrder, IExecution { + Types.AdvancedOrderData public orderData; + Types.CommonExecutionData public commonExecutionData; + uint64 public futureId; + + uint256 public constant PRICE_PREDICTION_DECIMALS = 16; + + ISlinky private immutable SLINKY_PRECOMPILE = ISlinky(ISLINKY_PRECOMPILE_ADDRESS); + IAsync private immutable ASYNC_PRECOMPILE = IAsync(IASYNC_PRECOMPILE_ADDRESS); + Registry private immutable REGISTRY; + + CommonTypes.Coin[] private _coins; + bool private _executed; + address private _scheduler; + bytes private _unsignedTx; + uint256 private _validUntil; + + constructor( + Types.AdvancedOrderData memory _orderData, + Types.CommonExecutionData memory _executionData, + CommonTypes.Coin[] memory maxKeychainFees, + address scheduler, + address registry + ) + AbstractOrder(_executionData.signRequestData, _executionData.creatorDefinedTxFields, scheduler, registry) + { + string[] memory predictTokens = new string[](2); + predictTokens[0] = _orderData.predictPricePair.base; + predictTokens[1] = _orderData.predictPricePair.quote; + + uint64[2] memory falsePositiveRate = [uint64(1), uint64(100)]; + PricePredictInput memory pricePredictInput = PricePredictInput({ + date: _orderData.pricePredictDate, + tokens: predictTokens, + falsePositiveRate: falsePositiveRate + }); + futureId = ASYNC_PRECOMPILE.addFuture("pricepred", abi.encode(pricePredictInput)); + REGISTRY = Registry(registry); + + for (uint256 i = 0; i < maxKeychainFees.length; i++) { + _coins.push(maxKeychainFees[i]); + } + + orderData = _orderData; + commonExecutionData = _executionData; + _scheduler = scheduler; + _validUntil = block.timestamp + 24 hours; + } + + function canExecute() public view override returns (bool) { + if (block.timestamp > _validUntil) return false; + + FutureByIdResponse memory future = ASYNC_PRECOMPILE.futureById(futureId); + if (future.futureResponse.result.id == 0) return false; + + uint256[] memory predictedPrices = abi.decode(future.futureResponse.result.output, (uint256[])); + GetPriceResponse memory priceResponse = + SLINKY_PRECOMPILE.getPrice(orderData.oraclePricePair.base, orderData.oraclePricePair.quote); + + uint256 predictedPrice = _getPriceInQuote(predictedPrices[0], predictedPrices[1], PRICE_PREDICTION_DECIMALS); + (uint256 oracleNormalized, uint256 predictedNormalized) = _normalizePrices( + priceResponse.price.price, predictedPrice, priceResponse.decimals, PRICE_PREDICTION_DECIMALS + ); + + return _checkPriceCondition(oracleNormalized, predictedNormalized); + } + + function execute( + uint256 nonce, + uint256 gas, + uint256, + uint256 maxPriorityFeePerGas, + uint256 maxFeePerGas + ) + external + override + returns (bool, bytes32) + { + if (msg.sender != _scheduler) revert Unauthorized(); + if (_executed) revert ExecutedError(); + if (!canExecute()) revert ConditionNotMet(); + + bytes[] memory emptyAccessList = new bytes[](0); + (bytes memory unsignedTx, bytes32 txHash) = this.encodeUnsignedEIP1559( + nonce, gas, maxPriorityFeePerGas, maxFeePerGas, emptyAccessList, commonExecutionData.creatorDefinedTxFields + ); + + _unsignedTx = unsignedTx; + _executed = this.createSignRequest(commonExecutionData.signRequestData, abi.encodePacked(txHash), _coins); + + if (_executed) emit Executed(); + + // origin always creator of sign request + // solhint-disable-next-line + REGISTRY.addTransaction(tx.origin, txHash); + return (_executed, txHash); + } + + function isExecuted() public view override returns (bool) { + return _executed; + } + + function getTx() external view returns (bytes memory) { + if (!_executed) revert ExecutedError(); + return _unsignedTx; + } + + function executionData() external view returns (ExecutionData memory data) { + data = this.buildExecutionData(commonExecutionData.creatorDefinedTxFields); + } + + function _normalizePrices( + uint256 price1, + uint256 price2, + uint256 decimals1, + uint256 decimals2 + ) + internal + pure + returns (uint256 normalizedPrice1, uint256 normalizedPrice2) + { + uint256 maxDecimals = decimals1 > decimals2 ? decimals1 : decimals2; + normalizedPrice1 = price1 * (10 ** (maxDecimals - decimals1)); + normalizedPrice2 = price2 * (10 ** (maxDecimals - decimals2)); + } + + function _getPriceInQuote(uint256 priceA, uint256 priceB, uint256 decimals) internal pure returns (uint256) { + return (priceA * 10 ** decimals) / priceB; + } + + function _checkPriceCondition(uint256 oraclePrice, uint256 predictedPrice) internal view returns (bool) { + if ( + (orderData.priceCondition == Types.PriceCondition.GTE && oraclePrice >= predictedPrice) + || (orderData.priceCondition == Types.PriceCondition.LTE && oraclePrice <= predictedPrice) + || (orderData.priceCondition == Types.PriceCondition.GT && oraclePrice > predictedPrice) + || (orderData.priceCondition == Types.PriceCondition.LT && oraclePrice < predictedPrice) + ) { + return true; + } + return false; + } +} diff --git a/clone-agent/contracts/src/AdvancedOrderFactory.sol b/clone-agent/contracts/src/AdvancedOrderFactory.sol new file mode 100644 index 00000000..82b2ede1 --- /dev/null +++ b/clone-agent/contracts/src/AdvancedOrderFactory.sol @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import { AdvancedOrder } from "./AdvancedOrder.sol"; +import { Types } from "./Types.sol"; +import { Types as CommonTypes } from "./Types.sol"; +import { Create3 } from "@0xsequence/create3/contracts/Create3.sol"; +import { Registry } from "./Registry.sol"; + +error OrderDeploymentFailed(bytes32 salt); +error SaltAlreadyUsed(); + +event SaltUsed(bytes32 indexed salt, address indexed creator); + +event AdvancedOrderCreated(address indexed creator, address orderAddress); + +contract AdvancedOrderFactory is ReentrancyGuard { + // Registry of IExecution contracts + Registry public immutable REGISTRY; + + // Mapping to track used salts to prevent reuse + mapping(bytes32 salt => bool used) public usedSalts; + + constructor(address registry) { + REGISTRY = Registry(registry); + } + + /** + * @dev Creates a new instance of the AdvancedOrder contract. + * @param orderData Data specific to the order. + * @param executionData Common execution data. + * @param maxKeychainFees Maximum fees for keychain operations. + * @param scheduler Address of the scheduler. + * @param salt Salt to ensure uniqueness of the deployed contract address. + * @return orderAddress Address of the newly created AdvancedOrder contract. + */ + function createAdvancedOrder( + Types.AdvancedOrderData calldata orderData, + Types.CommonExecutionData calldata executionData, + CommonTypes.Coin[] calldata maxKeychainFees, + address scheduler, + bytes32 salt + ) + external + nonReentrant + returns (address orderAddress) + { + // Front-running protection using tx.origin + // solhint-disable-next-line + address origin = tx.origin; + bytes32 guardedSalt = keccak256(abi.encodePacked(uint256(uint160(origin)), salt)); + + if (usedSalts[guardedSalt]) { + revert SaltAlreadyUsed(); + } + + emit SaltUsed(guardedSalt, origin); + + // Encode contract creation bytecode with constructor arguments + bytes memory bytecode = abi.encodePacked( + type(AdvancedOrder).creationCode, + abi.encode(orderData, executionData, maxKeychainFees, scheduler, address(REGISTRY)) + ); + + // Deploy the contract using Create3 + orderAddress = Create3.create3(guardedSalt, bytecode); + + address expectedAddress = Create3.addressOf(guardedSalt); + if (orderAddress == address(0) || orderAddress != expectedAddress) { + revert OrderDeploymentFailed(guardedSalt); + } + + // Register the deployed contract in the registry + REGISTRY.register(orderAddress); + usedSalts[guardedSalt] = true; + + emit AdvancedOrderCreated(msg.sender, orderAddress); + } + + /** + * @notice Computes the deterministic address of a order without deploying it + * @param origin The potential order creator + * @param salt The unique salt provided by the frontend + * @return The computed address of the order + */ + function computeOrderAddress(address origin, bytes32 salt) external view returns (address) { + // front-running protection + bytes32 guardedSalt = keccak256(abi.encodePacked(uint256(uint160(origin)), salt)); + + return Create3.addressOf(guardedSalt); + } +} diff --git a/clone-agent/contracts/src/BasicOrder.sol b/clone-agent/contracts/src/BasicOrder.sol new file mode 100644 index 00000000..223bafda --- /dev/null +++ b/clone-agent/contracts/src/BasicOrder.sol @@ -0,0 +1,132 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import { Types as CommonTypes } from "../src/Types.sol"; +import { GetPriceResponse, ISlinky, ISLINKY_PRECOMPILE_ADDRESS } from "../src/interfaces/ISlinky.sol"; +import { ExecutionData, IExecution } from "./IExecution.sol"; +import { AbstractOrder } from "./AbstractOrder.sol"; +import { Types } from "./Types.sol"; +import { Registry } from "./Registry.sol"; + +error ConditionNotMet(); +error ExecutedError(); +error Unauthorized(); +error InvalidPriceCondition(); +error InvalidThresholdPrice(); + +event Executed(); + +contract BasicOrder is AbstractOrder, IExecution, ReentrancyGuard { + Types.BasicOrderData public orderData; + Types.CommonExecutionData public commonExecutionData; + + ISlinky private immutable SLINKY_PRECOMPILE; + Registry private immutable REGISTRY; + CommonTypes.Coin[] private _coins; + bool private _executed; + address private _scheduler; + bytes private _unsignedTx; + + // solhint-disable-next-line + constructor( + Types.BasicOrderData memory _orderData, + Types.CommonExecutionData memory _executionData, + CommonTypes.Coin[] memory maxKeychainFees, + address scheduler, + address registry + ) + AbstractOrder(_executionData.signRequestData, _executionData.creatorDefinedTxFields, scheduler, registry) + { + if (_orderData.thresholdPrice == 0) { + revert InvalidThresholdPrice(); + } + + SLINKY_PRECOMPILE = ISlinky(ISLINKY_PRECOMPILE_ADDRESS); + SLINKY_PRECOMPILE.getPrice(_orderData.pricePair.base, _orderData.pricePair.quote); + + REGISTRY = Registry(registry); + + for (uint256 i = 0; i < maxKeychainFees.length; i++) { + _coins.push(maxKeychainFees[i]); + } + + orderData = _orderData; + commonExecutionData = _executionData; + _scheduler = scheduler; + } + + function canExecute() public view returns (bool value) { + GetPriceResponse memory priceResponse = + SLINKY_PRECOMPILE.getPrice(orderData.pricePair.base, orderData.pricePair.quote); + Types.PriceCondition condition = orderData.priceCondition; + if (condition == Types.PriceCondition.GTE) { + value = priceResponse.price.price >= orderData.thresholdPrice; + } else if (condition == Types.PriceCondition.LTE) { + value = priceResponse.price.price <= orderData.thresholdPrice; + } else { + revert InvalidPriceCondition(); + } + } + + function execute( + uint256 nonce, + uint256 gas, + uint256, + uint256 maxPriorityFeePerGas, + uint256 maxFeePerGas + ) + external + nonReentrant + returns (bool, bytes32) + { + if (msg.sender != _scheduler) { + revert Unauthorized(); + } + + if (isExecuted()) { + revert ExecutedError(); + } + + if (!canExecute()) { + revert ConditionNotMet(); + } + + bytes[] memory emptyAccessList = new bytes[](0); + (bytes memory unsignedTx, bytes32 txHash) = this.encodeUnsignedEIP1559( + nonce, gas, maxPriorityFeePerGas, maxFeePerGas, emptyAccessList, commonExecutionData.creatorDefinedTxFields + ); + + _unsignedTx = unsignedTx; + + bytes memory signRequestInput = abi.encodePacked(txHash); + + _executed = this.createSignRequest(commonExecutionData.signRequestData, signRequestInput, _coins); + + if (_executed) { + emit Executed(); + } + + // origin always creator of sign request + // solhint-disable-next-line + REGISTRY.addTransaction(tx.origin, txHash); + + return (_executed, txHash); + } + + function isExecuted() public view returns (bool) { + return _executed; + } + + function executionData() external view returns (ExecutionData memory data) { + data = this.buildExecutionData(commonExecutionData.creatorDefinedTxFields); + } + + function getTx() external view returns (bytes memory transaction) { + if (!isExecuted()) { + revert ExecutedError(); + } + + transaction = _unsignedTx; + } +} diff --git a/clone-agent/contracts/src/BasicOrderFactory.sol b/clone-agent/contracts/src/BasicOrderFactory.sol new file mode 100644 index 00000000..344dc6e0 --- /dev/null +++ b/clone-agent/contracts/src/BasicOrderFactory.sol @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import { BasicOrder } from "./BasicOrder.sol"; +import { Types } from "./Types.sol"; +import { Types as CommonTypes } from "./Types.sol"; +import { Create3 } from "@0xsequence/create3/contracts/Create3.sol"; +import { Registry } from "./Registry.sol"; + +error OrderDeploymentFailed(bytes32 salt); +error SaltAlreadyUsed(); + +event SaltUsed(bytes32 indexed salt, address indexed creator); + +contract BasicOrderFactory is ReentrancyGuard { + // Event emitted when a new BasicOrder is created + event BasicOrderCreated(address indexed creator, address orderAddress); + + // Registry of IExecution contracts + Registry public immutable REGISTRY; + + // Mapping to track used salts to prevent reuse + mapping(bytes32 salt => bool used) public usedSalts; + + constructor(address registry) { + REGISTRY = Registry(registry); + } + + /** + * @dev Creates a new instance of the BasicOrder contract. + * @param orderData Data specific to the order. + * @param executionData Common execution data. + * @param maxKeychainFees Maximum fees for keychain operations. + * @param scheduler Address of the scheduler. + * @return orderAddress Address of the newly created BasicOrder contract. + */ + function createBasicOrder( + Types.BasicOrderData calldata orderData, + Types.CommonExecutionData calldata executionData, + CommonTypes.Coin[] calldata maxKeychainFees, + address scheduler, + bytes32 salt + ) + external + nonReentrant + returns (address orderAddress) + { + // front-running protection + // we use tx.origin here as msg.sender the same for all orders created through factory + // solhint-disable-next-line + address origin = tx.origin; + bytes32 guardedSalt = keccak256(abi.encodePacked(uint256(uint160(origin)), salt)); + + if (usedSalts[guardedSalt]) { + revert SaltAlreadyUsed(); + } + + emit SaltUsed(guardedSalt, origin); + + bytes memory bytecode = abi.encodePacked( + type(BasicOrder).creationCode, + abi.encode(orderData, executionData, maxKeychainFees, scheduler, address(REGISTRY)) + ); + + orderAddress = Create3.create3(guardedSalt, bytecode); + address expectedAddress = Create3.addressOf(guardedSalt); + if (orderAddress == address(0) || orderAddress != expectedAddress) { + revert OrderDeploymentFailed(guardedSalt); + } + + REGISTRY.register(orderAddress); + usedSalts[guardedSalt] = true; + + emit BasicOrderCreated(msg.sender, orderAddress); + } + + /** + * @notice Computes the deterministic address of a order without deploying it + * @param origin The potential order creator + * @param salt The unique salt provided by the frontend + * @return The computed address of the order + */ + function computeOrderAddress(address origin, bytes32 salt) external view returns (address) { + // front-running protection + bytes32 guardedSalt = keccak256(abi.encodePacked(uint256(uint160(origin)), salt)); + + return Create3.addressOf(guardedSalt); + } +} diff --git a/clone-agent/contracts/src/Create2.sol b/clone-agent/contracts/src/Create2.sol new file mode 100644 index 00000000..274670f5 --- /dev/null +++ b/clone-agent/contracts/src/Create2.sol @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +// From https://book.getfoundry.sh/tutorials/create2-tutorial +contract Create2 { + error Create2EmptyBytecode(); + + error Create2FailedDeployment(); + + function deploy(bytes32 salt, bytes memory creationCode) external payable returns (address addr) { + if (creationCode.length == 0) { + revert Create2EmptyBytecode(); + } + + // solhint-disable-next-line + assembly { + addr := create2(callvalue(), add(creationCode, 0x20), mload(creationCode), salt) + } + + if (addr == address(0)) { + revert Create2FailedDeployment(); + } + } + + function computeAddress(bytes32 salt, bytes32 creationCodeHash) external view returns (address addr) { + address contractAddress = address(this); + + // solhint-disable-next-line + assembly { + let ptr := mload(0x40) + + mstore(add(ptr, 0x40), creationCodeHash) + mstore(add(ptr, 0x20), salt) + mstore(ptr, contractAddress) + let start := add(ptr, 0x0b) + mstore8(start, 0xff) + addr := keccak256(start, 85) + } + } +} diff --git a/clone-agent/contracts/src/IExecution.sol b/clone-agent/contracts/src/IExecution.sol new file mode 100644 index 00000000..3606a3a2 --- /dev/null +++ b/clone-agent/contracts/src/IExecution.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +struct ExecutionData { + address caller; + address to; + uint256 chainId; + bytes data; + uint256 value; +} + +interface IExecution { + /** + * @dev Indicates if an order can be executed. + * @return A boolean value indicating that the order can be executed. + */ + function canExecute() external view returns (bool); + + /** + * @dev Creates action for new sign request from stored order data. + * If action created successfully then emit Executed event. + * @param nonce The key account nonce. + * @param gas gas parameter in eth transaction. + * @param gasPrice gasPrice parameter in eth transaction. + * @param maxPriorityFeePerGas maxPriorityFeePerGas parameter in eth transaction. + * @param maxFeePerGas maxFeePerGas parameter in eth transaction. + * @return A boolean value indicating parameter action was created and transaction hash. + */ + function execute( + uint256 nonce, + uint256 gas, + uint256 gasPrice, + uint256 maxPriorityFeePerGas, + uint256 maxFeePerGas + ) + external + returns (bool, bytes32); + + /** + * @dev Indicates if execution was executed already. + */ + function isExecuted() external returns (bool); + + /** + * @dev Returns data necessary for scheduler. + * @return executionData Data that scheduler needs to call execute method. + */ + function executionData() external returns (ExecutionData memory executionData); + + /** + * @dev Returns builded unsigned transaction. + * @return tx Unsigned transaction. + */ + function getTx() external returns (bytes memory tx); +} diff --git a/clone-agent/contracts/src/OrderFactory.sol b/clone-agent/contracts/src/OrderFactory.sol new file mode 100644 index 00000000..375f1fef --- /dev/null +++ b/clone-agent/contracts/src/OrderFactory.sol @@ -0,0 +1,191 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; +import { Types } from "./Types.sol"; +import { Types as CommonTypes } from "../src/Types.sol"; +import { AdvancedOrderFactory } from "./AdvancedOrderFactory.sol"; +import { Registry } from "./Registry.sol"; +import { BasicOrderFactory } from "./BasicOrderFactory.sol"; +import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +enum OrderType { + Basic, + Advanced +} + +error Unimplemented(); +error UnsupportedOrder(); +error InvalidRegistryAddress(); +error InvalidSchedulerAddress(); +error OrderDeploymentFailed(bytes32 salt); +error SaltAlreadyUsed(); + +event OrderCreated(address indexed orderCreator, OrderType indexed orderType, address indexed orderContract); + +event SchedulerChanged(address indexed oldScheduler, address indexed newScheduler); + +event SaltUsed(bytes32 indexed salt, address indexed creator); + +contract OrderFactory is Ownable, ReentrancyGuard { + // Mapping from order contract to order creator + mapping(address orderAddress => address orderCreator) public orders; + + // Registry of IExecution contracts + Registry public immutable REGISTRY; + + // BasicOrderFactory contract + BasicOrderFactory public immutable BASIC_ORDER_FACTORY; + + // AdvancedOrderFactory contract + AdvancedOrderFactory public immutable ADVANCED_ORDER_FACTORY; + + // Scheduler address + address public scheduler; + + constructor( + address registry, + address _scheduler, + address owner, + address basicOrderFactory, + address advancedOrderFactory + ) + Ownable(owner) + { + if (registry == address(0)) { + revert InvalidRegistryAddress(); + } + + if (_scheduler == address(0)) { + revert InvalidSchedulerAddress(); + } + + REGISTRY = Registry(registry); + BASIC_ORDER_FACTORY = BasicOrderFactory(basicOrderFactory); + ADVANCED_ORDER_FACTORY = AdvancedOrderFactory(advancedOrderFactory); + scheduler = _scheduler; + } + + /** + * @notice Computes the deterministic address of a order without deploying it + * @param origin The potential order creator + * @param salt The unique salt provided by the frontend + * @return order The computed address of the order + */ + function computeOrderAddress( + address origin, + bytes32 salt, + OrderType orderType + ) + external + view + returns (address order) + { + if (orderType == OrderType.Basic) { + order = BASIC_ORDER_FACTORY.computeOrderAddress(origin, salt); + } else if (orderType == OrderType.Advanced) { + order = ADVANCED_ORDER_FACTORY.computeOrderAddress(origin, salt); + } + } + + /** + * @notice Creates a new order (Basic or Advanced) using CREATE3 + * @param _orderData The data required to create the order + * @param maxKeychainFees The maximum fees allowed + * @param orderType The type of order to create + * @param salt The unique salt provided by the frontend + * @return order The address of the newly created order + */ + function createOrder( + bytes calldata _orderData, + Types.CommonExecutionData calldata _executionData, + CommonTypes.Coin[] calldata maxKeychainFees, + OrderType orderType, + bytes32 salt + ) + external + nonReentrant + returns (address order) + { + if (orderType == OrderType.Basic) { + Types.BasicOrderData memory basicOrderData = abi.decode(_orderData, (Types.BasicOrderData)); + order = _createBasicOrder(salt, basicOrderData, _executionData, maxKeychainFees, scheduler); + } else if (orderType == OrderType.Advanced) { + Types.AdvancedOrderData memory advancedOrderData = abi.decode(_orderData, (Types.AdvancedOrderData)); + order = _createAdvancedOrder(salt, advancedOrderData, _executionData, maxKeychainFees, scheduler); + } else { + revert UnsupportedOrder(); + } + } + + /** + * @notice Updates the scheduler address + * @param _scheduler The new scheduler address + */ + function setScheduler(address _scheduler) external onlyOwner { + if (_scheduler == address(0)) { + revert InvalidSchedulerAddress(); + } + address oldScheduler = scheduler; + scheduler = _scheduler; + emit SchedulerChanged(oldScheduler, scheduler); + } + + /** + * @notice Internal function to create a BasicOrder using CREATE3 + * @param salt The unique salt provided by the frontend + * @param _orderData The data required to create the order + * @param _executionData The data required for order execution + * @param maxKeychainFees The maximum fees allowed + * @param _scheduler The scheduler address + * @return The address of the newly created BasicOrder + */ + function _createBasicOrder( + bytes32 salt, + Types.BasicOrderData memory _orderData, + Types.CommonExecutionData calldata _executionData, + CommonTypes.Coin[] calldata maxKeychainFees, + address _scheduler + ) + internal + returns (address) + { + address orderAddress = + BASIC_ORDER_FACTORY.createBasicOrder(_orderData, _executionData, maxKeychainFees, _scheduler, salt); + + orders[orderAddress] = msg.sender; + + emit OrderCreated(msg.sender, OrderType.Basic, orderAddress); + + return orderAddress; + } + + /** + * @notice Internal function to create a AdvancedOrder using CREATE3 + * @param salt The unique salt provided by the frontend + * @param _orderData The data required to create the order + * @param _executionData The data required for order execution + * @param maxKeychainFees The maximum fees allowed + * @param _scheduler The scheduler address + * @return The address of the newly created AdvancedOrder + */ + function _createAdvancedOrder( + bytes32 salt, + Types.AdvancedOrderData memory _orderData, + Types.CommonExecutionData calldata _executionData, + CommonTypes.Coin[] calldata maxKeychainFees, + address _scheduler + ) + internal + returns (address) + { + address orderAddress = + ADVANCED_ORDER_FACTORY.createAdvancedOrder(_orderData, _executionData, maxKeychainFees, _scheduler, salt); + + orders[orderAddress] = msg.sender; + + emit OrderCreated(msg.sender, OrderType.Advanced, orderAddress); + + return orderAddress; + } +} diff --git a/clone-agent/contracts/src/RLPEncode.sol b/clone-agent/contracts/src/RLPEncode.sol new file mode 100644 index 00000000..a06697fa --- /dev/null +++ b/clone-agent/contracts/src/RLPEncode.sol @@ -0,0 +1,257 @@ +pragma solidity >=0.8.25 <0.9.0; + +// https://github.com/bakaoh/solidity-rlp-encode + +/** + * @title RLPEncode + * @dev A simple RLP encoding library. + * @author Bakaoh + */ +library RLPEncode { + /* + * Internal functions + */ + + /** + * @dev RLP encodes a byte string. + * @param self The byte string to encode. + * @return The RLP encoded string in bytes. + */ + function encodeBytes(bytes memory self) internal pure returns (bytes memory) { + bytes memory encoded; + if (self.length == 1 && uint8(self[0]) < 128) { + encoded = self; + } else { + encoded = concat(encodeLength(self.length, 128), self); + } + return encoded; + } + + /** + * @dev RLP encodes a list of RLP encoded byte byte strings. + * @param self The list of RLP encoded byte strings. + * @return The RLP encoded list of items in bytes. + */ + function encodeList(bytes[] memory self) internal pure returns (bytes memory) { + bytes memory list = flatten(self); + return concat(encodeLength(list.length, 192), list); + } + + /** + * @dev RLP encodes a string. + * @param self The string to encode. + * @return The RLP encoded string in bytes. + */ + function encodeString(string memory self) internal pure returns (bytes memory) { + return encodeBytes(bytes(self)); + } + + /** + * @dev RLP encodes an address. + * @param self The address to encode. + * @return The RLP encoded address in bytes. + */ + function encodeAddress(address self) internal pure returns (bytes memory) { + bytes memory inputBytes; + assembly { + let m := mload(0x40) + mstore(add(m, 20), xor(0x140000000000000000000000000000000000000000, self)) + mstore(0x40, add(m, 52)) + inputBytes := m + } + return encodeBytes(inputBytes); + } + + /** + * @dev RLP encodes a uint. + * @param self The uint to encode. + * @return The RLP encoded uint in bytes. + */ + function encodeUint(uint256 self) internal pure returns (bytes memory) { + return encodeBytes(toBinary(self)); + } + + /** + * @dev RLP encodes an int. + * @param self The int to encode. + * @return The RLP encoded int in bytes. + */ + function encodeInt(int256 self) internal pure returns (bytes memory) { + return encodeUint(uint256(self)); + } + + /** + * @dev RLP encodes a bool. + * @param self The bool to encode. + * @return The RLP encoded bool in bytes. + */ + function encodeBool(bool self) internal pure returns (bytes memory) { + bytes memory encoded = new bytes(1); + encoded[0] = (self ? bytes1(0x01) : bytes1(0x80)); + return encoded; + } + + /* + * Private functions + */ + + /** + * @dev Encode the first byte, followed by the `len` in binary form if `length` is more than 55. + * @param len The length of the string or the payload. + * @param offset 128 if item is string, 192 if item is list. + * @return RLP encoded bytes. + */ + function encodeLength(uint256 len, uint256 offset) private pure returns (bytes memory) { + bytes memory encoded; + if (len < 56) { + encoded = new bytes(1); + encoded[0] = bytes32(len + offset)[31]; + } else { + uint256 lenLen; + uint256 i = 1; + while (len / i != 0) { + lenLen++; + i *= 256; + } + + encoded = new bytes(lenLen + 1); + encoded[0] = bytes32(lenLen + offset + 55)[31]; + for (i = 1; i <= lenLen; i++) { + encoded[i] = bytes32((len / (256 ** (lenLen - i))) % 256)[31]; + } + } + return encoded; + } + + /** + * @dev Encode integer in big endian binary form with no leading zeroes. + * @notice TODO: This should be optimized with assembly to save gas costs. + * @param _x The integer to encode. + * @return RLP encoded bytes. + */ + function toBinary(uint256 _x) private pure returns (bytes memory) { + bytes memory b = new bytes(32); + assembly { + mstore(add(b, 32), _x) + } + uint256 i; + for (i = 0; i < 32; i++) { + if (b[i] != 0) { + break; + } + } + bytes memory res = new bytes(32 - i); + for (uint256 j = 0; j < res.length; j++) { + res[j] = b[i++]; + } + return res; + } + + /** + * @dev Copies a piece of memory to another location. + * @notice From: https://github.com/Arachnid/solidity-stringutils/blob/master/src/strings.sol. + * @param _dest Destination location. + * @param _src Source location. + * @param _len Length of memory to copy. + */ + function memcpy(uint256 _dest, uint256 _src, uint256 _len) private pure { + uint256 dest = _dest; + uint256 src = _src; + uint256 len = _len; + + for (; len >= 32; len -= 32) { + assembly { + mstore(dest, mload(src)) + } + dest += 32; + src += 32; + } + + uint256 mask = 256 ** (32 - len) - 1; + assembly { + let srcpart := and(mload(src), not(mask)) + let destpart := and(mload(dest), mask) + mstore(dest, or(destpart, srcpart)) + } + } + + /** + * @dev Flattens a list of byte strings into one byte string. + * @notice From: https://github.com/sammayo/solidity-rlp-encoder/blob/master/RLPEncode.sol. + * @param _list List of byte strings to flatten. + * @return The flattened byte string. + */ + function flatten(bytes[] memory _list) private pure returns (bytes memory) { + if (_list.length == 0) { + return new bytes(0); + } + + uint256 len; + uint256 i; + for (i = 0; i < _list.length; i++) { + require(_list[i].length > 0, "An item in the list to be RLP encoded is null."); + len += _list[i].length; + } + + bytes memory flattened = new bytes(len); + uint256 flattenedPtr; + assembly { + flattenedPtr := add(flattened, 0x20) + } + + for (i = 0; i < _list.length; i++) { + bytes memory item = _list[i]; + + uint256 listPtr; + assembly { + listPtr := add(item, 0x20) + } + + memcpy(flattenedPtr, listPtr, item.length); + flattenedPtr += _list[i].length; + } + + return flattened; + } + + /** + * @dev Concatenates two bytes. + * @notice From: https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol. + * @param _preBytes First byte string. + * @param _postBytes Second byte string. + * @return Both byte string combined. + */ + function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) { + bytes memory tempBytes; + + assembly { + tempBytes := mload(0x40) + + let length := mload(_preBytes) + mstore(tempBytes, length) + + let mc := add(tempBytes, 0x20) + let end := add(mc, length) + + for { let cc := add(_preBytes, 0x20) } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { mstore(mc, mload(cc)) } + + length := mload(_postBytes) + mstore(tempBytes, add(length, mload(tempBytes))) + + mc := end + end := add(mc, length) + + for { let cc := add(_postBytes, 0x20) } lt(mc, end) { + mc := add(mc, 0x20) + cc := add(cc, 0x20) + } { mstore(mc, mload(cc)) } + + mstore(0x40, and(add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31))) + } + + return tempBytes; + } +} diff --git a/clone-agent/contracts/src/Registry.sol b/clone-agent/contracts/src/Registry.sol new file mode 100644 index 00000000..1a9729a2 --- /dev/null +++ b/clone-agent/contracts/src/Registry.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import { IExecution } from "./IExecution.sol"; + +error InvalidExecutionAddress(); +error UnauthorizedToAddTx(); +error TxAlreadyAdded(); +error InvalidHash(); +error NotExecuted(); +error Executed(); +error ExecutionAlreadyRegistered(); +error BadCreatorAddress(); + +event Registered(address indexed creator, address indexed execution); + +event NewTx(address indexed execution, address indexed creator, bytes32 indexed txHash); + +contract Registry is ReentrancyGuard { + mapping(address executionAddress => address orderCreator) public executions; + mapping(address creator => mapping(bytes32 txHash => bytes tx)) public transactions; + + function register(address execution) public { + if (execution == address(0)) { + revert InvalidExecutionAddress(); + } + + if (executions[execution] != address(0)) { + revert ExecutionAlreadyRegistered(); + } + + try IExecution(execution).isExecuted() returns (bool executed) { + if (executed) { + revert Executed(); + } + } catch { + revert InvalidExecutionAddress(); + } + + executions[execution] = msg.sender; + emit Registered(msg.sender, execution); + } + + function addTransaction(address creator, bytes32 txHash) public nonReentrant { + if (creator == address(0)) { + revert BadCreatorAddress(); + } + + if (executions[msg.sender] == address(0)) { + revert UnauthorizedToAddTx(); + } + + if (txHash == bytes32(0)) { + revert InvalidHash(); + } + + if (transactions[creator][txHash].length != 0) { + revert TxAlreadyAdded(); + } + + IExecution execution = IExecution(msg.sender); + + try execution.isExecuted() returns (bool executed) { + if (!executed) { + revert NotExecuted(); + } + } catch { + revert InvalidExecutionAddress(); + } + + transactions[creator][txHash] = execution.getTx(); + + emit NewTx(msg.sender, creator, txHash); + } +} diff --git a/clone-agent/contracts/src/Strings.sol b/clone-agent/contracts/src/Strings.sol new file mode 100644 index 00000000..2669b6ba --- /dev/null +++ b/clone-agent/contracts/src/Strings.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +// OpenZeppelin Contracts (last updated v5.1.0) (utils/Strings.sol) + +pragma solidity >=0.8.25 <0.9.0; + +import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol"; + +/** + * @dev String operations. + */ +library Strings { + using SafeCast for *; + /** + * @dev The string being parsed is not a properly formatted address. + */ + + error StringsInvalidAddressFormat(); + + /** + * @dev Parse a hexadecimal string (with or without "0x" prefix), and returns the value as an `address`. + * + * Requirements: + * - The string must be formatted as `(0x)?[0-9a-fA-F]{40}` + */ + function parseAddress(string memory input) internal pure returns (address) { + return parseAddress(input, 0, bytes(input).length); + } + + /** + * @dev Variant of {parseAddress} that parses a substring of `input` located between position `begin` (included) and + * `end` (excluded). + * + * Requirements: + * - The substring must be formatted as `(0x)?[0-9a-fA-F]{40}` + */ + function parseAddress(string memory input, uint256 begin, uint256 end) internal pure returns (address) { + (bool success, address value) = tryParseAddress(input, begin, end); + if (!success) revert StringsInvalidAddressFormat(); + return value; + } + + /** + * @dev Variant of {parseAddress-string-uint256-uint256} that returns false if the parsing fails because input is + * not a properly + * formatted address. See {parseAddress} requirements. + */ + function tryParseAddress( + string memory input, + uint256 begin, + uint256 end + ) + internal + pure + returns (bool success, address value) + { + // check that input is the correct length + bool hasPrefix = bytes2(_unsafeReadBytesOffset(bytes(input), begin)) == bytes2("0x"); + uint256 expectedLength = 40 + hasPrefix.toUint() * 2; + + if (end - begin == expectedLength) { + // length guarantees that this does not overflow, and value is at most type(uint160).max + (bool s, uint256 v) = tryParseHexUint(input, begin, end); + return (s, address(uint160(v))); + } else { + return (false, address(0)); + } + } + + /** + * @dev Variant of {parseHexUint-string-uint256-uint256} that returns false if the parsing fails because of an + * invalid character. + * + * NOTE: This function will revert if the result does not fit in a `uint256`. + */ + function tryParseHexUint( + string memory input, + uint256 begin, + uint256 end + ) + internal + pure + returns (bool success, uint256 value) + { + bytes memory buffer = bytes(input); + + // skip 0x prefix if present + bool hasPrefix = bytes2(_unsafeReadBytesOffset(buffer, begin)) == bytes2("0x"); + uint256 offset = hasPrefix.toUint() * 2; + + uint256 result = 0; + for (uint256 i = begin + offset; i < end; ++i) { + uint8 chr = _tryParseChr(bytes1(_unsafeReadBytesOffset(buffer, i))); + if (chr > 15) return (false, 0); + result *= 16; + unchecked { + // Multiplying by 16 is equivalent to a shift of 4 bits (with additional overflow check). + // This guaratees that adding a value < 16 will not cause an overflow, hence the unchecked. + result += chr; + } + } + return (true, result); + } + + function _tryParseChr(bytes1 chr) private pure returns (uint8) { + uint8 value = uint8(chr); + + // Try to parse `chr`: + // - Case 1: [0-9] + // - Case 2: [a-f] + // - Case 3: [A-F] + // - otherwise not supported + unchecked { + if (value > 47 && value < 58) value -= 48; + else if (value > 96 && value < 103) value -= 87; + else if (value > 64 && value < 71) value -= 55; + else return type(uint8).max; + } + + return value; + } + + /** + * @dev Reads a bytes32 from a bytes array without bounds checking. + * + * NOTE: making this function internal would mean it could be used with memory unsafe offset, and marking the + * assembly block as such would prevent some optimizations. + */ + function _unsafeReadBytesOffset(bytes memory buffer, uint256 offset) private pure returns (bytes32 value) { + // This is not memory safe in the general case, but all calls to this private function are within bounds. + // solhint-disable-next-line + assembly ("memory-safe") { + value := mload(add(buffer, add(0x20, offset))) + } + } +} diff --git a/clone-agent/contracts/src/Types.sol b/clone-agent/contracts/src/Types.sol new file mode 100644 index 00000000..937f6a81 --- /dev/null +++ b/clone-agent/contracts/src/Types.sol @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +library Types { + // Sign request data + struct SignRequestData { + uint64 keyId; + bytes[] analyzers; + bytes encryptionKey; + uint64 spaceNonce; + uint64 actionTimeoutHeight; + string expectedApproveExpression; + string expectedRejectExpression; + } + + enum PriceCondition { + LTE, + GTE, + LT, + GT + } + + // Data for basic order creation + struct BasicOrderData { + uint256 thresholdPrice; + PriceCondition priceCondition; + PricePair pricePair; + } + + // Data for advanced order creation + struct AdvancedOrderData { + // Which pair use to get price for oracle + PricePair oraclePricePair; + // Which pair use to get price for prediction handler + PricePair predictPricePair; + // Price condition for execution: should be executing if current price meets condition to prediced price + PriceCondition priceCondition; + // seconds timestamp + uint256 pricePredictDate; + } + + // Data for execution + struct CommonExecutionData { + CreatorDefinedTxFields creatorDefinedTxFields; + SignRequestData signRequestData; + } + + // Price pair for oracle/prediction requests + struct PricePair { + string base; + string quote; + } + + struct CreatorDefinedTxFields { + uint256 value; + uint256 chainId; + address to; + bytes data; + } + + struct AnyType { + string typeUrl; + bytes value; + } + + struct Timestamp { + uint64 secs; + uint64 nanos; + } + + /// @dev Dec represents a fixed point decimal value. The value is stored as an integer, and the + /// precision is stored as a uint8. The value is multiplied by 10^precision to get the actual value. + struct Dec { + uint256 value; + uint8 precision; + } + + /// @dev Coin is a struct that represents a token with a denomination and an amount. + struct Coin { + string denom; + uint256 amount; + } + + /// @dev DecCoin is a struct that represents a token with a denomination, an amount and a precision. + struct DecCoin { + string denom; + uint256 amount; + uint8 precision; + } + + /// @dev PageResponse is a struct that represents a page response. + struct PageResponse { + bytes nextKey; + uint64 total; + } + + /// @dev PageRequest is a struct that represents a page request. + struct PageRequest { + bytes key; + uint64 offset; + uint64 limit; + bool countTotal; + bool reverse; + } + + /// @dev Height is a monotonically increasing data type + /// that can be compared against another Height for the purposes of updating and + /// freezing clients + /// + /// Normally the RevisionHeight is incremented at each height while keeping + /// RevisionNumber the same. However some consensus algorithms may choose to + /// reset the height in certain conditions e.g. hard forks, state-machine + /// breaking changes In these cases, the RevisionNumber is incremented so that + /// height continues to be monotonically increasing even as the RevisionHeight + /// gets reset + struct Height { + // the revision that the client is currently on + uint64 revisionNumber; + // the height within the given revision + uint64 revisionHeight; + } +} diff --git a/clone-agent/contracts/src/interfaces/IAsync.sol b/clone-agent/contracts/src/interfaces/IAsync.sol new file mode 100644 index 00000000..c3055291 --- /dev/null +++ b/clone-agent/contracts/src/interfaces/IAsync.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.18; + +import "../Types.sol"; + +/// @dev The IAsync contract's address. +address constant IASYNC_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000903; + +/// @dev The IAsync contract's instance. +IAsync constant IASYNC_CONTRACT = IAsync(IASYNC_PRECOMPILE_ADDRESS); + +struct Future { + uint64 id; + address creator; + string handler; + bytes input; +} + +enum FutureVoteType { + Unspecified, + Verified, + Rejected +} + +struct FutureVote { + uint64 futureId; + bytes Voter; + FutureVoteType vote; +} + +struct FutureResult { + uint64 id; + bytes output; + bytes submitter; +} + +struct FutureResponse { + Future future; + FutureVote[] votes; + FutureResult result; +} + +struct PendingFuturesResponse { + Types.PageResponse pagination; + Future[] futures; +} + +struct FuturesResponse { + Types.PageResponse pagination; + FutureResponse[] futures; +} + +struct FutureByIdResponse { + FutureResponse futureResponse; +} + +/** + * @author Warden Team + * @title x/async Interface + * @dev The interface through which users and solidity contracts will interact with x/async. + * @custom:address 0x0000000000000000000000000000000000000903 + */ +interface IAsync { + /// @dev Defines a method to add a future. + /// @param handler The unique name of the handler + /// @param input The handler's input + /// @return futureId The id of the future + function addFuture(string calldata handler, bytes calldata input) external returns (uint64 futureId); + + /// @dev Defines a method to query future by id. + /// @param futureId The future id + /// @return response The future reponse + function futureById(uint64 futureId) external view returns (FutureByIdResponse memory response); + + /// @dev Defines a method to query futures. + /// @param pagination The pagination details + /// @param creator Optional creator address filter + /// @return response The paged futures + function futures( + Types.PageRequest calldata pagination, + address creator + ) + external + view + returns (FuturesResponse memory response); + + /// @dev Defines a method to query pending futures. + /// @param pagination The pagination details + /// @return response The paged futures + function pendingFutures(Types.PageRequest calldata pagination) + external + view + returns (PendingFuturesResponse memory response); + + /// @dev CreateFuture defines an Event emitted when a future is created. + /// @param creator The address of the creator + /// @param futureId The future Id + /// @param handler The name of the handler + event CreateFuture(uint64 indexed futureId, address indexed creator, string handler); +} diff --git a/clone-agent/contracts/src/interfaces/ISlinky.sol b/clone-agent/contracts/src/interfaces/ISlinky.sol new file mode 100644 index 00000000..f466b9ee --- /dev/null +++ b/clone-agent/contracts/src/interfaces/ISlinky.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.18; + +/// @dev The ISlinky contract's address. +address constant ISLINKY_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000902; + +/// @dev The ISlinky contract's instance. +ISlinky constant ISLINKY_CONTRACT = ISlinky(ISLINKY_PRECOMPILE_ADDRESS); + +struct GetPriceResponse { + uint64 id; + uint64 nonce; + uint64 decimals; + QuotePrice price; +} + +struct QuotePrice { + uint64 blockHeight; + uint256 blockTimestamp; + uint256 price; +} + +/** + * @author Warden Team + * @title x/slinky Interface + * @dev The interface through which users and solidity contracts will interact with x/slinky. + * @custom:address 0x0000000000000000000000000000000000000902 + */ +interface ISlinky { + /// @dev Defines a method to query the price of a coin. + /// @param base The base coin name for the price + /// @param quote The quote coin name for the price + /// @return response The coin price if found + function getPrice( + string calldata base, + string calldata quote + ) + external + view + returns (GetPriceResponse memory response); +} diff --git a/clone-agent/contracts/src/interfaces/IWarden.sol b/clone-agent/contracts/src/interfaces/IWarden.sol new file mode 100644 index 00000000..1eaaf6b1 --- /dev/null +++ b/clone-agent/contracts/src/interfaces/IWarden.sol @@ -0,0 +1,606 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.18; + +import "../Types.sol"; + +/// @dev The IWarden contract's address. +address constant IWARDEN_PRECOMPILE_ADDRESS = 0x0000000000000000000000000000000000000900; + +/// @dev The IWarden contract's instance. +IWarden constant IWARDEN_CONTRACT = IWarden(IWARDEN_PRECOMPILE_ADDRESS); + +struct KeychainFees { + Types.Coin[] keyReq; + Types.Coin[] sigReq; +} + +struct Key { + uint64 id; + uint64 spaceId; + uint64 keychainId; + KeyType keyType; + bytes publicKey; + uint64 approveTemplateId; + uint64 rejectTemplateId; +} + +struct KeyResponse { + Key key; + AddressesResponse[] addresses; +} + +struct AddressesResponse { + string addressValue; + AddressType addressType; +} + +struct KeyRequest { + uint64 id; + address creator; + uint64 spaceId; + uint64 keychainId; + KeyType keyType; + KeyRequestStatus status; + string rejectReason; + uint64 approveTemplateId; + uint64 rejectTemplateId; + Types.Coin[] deductedKeychainFees; +} + +struct Keychain { + uint64 id; + address creator; + string name; + address[] admins; + address[] writers; + KeychainFees fees; + string description; + string url; + string keybaseId; +} + +struct SignRequest { + uint64 id; + address creator; + uint64 keyId; + bytes dataForSigning; + SignRequestStatus status; + bytes result; + bytes encryptionKey; + Types.Coin[] deductedKeychainFees; + BroadcastType broadcastType; +} + +struct Space { + uint64 id; + address creator; + address[] owners; + uint64 nonce; + uint64 approveAdminTemplateId; + uint64 rejectAdminTemplateId; + uint64 approveSignTemplateId; + uint64 rejectSignTemplateId; +} + +enum AddressType { + Unspecified, + Ethereum, + Osmosis +} + +enum KeyType { + Unspecified, + EcdsaSecp256k1, + EddsaEd25519 +} + +enum KeyRequestStatus { + Unspecified, + Pending, + Fulfilled, + Rejected +} + +enum SignRequestStatus { + Unspecified, + Pending, + Fulfilled, + Rejected +} + +enum BroadcastType { + Disabled, + Automatic +} + +enum OptionalBroadcastType { + Nonspecified, + Disabled, + Automatic +} + +/** + * @author Warden Team + * @title x/warden Interface + * @dev The interface through which users and solidity contracts will interact with x/warden. + * @custom:address 0x0000000000000000000000000000000000000900 + */ +interface IWarden { + /// @dev Defines a method for adding a new admin to a keychain. + /// @param keychainId The keychain id + /// @param newAdmin The new admin's address + /// @return success If execution was successful + function addKeychainAdmin(uint64 keychainId, address newAdmin) external returns (bool success); + + /// @dev Defines a method for adding a new writer to a keychain. + /// @param keychainId The keychain id + /// @param newWriter The new writer's address + /// @return success If execution was successful + function addKeychainWriter(uint64 keychainId, address newWriter) external returns (bool success); + + /// @dev Defines a method to fulfil a key request. + /// @param requestId The request id + /// @param pubKey The new created public key + /// @return success If execution was successful + function fulfilKeyRequest(uint64 requestId, bytes calldata pubKey) external returns (bool success); + + /// @dev Defines a method to reject a key request. + /// @param requestId The request id + /// @param rejectReason The reject reason + /// @return success If execution was successful + function rejectKeyRequest(uint64 requestId, string calldata rejectReason) external returns (bool success); + + /// @dev Defines a method to fulfil a sign request. + /// @param requestId The request id + /// @param signedData The signed data + /// @return success If execution was successful + function fulfilSignRequest(uint64 requestId, bytes calldata signedData) external returns (bool success); + + /// @dev Defines a method to reject a sign request. + /// @param requestId The request id + /// @param rejectReason The reject reason + /// @return success If execution was successful + function rejectSignRequest(uint64 requestId, string calldata rejectReason) external returns (bool success); + + /// @dev Defines a method to create a new keychain. + /// @param name The keychain name + /// @param keychainFees The keychain fees + /// @param description The keychain description + /// @param url The keychain url + /// @param keybaseId The keychain keybase id + /// @return id The id of the keychain + function newKeychain( + string calldata name, + KeychainFees calldata keychainFees, + string calldata description, + string calldata url, + string calldata keybaseId + ) + external + returns (uint64 id); + + /// @dev Defines a method to create a new space. + /// @param approveAdminTemplateId The template id of approve admin action + /// @param rejectAdminTemplateId The template id of reject admin action + /// @param approveSignTemplateId The template id of approve sign action + /// @param rejectSignTemplateId The template id of reject sign action + /// @param additionalOwners Additional space owners + /// @return id The id of the space + function newSpace( + uint64 approveAdminTemplateId, + uint64 rejectAdminTemplateId, + uint64 approveSignTemplateId, + uint64 rejectSignTemplateId, + address[] calldata additionalOwners + ) + external + returns (uint64 id); + + /// @dev Defines a method to remove an admin from keychain. + /// @param keychainId The id of the keychain + /// @param admin The admin address + /// @return success If execution was successful + function removeKeychainAdmin(uint64 keychainId, address admin) external returns (bool success); + + /// @dev Defines a method to update a keychain. + /// @param keychainId The keychain id + /// @param name The keychain name + /// @param keychainFees The keychain fees + /// @param description The keychain description + /// @param url The keychain url + /// @param keybaseId The keychain keybase id + /// @return success If execution was successful + function updateKeychain( + uint64 keychainId, + string calldata name, + KeychainFees calldata keychainFees, + string calldata description, + string calldata url, + string calldata keybaseId + ) + external + returns (bool success); + + /// @dev Defines a method to add a space owner. + /// @param spaceId The space id + /// @param newOwner The new owner + /// @param nonce The nonce + /// @param actionTimeoutHeight The block height up until this action can be executed + /// @param expectedApproveExpression The definition of expected approval expression the action is created with + /// @param expectedRejectExpression The definition of expected reject expression the action is created with + /// @return success If execution was successful + function addSpaceOwner( + uint64 spaceId, + address newOwner, + uint64 nonce, + uint64 actionTimeoutHeight, + string calldata expectedApproveExpression, + string calldata expectedRejectExpression + ) + external + returns (bool success); + + /// @dev Defines a method to remove a space owner. + /// @param spaceId The space id + /// @param owner The owner + /// @param nonce The nonce + /// @param actionTimeoutHeight The block height up until this action can be executed + /// @param expectedApproveExpression The definition of expected approval expression the action is created with + /// @param expectedRejectExpression The definition of expected reject expression the action is created with + /// @return success If execution was successful + function removeSpaceOwner( + uint64 spaceId, + address owner, + uint64 nonce, + uint64 actionTimeoutHeight, + string calldata expectedApproveExpression, + string calldata expectedRejectExpression + ) + external + returns (bool success); + + /// @dev Defines a method to create a new key request. + /// @param spaceId The space id + /// @param keychainId The keychain id + /// @param keyType The key type + /// @param approveTemplateId The approve template id + /// @param rejectTemplateId The reject template id + /// @param maxKeychainFees The max keychain fees + /// @param nonce The nonce + /// @param actionTimeoutHeight The block height up until this action can be executed + /// @param expectedApproveExpression The definition of expected approval expression the action is created with + /// @param expectedRejectExpression The definition of expected reject expression the action is created with + /// @return success If execution was successful + function newKeyRequest( + uint64 spaceId, + uint64 keychainId, + KeyType keyType, + uint64 approveTemplateId, + uint64 rejectTemplateId, + Types.Coin[] calldata maxKeychainFees, + uint64 nonce, + uint64 actionTimeoutHeight, + string calldata expectedApproveExpression, + string calldata expectedRejectExpression + ) + external + returns (bool success); + + /// @dev Defines a method to create a new signature request. + /// @param keyId The key id + /// @param input The input + /// @param analyzers The analyzers + /// @param encryptionKey The encryption key + /// @param maxKeychainFees The max keychain fees + /// @param nonce The nonce + /// @param actionTimeoutHeight The block height up until this action can be executed + /// @param expectedApproveExpression The definition of expected approval expression the action is created with + /// @param expectedRejectExpression The definition of expected reject expression the action is created with + /// @param broadcastType The broadcast type + /// @return success If execution was successful + function newSignRequest( + uint64 keyId, + bytes calldata input, + bytes[] calldata analyzers, + bytes calldata encryptionKey, + Types.Coin[] calldata maxKeychainFees, + uint64 nonce, + uint64 actionTimeoutHeight, + string calldata expectedApproveExpression, + string calldata expectedRejectExpression, + BroadcastType broadcastType + ) + external + returns (bool success); + + /// @dev Defines a method to update a key. + /// @param keyId The key id + /// @param approveTemplateId The approve template id + /// @param rejectTemplateId The reject template id + /// @param actionTimeoutHeight The block height up until this action can be executed + /// @param expectedApproveExpression The definition of expected approval expression the action is created with + /// @param expectedRejectExpression The definition of expected reject expression the action is created with + /// @return success If execution was successful + function updateKey( + uint64 keyId, + uint64 approveTemplateId, + uint64 rejectTemplateId, + uint64 actionTimeoutHeight, + string calldata expectedApproveExpression, + string calldata expectedRejectExpression + ) + external + returns (bool success); + + /// @dev Defines a method to update a space. + /// @param spaceId The space id + /// @param nonce The nonce + /// @param approveAdminTemplateId The template id of approve admin action + /// @param rejectAdminTemplateId The template id of reject admin action + /// @param approveSignTemplateId The template id of approve sign action + /// @param rejectSignTemplateId The template id of reject sign action + /// @param actionTimeoutHeight The block height up until this action can be executed + /// @param expectedApproveExpression The definition of expected approval expression the action is created with + /// @param expectedRejectExpression The definition of expected reject expression the action is created with + /// @return success If execution was successful + function updateSpace( + uint64 spaceId, + uint64 nonce, + uint64 approveAdminTemplateId, + uint64 rejectAdminTemplateId, + uint64 approveSignTemplateId, + uint64 rejectSignTemplateId, + uint64 actionTimeoutHeight, + string calldata expectedApproveExpression, + string calldata expectedRejectExpression + ) + external + returns (bool success); + + /// @dev Defines a method to query keys. + /// @param pageRequest The pagination details + /// @return keys An array of `KeyResponse` structs containing the retrieved keys + /// @return pageResponse pagination details + function allKeys( + Types.PageRequest calldata pageRequest, + int32[] calldata deriveAddresses + ) + external + view + returns (KeyResponse[] memory keys, Types.PageResponse memory pageResponse); + + /// @dev Defines a method to query key by id. + /// @param id The id of the key + /// @param deriveAddresses The array of address types to derive + /// @return key `KeyResponse` struct containing the retrieved key + function keyById(uint64 id, int32[] calldata deriveAddresses) external view returns (KeyResponse memory key); + + /// @dev Defines a method to query keys by space id. + /// @param pageRequest The pagination details + /// @param spaceId The id of the space + /// @param deriveAddresses The array of address types to derive + /// @return keys An array of `KeyResponse` structs containing the retrieved keys + /// @return pageResponse pagination details + function keysBySpaceId( + Types.PageRequest calldata pageRequest, + uint64 spaceId, + int32[] calldata deriveAddresses + ) + external + view + returns (KeyResponse[] memory keys, Types.PageResponse memory pageResponse); + + /// @dev Defines a method to query keyRequest by id. + /// @param id The id of the keyRequest + /// @return keyRequest The key request + function keyRequestById(uint64 id) external view returns (KeyRequest memory keyRequest); + + /// @dev Defines a method to query keyRequests. + /// @param pageRequest The pagination details + /// @param keychainId The id of the keychain + /// @param status The key requests status + /// @param spaceId The id of the space + /// @return keyRequests An array of `KeyRequest` structs containing the retrieved key requests + /// @return pageResponse pagination details + function keyRequests( + Types.PageRequest calldata pageRequest, + uint64 keychainId, + KeyRequestStatus status, + uint64 spaceId + ) + external + view + returns (KeyRequest[] memory keyRequests, Types.PageResponse memory pageResponse); + + /// @dev Defines a method to query keychain by id. + /// @param id The id of the keychain + /// @return keychain The keychain + function keychainById(uint64 id) external view returns (Keychain memory keychain); + + /// @dev Defines a method to query keychains. + /// @param pageRequest The pagination details + /// @return keychains An array of `Keychain` structs containing the retrieved key requests + /// @return pageResponse pagination details + function keychains(Types.PageRequest calldata pageRequest) + external + view + returns (Keychain[] memory keychains, Types.PageResponse memory pageResponse); + + /// @dev Defines a method to query sign request by id. + /// @param id The id of the sign request + /// @return signRequest The sign request + function signRequestById(uint64 id) external view returns (SignRequest memory signRequest); + + /// @dev Defines a method to query sign requests. + /// @param pageRequest The pagination details + /// @param keychainId The id of the keychain + /// @param status The sign requests status + /// @param optionalBroadcastType The optional broadcast type to query + /// @return signRequests An array of `SignRequest` structs containing the retrieved sign requests + /// @return pageResponse pagination details + function signRequests( + Types.PageRequest calldata pageRequest, + uint64 keychainId, + SignRequestStatus status, + OptionalBroadcastType optionalBroadcastType + ) + external + view + returns (SignRequest[] memory signRequests, Types.PageResponse memory pageResponse); + + /// @dev Defines a method to query space by id. + /// @param id The id of the space + /// @return space The space + function spaceById(uint64 id) external view returns (Space memory space); + + /// @dev Defines a method to query spaces. + /// @param pageRequest The pagination details + /// @return spaces An array of `Space` structs containing the retrieved sign requests + /// @return pageResponse pagination details + function spaces(Types.PageRequest calldata pageRequest) + external + view + returns (Space[] memory spaces, Types.PageResponse memory pageResponse); + + /// @dev Defines a method to query spaces by owner. + /// @param pageRequest The pagination details + /// @param owner The owner address + /// @return spaces An array of `Space` structs containing the retrieved sign requests + /// @return pageResponse pagination details + function spacesByOwner( + Types.PageRequest calldata pageRequest, + address owner + ) + external + view + returns (Space[] memory spaces, Types.PageResponse memory pageResponse); + + /// @dev AddKeychainAdmin defines an Event emitted when add a new admin to a keychain. + /// @param newAdmin The address of the admin + /// @param id The keychain id + /// @param adminsCount The new count of admins + event AddKeychainAdmin(address newAdmin, uint64 indexed id, uint64 adminsCount); + + /// @dev AddKeychainWriter defines an Event emitted when add a new writer to a keychain. + /// @param newWriter The address of the writer + /// @param id The keychain id + /// @param writersCount The new count of writers + event AddKeychainWriter(address newWriter, uint64 indexed id, uint64 writersCount); + + /// @dev NewKey defines an Event emitted when a key request fulfilled. + /// @param id The key id + /// @param keyType The key type + /// @param spaceId The space id + /// @param keychainId The keychain id + /// @param approveTemplateId The approve template id + /// @param rejectTemplateId The reject template id + event NewKey( + uint64 indexed id, + KeyType keyType, + uint64 spaceId, + uint64 keychainId, + uint64 approveTemplateId, + uint64 rejectTemplateId + ); + + /// @dev RejectKeyRequest defines an Event emitted when a key request rejected. + /// @param id The request id + event RejectKeyRequest(uint64 indexed id); + + /// @dev FulfilSignRequest defines an Event emitted when a sign request fulfilled. + /// @param id The request id + event FulfilSignRequest(uint64 indexed id); + + /// @dev RejectSignRequest defines an Event emitted when a sign request rejected. + /// @param id The request id + event RejectSignRequest(uint64 indexed id); + + /// @dev NewKeychain defines an Event emitted when a new keychain is created. + /// @param id The keychain id + /// @param creator The creator address + event NewKeychain(uint64 indexed id, address creator); + + /// @dev NewSpace defines an Event emitted when a new space is created. + /// @param id The space id + /// @param creator The creator address + /// @param ownersCount The count of space owners + /// @param approveAdminTemplateId The template id of approve admin action + /// @param rejectAdminTemplateId The template id of reject admin action + /// @param approveSignTemplateId The template id of approve sign action + /// @param rejectSignTemplateId The template id of reject sign action + event NewSpace( + uint64 indexed id, + address creator, + uint64 ownersCount, + uint64 approveAdminTemplateId, + uint64 rejectAdminTemplateId, + uint64 approveSignTemplateId, + uint64 rejectSignTemplateId + ); + + /// @dev RemoveKeychainAdmin defines an Event emitted when an admin removed from keychain. + /// @param keychainId The keychain id + /// @param admin The admin address + /// @param adminsCount The count of keychain admins + event RemoveKeychainAdmin(uint64 indexed keychainId, address admin, uint64 adminsCount); + + /// @dev UpdateKeychain defines an Event emitted when a keychain is updated. + /// @param id The keychain id + /// @param keychainFees The keychain fees + event UpdateKeychain(uint64 indexed id, KeychainFees keychainFees); + + /// @dev AddSpaceOwner defines an Event emitted when a new space owner is added. + /// @param spaceId The space id + /// @param newOwner The new owner address + event AddSpaceOwner(uint64 indexed spaceId, address newOwner); + + /// @dev RemoveSpaceOwner defines an Event emitted when a space owner is removed. + /// @param spaceId The space id + /// @param removedOwner The removed owner address + event RemoveSpaceOwner(uint64 indexed spaceId, address removedOwner); + + /// @dev NewKeyRequest defines an Event emitted when a new key request is created. + /// @param id The id of the created key request + /// @param spaceId The space id + /// @param keychainId The keychain id + /// @param approveTemplateId The approve template id + /// @param rejectTemplateId The reject template id + /// @param keyType The key type + /// @param creator The creator address + event NewKeyRequest( + uint64 indexed id, + uint64 spaceId, + uint64 keychainId, + uint64 approveTemplateId, + uint64 rejectTemplateId, + KeyType keyType, + address creator + ); + + /// @dev NewSignRequest defines an Event emitted when a new signature request is created. + /// @param id The id of the signature request + /// @param keyId The id of the Key to be used for signing + /// @param creator The creator address + /// @param broadcastType The broadcast type + event NewSignRequest(uint64 indexed id, uint64 keyId, address creator, BroadcastType broadcastType); + + /// @dev UpdateKey defines an Event emitted when a key is updated. + /// @param id The id of the key + /// @param approveTemplateId The approve template id + /// @param rejectTemplateId The reject template id + event UpdateKey(uint64 indexed id, uint64 approveTemplateId, uint64 rejectTemplateId); + + /// @dev UpdateSpace defines an Event emitted when a space is updated. + /// @param spaceId The id of the space being updated + /// @param approveAdminTemplateId The id of the template to be applied to every approve admin operation + /// @param rejectAdminTemplateId The id of the template to be applied to every reject admin operation + /// @param approveSignTemplateId The id of the template to be applied to every approve sign operation + /// @param rejectSignTemplateId The id of the template to be applied to every reject sign operation + event UpdateSpace( + uint64 indexed spaceId, + uint64 approveAdminTemplateId, + uint64 rejectAdminTemplateId, + uint64 approveSignTemplateId, + uint64 rejectSignTemplateId + ); +} diff --git a/clone-agent/contracts/test/BasicOrder.t.sol b/clone-agent/contracts/test/BasicOrder.t.sol new file mode 100644 index 00000000..87ee4db2 --- /dev/null +++ b/clone-agent/contracts/test/BasicOrder.t.sol @@ -0,0 +1,631 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { Test } from "forge-std/Test.sol"; +import { ISLINKY_PRECOMPILE_ADDRESS } from "../src/interfaces/ISlinky.sol"; +import { IWARDEN_PRECOMPILE_ADDRESS } from "../src/interfaces/IWarden.sol"; +import { Types } from "../src/Types.sol"; +import { + OrderCreated, + OrderFactory, + OrderType, + InvalidRegistryAddress, + InvalidSchedulerAddress, + SchedulerChanged, + SaltAlreadyUsed +} from "../src/OrderFactory.sol"; +import { BasicOrderFactory } from "../src/BasicOrderFactory.sol"; +import { AdvancedOrderFactory } from "../src/AdvancedOrderFactory.sol"; +import { IExecution } from "../src/IExecution.sol"; +import { MockWardenPrecompile } from "../mocks/MockWardenPrecompile.sol"; +import { MockSlinkyPrecompile } from "../mocks/MockSlinkyPrecompile.sol"; +import { Types as CommonTypes } from "../src/Types.sol"; +import { InvalidScheduler } from "../src/AbstractOrder.sol"; +import { BasicOrder, Executed, ConditionNotMet, ExecutedError, Unauthorized } from "../src/BasicOrder.sol"; +import { + BadCreatorAddress, + ExecutionAlreadyRegistered, + InvalidExecutionAddress, + NewTx, + Registry, + Registered, + UnauthorizedToAddTx, + NotExecuted, + TxAlreadyAdded, + InvalidHash +} from "../src/Registry.sol"; +import { Create3 } from "@0xsequence/create3/contracts/Create3.sol"; + +struct TestData { + Registry registry; + BasicOrderFactory basicOrderFactory; + AdvancedOrderFactory advancedOrderFactory; + OrderFactory orderFactory; + MockWardenPrecompile wardenPrecompile; + MockSlinkyPrecompile mockSlinkyPrecompile; + uint256 thresholdPrice; + Types.PricePair pricePair; + uint64 goodKeyId; + uint64 badKeyId; + address scheduler; +} + +contract BasicOrderTest is Test { + TestData private _testData; + Types.BasicOrderData private _orderData; + Types.CommonExecutionData private _executionData; + IExecution private _order; + bytes32 private _txHash; + + // @openzeppelin Ownable.sol + error OwnableUnauthorizedAccount(address account); + + address private constant SEPOLIA_UNISWAP_V2_ROUTER = address(uint160(0xeE567Fe1712Faf6149d80dA1E6934E354124CfE3)); + address private constant RECEIVER = address(uint160(0x18517Cb2779186B86b1F8947dFdB6078C1B9C9db)); + address private constant SEPOLIA_WETH = 0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14; + address private constant SEPOLIA_TEST_TOKEN = 0xE5a71132Ae99691ef35F68459aDde842118A86a5; + + function beforeTestSetup(bytes4 testSelector) public pure returns (bytes[] memory beforeTestCalldata) { + if ( + testSelector == this.test_BasicOrder_StateBeforeExecution.selector + || testSelector == this.test_basicOrderRevertWhenConditionNotMet.selector + || testSelector == this.test_basicOrderRevertWhenUnauthorized.selector + || testSelector == this.test_basicOrderRevertGetTxWhenNotExecuted.selector + || testSelector == this.test_basicOrderExecuteWhenPriceMovesDown.selector + || testSelector == this.test_RegistryRevertAddTransactionWhenInvalidHash.selector + || testSelector == this.test_RegistryRevertAddTransactionWhenNotExecuted.selector + || testSelector == this.test_RegistryRevertWhenAlreadyRegistered.selector + ) { + beforeTestCalldata = new bytes[](1); + beforeTestCalldata[0] = + abi.encodeWithSignature("test_BasicOrder_Create(bool,uint8)", true, Types.PriceCondition.LTE); + } else if (testSelector == this.test_basicOrderExecuteWhenPriceMovesUp.selector) { + beforeTestCalldata = new bytes[](1); + beforeTestCalldata[0] = + abi.encodeWithSignature("test_BasicOrder_Create(bool,uint8)", true, Types.PriceCondition.GTE); + } else if (testSelector == this.test_RegistryRevertAddTransactionWhenAlreadyAdded.selector) { + beforeTestCalldata = new bytes[](2); + beforeTestCalldata[0] = + abi.encodeWithSignature("test_BasicOrder_Create(bool,uint8)", true, Types.PriceCondition.GTE); + beforeTestCalldata[1] = abi.encodeWithSignature("test_basicOrderExecuteWhenPriceMovesUp()"); + } else if ( + testSelector == this.test_BasicOrderRevertWhenInvalidScheduler.selector + || testSelector == this.test_BasicOrderRevertWhenInvalidExpectedApproveExpression.selector + || testSelector == this.test_BasicOrderRevertWhenInvalidExpectedRejectExpression.selector + || testSelector == this.test_BasicOrderRevertWhenInvalidThresholdPrice.selector + || testSelector == this.test_BasicOrderRevertWhenInvalidTxTo.selector + ) { + beforeTestCalldata = new bytes[](1); + beforeTestCalldata[0] = abi.encodeWithSignature("saveOrderData()"); + } else if ( + testSelector == this.test_computeOrderAddressMatchesCreateOrder.selector + || testSelector == this.test_computeOrderAddressGuardedBySender.selector + ) { + beforeTestCalldata = new bytes[](1); + beforeTestCalldata[0] = + abi.encodeWithSignature("test_BasicOrder_Create(bool,uint8)", true, Types.PriceCondition.LTE); + } else if (testSelector == this.test_computeOrderAddressBeforeDeployment.selector) { + beforeTestCalldata = new bytes[](1); + beforeTestCalldata[0] = abi.encodeWithSignature("saveOrderData()"); + } else if ( + testSelector == this.test_createOrderRevertsWithUsedSalt.selector + || testSelector == this.test_createOrderWithDifferentSenderCanUseSameSalt.selector + ) { + beforeTestCalldata = new bytes[](1); + beforeTestCalldata[0] = + abi.encodeWithSignature("test_BasicOrder_Create(bool,uint8)", true, Types.PriceCondition.LTE); + } + } + + function setUp() public { + Registry registry = new Registry(); + address scheduler = address(this); + address owner = address(this); + BasicOrderFactory basicOrderFactory = new BasicOrderFactory(address(registry)); + AdvancedOrderFactory advancedOrderFactory = new AdvancedOrderFactory(address(registry)); + OrderFactory orderFactory = new OrderFactory( + address(registry), scheduler, owner, address(basicOrderFactory), address(advancedOrderFactory) + ); + + MockWardenPrecompile wPrecompile = new MockWardenPrecompile(); + vm.etch(IWARDEN_PRECOMPILE_ADDRESS, address(wPrecompile).code); + MockWardenPrecompile wardenPrecompile = MockWardenPrecompile(IWARDEN_PRECOMPILE_ADDRESS); + + MockSlinkyPrecompile mSlinkyPrecompile = new MockSlinkyPrecompile(); + vm.etch(ISLINKY_PRECOMPILE_ADDRESS, address(mSlinkyPrecompile).code); + MockSlinkyPrecompile mockSlinkyPrecompile = MockSlinkyPrecompile(ISLINKY_PRECOMPILE_ADDRESS); + + uint64 goodKeyId = 1; + uint64 badKeyId = 2; + wardenPrecompile.addKey(goodKeyId, true); + wardenPrecompile.addKey(badKeyId, false); + + _testData = TestData({ + registry: registry, + basicOrderFactory: basicOrderFactory, + advancedOrderFactory: advancedOrderFactory, + orderFactory: orderFactory, + wardenPrecompile: wardenPrecompile, + mockSlinkyPrecompile: mockSlinkyPrecompile, + thresholdPrice: 5, + pricePair: Types.PricePair({ base: "ETH", quote: "DOGE" }), + goodKeyId: goodKeyId, + badKeyId: badKeyId, + scheduler: scheduler + }); + + // Initialize _orderData with valid values + bytes[] memory analyzers; + _orderData = Types.BasicOrderData({ + thresholdPrice: _testData.thresholdPrice, + priceCondition: Types.PriceCondition.LTE, + pricePair: _testData.pricePair + }); + + _executionData = Types.CommonExecutionData({ + signRequestData: Types.SignRequestData({ + keyId: _testData.goodKeyId, + analyzers: analyzers, + encryptionKey: "", + spaceNonce: 0, + actionTimeoutHeight: 0, + expectedApproveExpression: "expectedApproveExpression", + expectedRejectExpression: "expectedRejectExpression" + }), + creatorDefinedTxFields: Types.CreatorDefinedTxFields({ + value: 0, + chainId: 11_155_111, + to: SEPOLIA_UNISWAP_V2_ROUTER, + data: getTestSwapData() + }) + }); + } + + function test_BasicOrder_Create(bool goodOrder, uint8 condition) public { + if (condition > 1) { + condition = 0; + } + + bytes[] memory analyzers; + bytes memory encryptionKey; + uint64 keyId; + if (goodOrder) { + keyId = _testData.goodKeyId; + } else { + keyId = _testData.badKeyId; + } + + Types.PriceCondition cond = Types.PriceCondition(condition); + if (cond == Types.PriceCondition.LTE) { + _testData.mockSlinkyPrecompile.setPrice( + _testData.pricePair.base, _testData.pricePair.quote, _testData.thresholdPrice + 1 + ); + } else { + _testData.mockSlinkyPrecompile.setPrice( + _testData.pricePair.base, _testData.pricePair.quote, _testData.thresholdPrice - 1 + ); + } + + bytes memory data = getTestSwapData(); + Types.BasicOrderData memory orderData = Types.BasicOrderData({ + thresholdPrice: _testData.thresholdPrice, + priceCondition: cond, + pricePair: _testData.pricePair + }); + Types.CommonExecutionData memory executionData = Types.CommonExecutionData({ + signRequestData: Types.SignRequestData({ + keyId: keyId, + analyzers: analyzers, + encryptionKey: encryptionKey, + spaceNonce: 0, + actionTimeoutHeight: 0, + expectedApproveExpression: "expectedApproveExpression", + expectedRejectExpression: "expectedRejectExpression" + }), + creatorDefinedTxFields: Types.CreatorDefinedTxFields({ + value: 0, + chainId: 11_155_111, + to: SEPOLIA_UNISWAP_V2_ROUTER, + data: data + }) + }); + bytes32 orderSalt = keccak256(abi.encodePacked(address(this), block.number, "ValidOrder")); + + CommonTypes.Coin[] memory maxKeychainFees; + + vm.expectEmit(true, false, false, false); + emit Registered(address(_testData.basicOrderFactory), address(this)); + + vm.expectEmit(true, true, false, false); + emit OrderCreated(address(this), OrderType.Basic, address(this)); + + address orderAddress = _testData.orderFactory.createOrder( + abi.encode(orderData), executionData, maxKeychainFees, OrderType.Basic, orderSalt + ); + + assertEq(address(_testData.basicOrderFactory), _testData.registry.executions(orderAddress)); + assertEq(address(this), _testData.orderFactory.orders(orderAddress)); + + _order = IExecution(orderAddress); + } + + function test_BasicOrder_StateBeforeExecution() public { + assert(!_order.canExecute()); + assert(!_order.isExecuted()); + } + + function test_basicOrderRevertWhenConditionNotMet() public { + assert(!_order.canExecute()); + assert(!_order.isExecuted()); + + vm.expectRevert(ConditionNotMet.selector); + _order.execute(1, 1, 1, 1, 1); + } + + function test_basicOrderRevertWhenUnauthorized() public { + vm.expectRevert(Unauthorized.selector); + vm.prank(address(0)); + _order.execute(1, 1, 1, 1, 1); + } + + function test_basicOrderRevertGetTxWhenNotExecuted() public { + vm.expectRevert(ExecutedError.selector); + _order.getTx(); + } + + function test_basicOrderExecuteWhenPriceMovesDown() public { + uint256 price = _testData.thresholdPrice - 1; + _testData.mockSlinkyPrecompile.setPrice(_testData.pricePair.base, _testData.pricePair.quote, price); + + assert(_order.canExecute()); + + vm.expectEmit(false, false, false, false); + emit Executed(); + + vm.expectEmit(true, true, false, false); + // solhint-disable-next-line + emit NewTx(address(_order), tx.origin, bytes32(0)); + + (bool executed, bytes32 txHash) = _order.execute(1, 1, 1, 1, 1); + // solhint-disable-next-line + assertEq(_testData.registry.transactions(tx.origin, txHash), _order.getTx()); + assert(executed); + + assert(_order.isExecuted()); + + vm.expectRevert(ExecutedError.selector); + _order.execute(1, 1, 1, 1, 1); + } + + function test_basicOrderExecuteWhenPriceMovesUp() public { + uint256 price = _testData.thresholdPrice + 1; + _testData.mockSlinkyPrecompile.setPrice(_testData.pricePair.base, _testData.pricePair.quote, price); + + assert(_order.canExecute()); + + vm.expectEmit(false, false, false, false); + emit Executed(); + + vm.expectEmit(true, true, false, false); + // solhint-disable-next-line + emit NewTx(address(_order), tx.origin, bytes32(0)); + + (bool executed, bytes32 txHash) = _order.execute(1, 1, 1, 1, 1); + // solhint-disable-next-line + assertEq(_testData.registry.transactions(tx.origin, txHash), _order.getTx()); + assert(executed); + + assert(_order.isExecuted()); + + vm.expectRevert(ExecutedError.selector); + _order.execute(1, 1, 1, 1, 1); + _txHash = txHash; + } + + function saveOrderData() public { + bytes[] memory analyzers; + bytes memory encryptionKey; + bytes memory data = getTestSwapData(); + Types.BasicOrderData memory orderData = Types.BasicOrderData({ + thresholdPrice: _testData.thresholdPrice, + priceCondition: Types.PriceCondition.LTE, + pricePair: _testData.pricePair + }); + + Types.CommonExecutionData memory executionData = Types.CommonExecutionData({ + signRequestData: Types.SignRequestData({ + keyId: _testData.goodKeyId, + analyzers: analyzers, + encryptionKey: encryptionKey, + spaceNonce: 0, + actionTimeoutHeight: 0, + expectedApproveExpression: "expectedApproveExpression", + expectedRejectExpression: "expectedRejectExpression" + }), + creatorDefinedTxFields: Types.CreatorDefinedTxFields({ + value: 0, + chainId: 11_155_111, + to: SEPOLIA_UNISWAP_V2_ROUTER, + data: data + }) + }); + + _orderData = orderData; + _executionData = executionData; + } + + function test_BasicOrderRevertWhenInvalidScheduler() public { + CommonTypes.Coin[] memory maxKeychainFees; + + vm.expectRevert(InvalidScheduler.selector); + + new BasicOrder(_orderData, _executionData, maxKeychainFees, address(0), address(_testData.registry)); + } + + function test_BasicOrderRevertWhenInvalidExpectedApproveExpression() public { + CommonTypes.Coin[] memory maxKeychainFees; + _executionData.signRequestData.expectedApproveExpression = ""; + vm.expectRevert(Create3.ErrorCreatingContract.selector); + + bytes32 orderSalt = keccak256(abi.encodePacked(address(this), block.number, "InvalidApproveExpression")); + _testData.orderFactory.createOrder( + abi.encode(_orderData), _executionData, maxKeychainFees, OrderType.Basic, orderSalt + ); + } + + function test_BasicOrderRevertWhenInvalidExpectedRejectExpression() public { + CommonTypes.Coin[] memory maxKeychainFees; + _executionData.signRequestData.expectedRejectExpression = ""; + vm.expectRevert(Create3.ErrorCreatingContract.selector); + + bytes32 orderSalt = keccak256(abi.encodePacked(address(this), block.number, "InvalidRejectExpression")); + _testData.orderFactory.createOrder( + abi.encode(_orderData), _executionData, maxKeychainFees, OrderType.Basic, orderSalt + ); + } + + function test_BasicOrderRevertWhenInvalidThresholdPrice() public { + CommonTypes.Coin[] memory maxKeychainFees; + _orderData.thresholdPrice = 0; + vm.expectRevert(Create3.ErrorCreatingContract.selector); + + bytes32 orderSalt = keccak256(abi.encodePacked(address(this), block.number, "InvalidThresholdPrice")); + _testData.orderFactory.createOrder( + abi.encode(_orderData), _executionData, maxKeychainFees, OrderType.Basic, orderSalt + ); + } + + function test_BasicOrderRevertWhenInvalidTxTo() public { + CommonTypes.Coin[] memory maxKeychainFees; + _executionData.creatorDefinedTxFields.to = address(0); + vm.expectRevert(Create3.ErrorCreatingContract.selector); + + bytes32 orderSalt = keccak256(abi.encodePacked(address(this), block.number, "InvalidTxTo")); + _testData.orderFactory.createOrder( + abi.encode(_orderData), _executionData, maxKeychainFees, OrderType.Basic, orderSalt + ); + } + + function test_FactoryConstructorRevertWhenInvalidRegistry() public { + vm.expectRevert(InvalidRegistryAddress.selector); + new OrderFactory(address(0), address(this), address(this), address(this), address(this)); + } + + function test_FactoryConstructorRevertWhenInvalidScheduler() public { + vm.expectRevert(InvalidSchedulerAddress.selector); + new OrderFactory(address(this), address(0), address(this), address(this), address(this)); + } + + function test_FactorySetScheduler() public { + OrderFactory factory = + new OrderFactory(address(this), address(this), address(this), address(this), address(this)); + + vm.expectEmit(true, true, false, false); + + emit SchedulerChanged(address(this), RECEIVER); + + factory.setScheduler(RECEIVER); + + assertEq(factory.scheduler(), RECEIVER); + } + + function test_FactoryRevertWhenSetSchedulerNotOwner() public { + OrderFactory factory = + new OrderFactory(address(this), address(this), address(this), address(this), address(this)); + + vm.expectRevert(abi.encodeWithSelector(OwnableUnauthorizedAccount.selector, RECEIVER)); + vm.prank(RECEIVER); + factory.setScheduler(RECEIVER); + + assertEq(factory.scheduler(), address(this)); + } + + function test_FactoryRevertWhenSetSchedulerInvalid() public { + OrderFactory factory = + new OrderFactory(address(this), address(this), address(this), address(this), address(this)); + + vm.expectRevert(InvalidSchedulerAddress.selector); + factory.setScheduler(address(0)); + + assertEq(factory.scheduler(), address(this)); + } + + function test_RegistryRevertWhenBadAddress() public { + vm.expectRevert(InvalidExecutionAddress.selector); + _testData.registry.register(address(0)); + } + + function test_RegistryRevertWhenAlreadyRegistered() public { + vm.expectRevert(ExecutionAlreadyRegistered.selector); + _testData.registry.register(address(_order)); + } + + function test_RegistryRevertAddTransactionWhenNotOrder() public { + vm.expectRevert(UnauthorizedToAddTx.selector); + // solhint-disable-next-line + _testData.registry.addTransaction(tx.origin, keccak256(bytes("test"))); + } + + function test_RegistryRevertAddTransactionWhenInvalidHash() public { + vm.expectRevert(InvalidHash.selector); + vm.prank(address(_order)); + // solhint-disable-next-line + _testData.registry.addTransaction(tx.origin, bytes32(0)); + } + + function test_RegistryRevertAddTransactionWhenAlreadyAdded() public { + vm.expectRevert(TxAlreadyAdded.selector); + vm.prank(address(_order)); + // solhint-disable-next-line + _testData.registry.addTransaction(tx.origin, _txHash); + } + + function test_RegistryRevertAddTransactionWhenNotExecuted() public { + vm.expectRevert(NotExecuted.selector); + vm.prank(address(_order)); + // solhint-disable-next-line + _testData.registry.addTransaction(tx.origin, keccak256(bytes("test"))); + } + + function test_RegistryRevertAddTransactionWhenBadCreatorAddress() public { + vm.expectRevert(BadCreatorAddress.selector); + vm.prank(address(_order)); + _testData.registry.addTransaction(address(0), keccak256(bytes("test"))); + } + + function test_computeOrderAddressMatchesCreateOrder() public { + bytes32 salt = keccak256(abi.encodePacked("unique_salt")); + + // Compute the expected order address + // solhint-disable-next-line + address computedAddress = _testData.orderFactory.computeOrderAddress(tx.origin, salt, OrderType.Basic); + + // Create the order + bytes memory orderData = abi.encode(_orderData); + Types.CommonExecutionData memory executionData = _executionData; + CommonTypes.Coin[] memory maxKeychainFees; + address orderAddress = + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + + // Assert that the computed address matches the deployed order address + assertEq(computedAddress, orderAddress, "Computed address does not match deployed order address"); + } + + function test_computeOrderAddressBeforeDeployment() public { + bytes32 salt = keccak256(abi.encodePacked("another_unique_salt")); + + // Ensure that the MockSlinkyPrecompile is set up properly + _testData.mockSlinkyPrecompile.setPrice( + _testData.pricePair.base, _testData.pricePair.quote, _testData.thresholdPrice + 1 + ); + + // Compute the expected order address before deployment + // solhint-disable-next-line + address computedAddress = _testData.orderFactory.computeOrderAddress(tx.origin, salt, OrderType.Basic); + + // Ensure that no contract is deployed at the computed address yet + assertEq(computedAddress.code.length, 0, "Order address should not be deployed yet"); + + // Create the order + bytes memory orderData = abi.encode(_orderData); + Types.CommonExecutionData memory executionData = _executionData; + CommonTypes.Coin[] memory maxKeychainFees; + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + + // Now, the contract should be deployed + assertEq(computedAddress.code.length > 0, true, "Order contract was not deployed at computed address"); + } + + function test_createOrderRevertsWithUsedSalt() public { + bytes32 salt = keccak256(abi.encodePacked("reused_salt")); + + // First creation should succeed + bytes memory orderData = abi.encode(_orderData); + Types.CommonExecutionData memory executionData = _executionData; + CommonTypes.Coin[] memory maxKeychainFees; + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + + // Expect revert when using the same salt again + vm.expectRevert(SaltAlreadyUsed.selector); + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + } + + function test_createOrderWithDifferentSenderCanUseSameSalt() public { + bytes32 salt = keccak256(abi.encodePacked("shared_salt")); + + // Create order with original sender + bytes memory orderData = abi.encode(_orderData); + Types.CommonExecutionData memory executionData = _executionData; + CommonTypes.Coin[] memory maxKeychainFees; + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + + // Change the caller to a different address + address newSender = address(0xBEEF); + vm.prank(address(this), newSender); + + // This should succeed because the salt is guarded by msg.sender + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + } + + function test_computeOrderAddressGuardedBySender() public { + bytes32 salt = keccak256(abi.encodePacked("guarded_salt")); + + // Compute order address with original sender + // solhint-disable-next-line + address computedAddressOriginal = _testData.orderFactory.computeOrderAddress(tx.origin, salt, OrderType.Basic); + + // Create order with original sender + bytes memory orderData = abi.encode(_orderData); + Types.CommonExecutionData memory executionData = _executionData; + CommonTypes.Coin[] memory maxKeychainFees; + address orderAddressOriginal = + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + + // Assert that the computed address matches the deployed address for original sender + assertEq( + computedAddressOriginal, + orderAddressOriginal, + "Computed address does not match deployed order address for original sender" + ); + + // Compute order address with a different sender + address differentSender = address(0xDEAD); + address computedAddressDifferent = + _testData.orderFactory.computeOrderAddress(differentSender, salt, OrderType.Basic); + + // Create order with different sender + vm.prank(address(this), differentSender); + address orderAddressDifferent = + _testData.orderFactory.createOrder(orderData, executionData, maxKeychainFees, OrderType.Basic, salt); + + // Assert that the computed address matches the deployed address for different sender + assertEq( + computedAddressDifferent, + orderAddressDifferent, + "Computed address does not match deployed order address for different sender" + ); + + // Ensure that the two order addresses are different + assertEq( + orderAddressOriginal == orderAddressDifferent, + false, + "Order addresses for different senders should not be the same" + ); + } + + function getTestSwapData() internal pure returns (bytes memory) { + // Encode Uniswap V2 swapExactTokensForTokens parameters + address[] memory path = new address[](2); + path[0] = SEPOLIA_WETH; + path[1] = SEPOLIA_TEST_TOKEN; + bytes4 functionSelector = + bytes4(keccak256(abi.encodePacked("swapExactETHForTokens(uint256,address[],address, uint256)"))); + return abi.encodeWithSelector( + functionSelector, + 1, // amountOutMin + path, + RECEIVER, + type(uint256).max // deadline + ); + } +} diff --git a/clone-agent/contracts/test/Create2.t.sol b/clone-agent/contracts/test/Create2.t.sol new file mode 100644 index 00000000..335ea0a2 --- /dev/null +++ b/clone-agent/contracts/test/Create2.t.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.8.25 <0.9.0; + +import { Test } from "forge-std/Test.sol"; +import { Create2 } from "../src/Create2.sol"; +import { Registry } from "../src/Registry.sol"; +import { OrderFactory } from "../src/OrderFactory.sol"; + +contract Create2Test is Test { + Create2 internal create2; + + function setUp() public { + create2 = new Create2(); + } + + function testDeterministicDeploy() public { + vm.deal(address(0x1), 100 ether); + + vm.startPrank(address(0x1)); + bytes32 salt = "12345"; + bytes32 wrongSalt = "123456"; + bytes memory creationCode = abi.encodePacked(type(Registry).creationCode); + + address computedAddress = create2.computeAddress(salt, keccak256(creationCode)); + address wrongComputedAddress = create2.computeAddress(wrongSalt, keccak256(creationCode)); + address deployedAddress = create2.deploy(salt, creationCode); + vm.stopPrank(); + + assertEq(computedAddress, deployedAddress); + assertNotEq(wrongComputedAddress, deployedAddress); + } + + function testDeterministicDeployWithConstructorArgs() public { + vm.deal(address(0x1), 100 ether); + + vm.startPrank(address(0x1)); + bytes32 salt = "12345"; + bytes memory creationCode = abi.encodePacked( + type(OrderFactory).creationCode, + abi.encode(address(0x2), address(0x3), address(0x4), address(0x6), address(0x7)) + ); + bytes memory wrongCreationCode = abi.encodePacked( + type(OrderFactory).creationCode, + abi.encode(address(0x5), address(0x3), address(0x4), address(0x6), address(0x7)) + ); + + address computedAddress = create2.computeAddress(salt, keccak256(creationCode)); + address wrongComputedAddress = create2.computeAddress(salt, keccak256(wrongCreationCode)); + address deployedAddress = create2.deploy(salt, creationCode); + vm.stopPrank(); + + assertEq(computedAddress, deployedAddress); + assertNotEq(wrongComputedAddress, deployedAddress); + } +} diff --git a/clone-agent/contracts/yarn.lock b/clone-agent/contracts/yarn.lock new file mode 100644 index 00000000..9d79cd2a --- /dev/null +++ b/clone-agent/contracts/yarn.lock @@ -0,0 +1,445 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@0xsequence/create3@https://github.com/0xsequence/create3#acc4703a21ec1d71dc2a99db088c4b1f467530fd": + version "3.0.0" + resolved "https://github.com/0xsequence/create3#acc4703a21ec1d71dc2a99db088c4b1f467530fd" + dependencies: + csv-writer "^1.6.0" + +"@babel/code-frame@^7.0.0": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@openzeppelin/contracts@^5.0.1": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.2.0.tgz#bd020694218202b811b0ea3eec07277814c658da" + integrity sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA== + +"@solidity-parser/parser@^0.16.0": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.2.tgz#42cb1e3d88b3e8029b0c9befff00b634cd92d2fa" + integrity sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +antlr4@^4.11.0: + version "4.13.2" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.2.tgz#0d084ad0e32620482a9c3a0e2470c02e72e4006d" + integrity sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg== + +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +ast-parents@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +cosmiconfig@^8.0.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +csv-writer@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/csv-writer/-/csv-writer-1.6.0.tgz#d0cea44b6b4d7d3baa2ecc6f3f7209233514bcf9" + integrity sha512-NOx7YDFWEsM/fTRAJjRpPp8t+MKRVvniAg9wQlUKx20MFrPs73WLJhFf5iteqrxNYnsy924K3Iroh3yNHeYd2g== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + +"forge-std@github:foundry-rs/forge-std#v1.8.1": + version "1.7.6" + resolved "https://codeload.github.com/foundry-rs/forge-std/tar.gz/bb4ceea94d6f10eeb5b41dc2391c6c8bf8e734ef" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +ignore@^5.2.4: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prettier@^3.0.0: + version "3.4.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +semver@^7.5.2: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +solhint@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.6.2.tgz#2b2acbec8fdc37b2c68206a71ba89c7f519943fe" + integrity sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== + dependencies: + "@solidity-parser/parser" "^0.16.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^7.5.2" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" + optionalDependencies: + prettier "^2.8.3" + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^6.8.1: + version "6.9.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" + integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== diff --git a/clone-agent/eigen-layer/.gitignore b/clone-agent/eigen-layer/.gitignore new file mode 100644 index 00000000..0d96719c --- /dev/null +++ b/clone-agent/eigen-layer/.gitignore @@ -0,0 +1,3 @@ +.env +.Set_Syncer/node_modules +.*/node_modules \ No newline at end of file diff --git a/clone-agent/eigen-layer/.othentic/state.output.json b/clone-agent/eigen-layer/.othentic/state.output.json new file mode 100644 index 00000000..59ddddf1 --- /dev/null +++ b/clone-agent/eigen-layer/.othentic/state.output.json @@ -0,0 +1,18 @@ +{ + "L1": { + "L1MessageHandler": "0x4F590bf5E33E3ca4D748cc02dF54C443D053d646", + "L1AvsTreasury": "0xB590E21C7A2403D7C0FdB6646D8c7F9E3Cf10AD8", + "AvsGovernance": "0x607e94314ca0f2D0e8ef863A7443123055134aA5", + "ERC20": "0x94373a4919B3240D86eA41593D5eBa789FEF3848" + }, + "L2": { + "OBLS": "0x60b4501cD8Fba2184C1A5818826c9a3a4454B24f", + "L2MessageHandler": "0x2BeefC5110fF867f1acA5c43935B080d28e202f8", + "AttestationCenter": "0x9f9Ec7fB3bEcB4B38075fa8C46d62aD8e7B17C79", + "L2AvsTreasury": "0x40dC1a899F4652f331378aA0D67eD46e7d1ED9f3", + "ERC20": "0x94373a4919B3240D86eA41593D5eBa789FEF3848", + "l2Rewards": false, + "InternalTaskHandler": "0x423449CE771050324286b5D90C305b00aa7B0Caa" + }, + "timestamp": "2025-02-07T12:30:50.213Z" +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/Dockerfile b/clone-agent/eigen-layer/Dockerfile new file mode 100644 index 00000000..d8b30d75 --- /dev/null +++ b/clone-agent/eigen-layer/Dockerfile @@ -0,0 +1,9 @@ +FROM node:22.6 + +RUN npm install -g npm@10.5.0 + +WORKDIR /app + +RUN npm i -g @othentic/othentic-cli + +ENTRYPOINT [ "othentic-cli" ] diff --git a/clone-agent/eigen-layer/Execution_Service/.dockerignore b/clone-agent/eigen-layer/Execution_Service/.dockerignore new file mode 100644 index 00000000..19bfecc3 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/.env.example b/clone-agent/eigen-layer/Execution_Service/.env.example new file mode 100644 index 00000000..64637371 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/.env.example @@ -0,0 +1,6 @@ +OTHENTIC_CLIENT_RPC_ADDRESS= +PRIVATE_KEY= + +ATTESTATION_CENTER_ADDRESS= +OTHENTIC_REGISTRY_ADDRESS= +AVS_GOVERNANCE_ADDRESS= \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/.gitignore b/clone-agent/eigen-layer/Execution_Service/.gitignore new file mode 100644 index 00000000..5ff01ca3 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/.gitignore @@ -0,0 +1,3 @@ +.env +node_modules/* +node_modules/ \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/Dockerfile b/clone-agent/eigen-layer/Execution_Service/Dockerfile new file mode 100644 index 00000000..46a04f28 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22.6 + +# Create app directory +WORKDIR /usr/src/app + +# Install app dependencies +# A wildcard is used to ensure both package.json AND package-lock.json are copied +# where available (npm@5+) +COPY package*.json ./ + +RUN npm install +# If you are building your code for production +# RUN npm ci --only=production + +# Bundle app source +COPY . . + +EXPOSE 8080 +CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/configs/app.config.js b/clone-agent/eigen-layer/Execution_Service/configs/app.config.js new file mode 100644 index 00000000..7e60f2c8 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/configs/app.config.js @@ -0,0 +1,15 @@ +"use strict"; +const env = require("dotenv") +env.config() +const express = require("express") +const app = express() +const path = require("path") +const taskController = require("../src/task.controller") +const cors = require('cors') + + +app.use(express.json()) +app.use(cors()) +app.use("/task", taskController) + +module.exports = app \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_grpc_pb.js b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_grpc_pb.js new file mode 100644 index 00000000..97b3a246 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_pb.d.ts b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_pb.d.ts new file mode 100644 index 00000000..9ca2bd0a --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_pb.d.ts @@ -0,0 +1,34 @@ +// package: common +// file: common/common.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; + +export class G1Commitment extends jspb.Message { + getX(): Uint8Array | string; + getX_asU8(): Uint8Array; + getX_asB64(): string; + setX(value: Uint8Array | string): G1Commitment; + getY(): Uint8Array | string; + getY_asU8(): Uint8Array; + getY_asB64(): string; + setY(value: Uint8Array | string): G1Commitment; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): G1Commitment.AsObject; + static toObject(includeInstance: boolean, msg: G1Commitment): G1Commitment.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: G1Commitment, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): G1Commitment; + static deserializeBinaryFromReader(message: G1Commitment, reader: jspb.BinaryReader): G1Commitment; +} + +export namespace G1Commitment { + export type AsObject = { + x: Uint8Array | string, + y: Uint8Array | string, + } +} diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_pb.js b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_pb.js new file mode 100644 index 00000000..3dcd7210 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/common/common_pb.js @@ -0,0 +1,254 @@ +// source: common/common.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); + +goog.exportSymbol('proto.common.G1Commitment', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.common.G1Commitment = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.common.G1Commitment, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.common.G1Commitment.displayName = 'proto.common.G1Commitment'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.common.G1Commitment.prototype.toObject = function(opt_includeInstance) { + return proto.common.G1Commitment.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.common.G1Commitment} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.common.G1Commitment.toObject = function(includeInstance, msg) { + var f, obj = { + x: msg.getX_asB64(), + y: msg.getY_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.common.G1Commitment} + */ +proto.common.G1Commitment.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.common.G1Commitment; + return proto.common.G1Commitment.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.common.G1Commitment} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.common.G1Commitment} + */ +proto.common.G1Commitment.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setX(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setY(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.common.G1Commitment.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.common.G1Commitment.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.common.G1Commitment} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.common.G1Commitment.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getX_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getY_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional bytes x = 1; + * @return {!(string|Uint8Array)} + */ +proto.common.G1Commitment.prototype.getX = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes x = 1; + * This is a type-conversion wrapper around `getX()` + * @return {string} + */ +proto.common.G1Commitment.prototype.getX_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getX())); +}; + + +/** + * optional bytes x = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getX()` + * @return {!Uint8Array} + */ +proto.common.G1Commitment.prototype.getX_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getX())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.common.G1Commitment} returns this + */ +proto.common.G1Commitment.prototype.setX = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes y = 2; + * @return {!(string|Uint8Array)} + */ +proto.common.G1Commitment.prototype.getY = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes y = 2; + * This is a type-conversion wrapper around `getY()` + * @return {string} + */ +proto.common.G1Commitment.prototype.getY_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getY())); +}; + + +/** + * optional bytes y = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getY()` + * @return {!Uint8Array} + */ +proto.common.G1Commitment.prototype.getY_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getY())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.common.G1Commitment} returns this + */ +proto.common.G1Commitment.prototype.setY = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +goog.object.extend(exports, proto.common); diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_grpc_pb.d.ts b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_grpc_pb.d.ts new file mode 100644 index 00000000..16e0accd --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_grpc_pb.d.ts @@ -0,0 +1,92 @@ +// package: disperser +// file: disperser/disperser.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as grpc from "grpc"; +import * as disperser_disperser_pb from "../disperser/disperser_pb"; +import * as common_common_pb from "../common/common_pb"; + +interface IDisperserService extends grpc.ServiceDefinition { + disperseBlob: IDisperserService_IDisperseBlob; + disperseBlobAuthenticated: IDisperserService_IDisperseBlobAuthenticated; + getBlobStatus: IDisperserService_IGetBlobStatus; + retrieveBlob: IDisperserService_IRetrieveBlob; +} + +interface IDisperserService_IDisperseBlob extends grpc.MethodDefinition { + path: "/disperser.Disperser/DisperseBlob"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} +interface IDisperserService_IDisperseBlobAuthenticated extends grpc.MethodDefinition { + path: "/disperser.Disperser/DisperseBlobAuthenticated"; + requestStream: true; + responseStream: true; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} +interface IDisperserService_IGetBlobStatus extends grpc.MethodDefinition { + path: "/disperser.Disperser/GetBlobStatus"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} +interface IDisperserService_IRetrieveBlob extends grpc.MethodDefinition { + path: "/disperser.Disperser/RetrieveBlob"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} + +export const DisperserService: IDisperserService; + +export interface IDisperserServer { + disperseBlob: grpc.handleUnaryCall; + disperseBlobAuthenticated: grpc.handleBidiStreamingCall; + getBlobStatus: grpc.handleUnaryCall; + retrieveBlob: grpc.handleUnaryCall; +} + +export interface IDisperserClient { + disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + disperseBlobAuthenticated(): grpc.ClientDuplexStream; + disperseBlobAuthenticated(options: Partial): grpc.ClientDuplexStream; + disperseBlobAuthenticated(metadata: grpc.Metadata, options?: Partial): grpc.ClientDuplexStream; + getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; +} + +export class DisperserClient extends grpc.Client implements IDisperserClient { + constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); + public disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + public disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + public disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + public disperseBlobAuthenticated(options?: Partial): grpc.ClientDuplexStream; + public disperseBlobAuthenticated(metadata?: grpc.Metadata, options?: Partial): grpc.ClientDuplexStream; + public getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + public getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + public getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + public retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + public retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + public retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; +} diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_grpc_pb.js b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_grpc_pb.js new file mode 100644 index 00000000..cdc2a5ee --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_grpc_pb.js @@ -0,0 +1,164 @@ +// GENERATED CODE -- DO NOT EDIT! + +'use strict'; +var grpc = require('@grpc/grpc-js'); +var disperser_disperser_pb = require('../disperser/disperser_pb.js'); +var common_common_pb = require('../common/common_pb.js'); + +function serialize_disperser_AuthenticatedReply(arg) { + if (!(arg instanceof disperser_disperser_pb.AuthenticatedReply)) { + throw new Error('Expected argument of type disperser.AuthenticatedReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_AuthenticatedReply(buffer_arg) { + return disperser_disperser_pb.AuthenticatedReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_AuthenticatedRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.AuthenticatedRequest)) { + throw new Error('Expected argument of type disperser.AuthenticatedRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_AuthenticatedRequest(buffer_arg) { + return disperser_disperser_pb.AuthenticatedRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_BlobStatusReply(arg) { + if (!(arg instanceof disperser_disperser_pb.BlobStatusReply)) { + throw new Error('Expected argument of type disperser.BlobStatusReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_BlobStatusReply(buffer_arg) { + return disperser_disperser_pb.BlobStatusReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_BlobStatusRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.BlobStatusRequest)) { + throw new Error('Expected argument of type disperser.BlobStatusRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_BlobStatusRequest(buffer_arg) { + return disperser_disperser_pb.BlobStatusRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_DisperseBlobReply(arg) { + if (!(arg instanceof disperser_disperser_pb.DisperseBlobReply)) { + throw new Error('Expected argument of type disperser.DisperseBlobReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_DisperseBlobReply(buffer_arg) { + return disperser_disperser_pb.DisperseBlobReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_DisperseBlobRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.DisperseBlobRequest)) { + throw new Error('Expected argument of type disperser.DisperseBlobRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_DisperseBlobRequest(buffer_arg) { + return disperser_disperser_pb.DisperseBlobRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_RetrieveBlobReply(arg) { + if (!(arg instanceof disperser_disperser_pb.RetrieveBlobReply)) { + throw new Error('Expected argument of type disperser.RetrieveBlobReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_RetrieveBlobReply(buffer_arg) { + return disperser_disperser_pb.RetrieveBlobReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_RetrieveBlobRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.RetrieveBlobRequest)) { + throw new Error('Expected argument of type disperser.RetrieveBlobRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_RetrieveBlobRequest(buffer_arg) { + return disperser_disperser_pb.RetrieveBlobRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + + +// Disperser defines the public APIs for dispersing blobs. +var DisperserService = exports.DisperserService = { + // This API accepts blob to disperse from clients. + // This executes the dispersal async, i.e. it returns once the request + // is accepted. The client could use GetBlobStatus() API to poll the the + // processing status of the blob. + disperseBlob: { + path: '/disperser.Disperser/DisperseBlob', + requestStream: false, + responseStream: false, + requestType: disperser_disperser_pb.DisperseBlobRequest, + responseType: disperser_disperser_pb.DisperseBlobReply, + requestSerialize: serialize_disperser_DisperseBlobRequest, + requestDeserialize: deserialize_disperser_DisperseBlobRequest, + responseSerialize: serialize_disperser_DisperseBlobReply, + responseDeserialize: deserialize_disperser_DisperseBlobReply, + }, + // DisperseBlobAuthenticated is similar to DisperseBlob, except that it requires the + // client to authenticate itself via the AuthenticationData message. The protoco is as follows: + // 1. The client sends a DisperseBlobAuthenticated request with the DisperseBlobRequest message + // 2. The Disperser sends back a BlobAuthHeader message containing information for the client to + // verify and sign. + // 3. The client verifies the BlobAuthHeader and sends back the signed BlobAuthHeader in an + // AuthenticationData message. + // 4. The Disperser verifies the signature and returns a DisperseBlobReply message. + disperseBlobAuthenticated: { + path: '/disperser.Disperser/DisperseBlobAuthenticated', + requestStream: true, + responseStream: true, + requestType: disperser_disperser_pb.AuthenticatedRequest, + responseType: disperser_disperser_pb.AuthenticatedReply, + requestSerialize: serialize_disperser_AuthenticatedRequest, + requestDeserialize: deserialize_disperser_AuthenticatedRequest, + responseSerialize: serialize_disperser_AuthenticatedReply, + responseDeserialize: deserialize_disperser_AuthenticatedReply, + }, + // This API is meant to be polled for the blob status. + getBlobStatus: { + path: '/disperser.Disperser/GetBlobStatus', + requestStream: false, + responseStream: false, + requestType: disperser_disperser_pb.BlobStatusRequest, + responseType: disperser_disperser_pb.BlobStatusReply, + requestSerialize: serialize_disperser_BlobStatusRequest, + requestDeserialize: deserialize_disperser_BlobStatusRequest, + responseSerialize: serialize_disperser_BlobStatusReply, + responseDeserialize: deserialize_disperser_BlobStatusReply, + }, + // This retrieves the requested blob from the Disperser's backend. + // This is a more efficient way to retrieve blobs than directly retrieving + // from the DA Nodes (see detail about this approach in + // api/proto/retriever/retriever.proto). + // The blob should have been initially dispersed via this Disperser service + // for this API to work. + retrieveBlob: { + path: '/disperser.Disperser/RetrieveBlob', + requestStream: false, + responseStream: false, + requestType: disperser_disperser_pb.RetrieveBlobRequest, + responseType: disperser_disperser_pb.RetrieveBlobReply, + requestSerialize: serialize_disperser_RetrieveBlobRequest, + requestDeserialize: deserialize_disperser_RetrieveBlobRequest, + responseSerialize: serialize_disperser_RetrieveBlobReply, + responseDeserialize: deserialize_disperser_RetrieveBlobReply, + }, +}; + +exports.DisperserClient = grpc.makeGenericClientConstructor(DisperserService); diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_pb.d.ts b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_pb.d.ts new file mode 100644 index 00000000..b0fe87d9 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_pb.d.ts @@ -0,0 +1,490 @@ +// package: disperser +// file: disperser/disperser.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; +import * as common_common_pb from "../common/common_pb"; + +export class AuthenticatedRequest extends jspb.Message { + + hasDisperseRequest(): boolean; + clearDisperseRequest(): void; + getDisperseRequest(): DisperseBlobRequest | undefined; + setDisperseRequest(value?: DisperseBlobRequest): AuthenticatedRequest; + + hasAuthenticationData(): boolean; + clearAuthenticationData(): void; + getAuthenticationData(): AuthenticationData | undefined; + setAuthenticationData(value?: AuthenticationData): AuthenticatedRequest; + + getPayloadCase(): AuthenticatedRequest.PayloadCase; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AuthenticatedRequest.AsObject; + static toObject(includeInstance: boolean, msg: AuthenticatedRequest): AuthenticatedRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AuthenticatedRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AuthenticatedRequest; + static deserializeBinaryFromReader(message: AuthenticatedRequest, reader: jspb.BinaryReader): AuthenticatedRequest; +} + +export namespace AuthenticatedRequest { + export type AsObject = { + disperseRequest?: DisperseBlobRequest.AsObject, + authenticationData?: AuthenticationData.AsObject, + } + + export enum PayloadCase { + PAYLOAD_NOT_SET = 0, + DISPERSE_REQUEST = 1, + AUTHENTICATION_DATA = 2, + } + +} + +export class AuthenticatedReply extends jspb.Message { + + hasBlobAuthHeader(): boolean; + clearBlobAuthHeader(): void; + getBlobAuthHeader(): BlobAuthHeader | undefined; + setBlobAuthHeader(value?: BlobAuthHeader): AuthenticatedReply; + + hasDisperseReply(): boolean; + clearDisperseReply(): void; + getDisperseReply(): DisperseBlobReply | undefined; + setDisperseReply(value?: DisperseBlobReply): AuthenticatedReply; + + getPayloadCase(): AuthenticatedReply.PayloadCase; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AuthenticatedReply.AsObject; + static toObject(includeInstance: boolean, msg: AuthenticatedReply): AuthenticatedReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AuthenticatedReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AuthenticatedReply; + static deserializeBinaryFromReader(message: AuthenticatedReply, reader: jspb.BinaryReader): AuthenticatedReply; +} + +export namespace AuthenticatedReply { + export type AsObject = { + blobAuthHeader?: BlobAuthHeader.AsObject, + disperseReply?: DisperseBlobReply.AsObject, + } + + export enum PayloadCase { + PAYLOAD_NOT_SET = 0, + BLOB_AUTH_HEADER = 1, + DISPERSE_REPLY = 2, + } + +} + +export class BlobAuthHeader extends jspb.Message { + getChallengeParameter(): number; + setChallengeParameter(value: number): BlobAuthHeader; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobAuthHeader.AsObject; + static toObject(includeInstance: boolean, msg: BlobAuthHeader): BlobAuthHeader.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobAuthHeader, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobAuthHeader; + static deserializeBinaryFromReader(message: BlobAuthHeader, reader: jspb.BinaryReader): BlobAuthHeader; +} + +export namespace BlobAuthHeader { + export type AsObject = { + challengeParameter: number, + } +} + +export class AuthenticationData extends jspb.Message { + getAuthenticationData(): Uint8Array | string; + getAuthenticationData_asU8(): Uint8Array; + getAuthenticationData_asB64(): string; + setAuthenticationData(value: Uint8Array | string): AuthenticationData; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AuthenticationData.AsObject; + static toObject(includeInstance: boolean, msg: AuthenticationData): AuthenticationData.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AuthenticationData, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AuthenticationData; + static deserializeBinaryFromReader(message: AuthenticationData, reader: jspb.BinaryReader): AuthenticationData; +} + +export namespace AuthenticationData { + export type AsObject = { + authenticationData: Uint8Array | string, + } +} + +export class DisperseBlobRequest extends jspb.Message { + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): DisperseBlobRequest; + clearCustomQuorumNumbersList(): void; + getCustomQuorumNumbersList(): Array; + setCustomQuorumNumbersList(value: Array): DisperseBlobRequest; + addCustomQuorumNumbers(value: number, index?: number): number; + getAccountId(): string; + setAccountId(value: string): DisperseBlobRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DisperseBlobRequest.AsObject; + static toObject(includeInstance: boolean, msg: DisperseBlobRequest): DisperseBlobRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DisperseBlobRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DisperseBlobRequest; + static deserializeBinaryFromReader(message: DisperseBlobRequest, reader: jspb.BinaryReader): DisperseBlobRequest; +} + +export namespace DisperseBlobRequest { + export type AsObject = { + data: Uint8Array | string, + customQuorumNumbersList: Array, + accountId: string, + } +} + +export class DisperseBlobReply extends jspb.Message { + getResult(): BlobStatus; + setResult(value: BlobStatus): DisperseBlobReply; + getRequestId(): Uint8Array | string; + getRequestId_asU8(): Uint8Array; + getRequestId_asB64(): string; + setRequestId(value: Uint8Array | string): DisperseBlobReply; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DisperseBlobReply.AsObject; + static toObject(includeInstance: boolean, msg: DisperseBlobReply): DisperseBlobReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DisperseBlobReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DisperseBlobReply; + static deserializeBinaryFromReader(message: DisperseBlobReply, reader: jspb.BinaryReader): DisperseBlobReply; +} + +export namespace DisperseBlobReply { + export type AsObject = { + result: BlobStatus, + requestId: Uint8Array | string, + } +} + +export class BlobStatusRequest extends jspb.Message { + getRequestId(): Uint8Array | string; + getRequestId_asU8(): Uint8Array; + getRequestId_asB64(): string; + setRequestId(value: Uint8Array | string): BlobStatusRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobStatusRequest.AsObject; + static toObject(includeInstance: boolean, msg: BlobStatusRequest): BlobStatusRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobStatusRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobStatusRequest; + static deserializeBinaryFromReader(message: BlobStatusRequest, reader: jspb.BinaryReader): BlobStatusRequest; +} + +export namespace BlobStatusRequest { + export type AsObject = { + requestId: Uint8Array | string, + } +} + +export class BlobStatusReply extends jspb.Message { + getStatus(): BlobStatus; + setStatus(value: BlobStatus): BlobStatusReply; + + hasInfo(): boolean; + clearInfo(): void; + getInfo(): BlobInfo | undefined; + setInfo(value?: BlobInfo): BlobStatusReply; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobStatusReply.AsObject; + static toObject(includeInstance: boolean, msg: BlobStatusReply): BlobStatusReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobStatusReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobStatusReply; + static deserializeBinaryFromReader(message: BlobStatusReply, reader: jspb.BinaryReader): BlobStatusReply; +} + +export namespace BlobStatusReply { + export type AsObject = { + status: BlobStatus, + info?: BlobInfo.AsObject, + } +} + +export class RetrieveBlobRequest extends jspb.Message { + getBatchHeaderHash(): Uint8Array | string; + getBatchHeaderHash_asU8(): Uint8Array; + getBatchHeaderHash_asB64(): string; + setBatchHeaderHash(value: Uint8Array | string): RetrieveBlobRequest; + getBlobIndex(): number; + setBlobIndex(value: number): RetrieveBlobRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): RetrieveBlobRequest.AsObject; + static toObject(includeInstance: boolean, msg: RetrieveBlobRequest): RetrieveBlobRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: RetrieveBlobRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): RetrieveBlobRequest; + static deserializeBinaryFromReader(message: RetrieveBlobRequest, reader: jspb.BinaryReader): RetrieveBlobRequest; +} + +export namespace RetrieveBlobRequest { + export type AsObject = { + batchHeaderHash: Uint8Array | string, + blobIndex: number, + } +} + +export class RetrieveBlobReply extends jspb.Message { + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): RetrieveBlobReply; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): RetrieveBlobReply.AsObject; + static toObject(includeInstance: boolean, msg: RetrieveBlobReply): RetrieveBlobReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: RetrieveBlobReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): RetrieveBlobReply; + static deserializeBinaryFromReader(message: RetrieveBlobReply, reader: jspb.BinaryReader): RetrieveBlobReply; +} + +export namespace RetrieveBlobReply { + export type AsObject = { + data: Uint8Array | string, + } +} + +export class BlobInfo extends jspb.Message { + + hasBlobHeader(): boolean; + clearBlobHeader(): void; + getBlobHeader(): BlobHeader | undefined; + setBlobHeader(value?: BlobHeader): BlobInfo; + + hasBlobVerificationProof(): boolean; + clearBlobVerificationProof(): void; + getBlobVerificationProof(): BlobVerificationProof | undefined; + setBlobVerificationProof(value?: BlobVerificationProof): BlobInfo; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobInfo.AsObject; + static toObject(includeInstance: boolean, msg: BlobInfo): BlobInfo.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobInfo, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobInfo; + static deserializeBinaryFromReader(message: BlobInfo, reader: jspb.BinaryReader): BlobInfo; +} + +export namespace BlobInfo { + export type AsObject = { + blobHeader?: BlobHeader.AsObject, + blobVerificationProof?: BlobVerificationProof.AsObject, + } +} + +export class BlobHeader extends jspb.Message { + + hasCommitment(): boolean; + clearCommitment(): void; + getCommitment(): common_common_pb.G1Commitment | undefined; + setCommitment(value?: common_common_pb.G1Commitment): BlobHeader; + getDataLength(): number; + setDataLength(value: number): BlobHeader; + clearBlobQuorumParamsList(): void; + getBlobQuorumParamsList(): Array; + setBlobQuorumParamsList(value: Array): BlobHeader; + addBlobQuorumParams(value?: BlobQuorumParam, index?: number): BlobQuorumParam; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobHeader.AsObject; + static toObject(includeInstance: boolean, msg: BlobHeader): BlobHeader.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobHeader, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobHeader; + static deserializeBinaryFromReader(message: BlobHeader, reader: jspb.BinaryReader): BlobHeader; +} + +export namespace BlobHeader { + export type AsObject = { + commitment?: common_common_pb.G1Commitment.AsObject, + dataLength: number, + blobQuorumParamsList: Array, + } +} + +export class BlobQuorumParam extends jspb.Message { + getQuorumNumber(): number; + setQuorumNumber(value: number): BlobQuorumParam; + getAdversaryThresholdPercentage(): number; + setAdversaryThresholdPercentage(value: number): BlobQuorumParam; + getConfirmationThresholdPercentage(): number; + setConfirmationThresholdPercentage(value: number): BlobQuorumParam; + getChunkLength(): number; + setChunkLength(value: number): BlobQuorumParam; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobQuorumParam.AsObject; + static toObject(includeInstance: boolean, msg: BlobQuorumParam): BlobQuorumParam.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobQuorumParam, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobQuorumParam; + static deserializeBinaryFromReader(message: BlobQuorumParam, reader: jspb.BinaryReader): BlobQuorumParam; +} + +export namespace BlobQuorumParam { + export type AsObject = { + quorumNumber: number, + adversaryThresholdPercentage: number, + confirmationThresholdPercentage: number, + chunkLength: number, + } +} + +export class BlobVerificationProof extends jspb.Message { + getBatchId(): number; + setBatchId(value: number): BlobVerificationProof; + getBlobIndex(): number; + setBlobIndex(value: number): BlobVerificationProof; + + hasBatchMetadata(): boolean; + clearBatchMetadata(): void; + getBatchMetadata(): BatchMetadata | undefined; + setBatchMetadata(value?: BatchMetadata): BlobVerificationProof; + getInclusionProof(): Uint8Array | string; + getInclusionProof_asU8(): Uint8Array; + getInclusionProof_asB64(): string; + setInclusionProof(value: Uint8Array | string): BlobVerificationProof; + getQuorumIndexes(): Uint8Array | string; + getQuorumIndexes_asU8(): Uint8Array; + getQuorumIndexes_asB64(): string; + setQuorumIndexes(value: Uint8Array | string): BlobVerificationProof; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobVerificationProof.AsObject; + static toObject(includeInstance: boolean, msg: BlobVerificationProof): BlobVerificationProof.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobVerificationProof, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobVerificationProof; + static deserializeBinaryFromReader(message: BlobVerificationProof, reader: jspb.BinaryReader): BlobVerificationProof; +} + +export namespace BlobVerificationProof { + export type AsObject = { + batchId: number, + blobIndex: number, + batchMetadata?: BatchMetadata.AsObject, + inclusionProof: Uint8Array | string, + quorumIndexes: Uint8Array | string, + } +} + +export class BatchMetadata extends jspb.Message { + + hasBatchHeader(): boolean; + clearBatchHeader(): void; + getBatchHeader(): BatchHeader | undefined; + setBatchHeader(value?: BatchHeader): BatchMetadata; + getSignatoryRecordHash(): Uint8Array | string; + getSignatoryRecordHash_asU8(): Uint8Array; + getSignatoryRecordHash_asB64(): string; + setSignatoryRecordHash(value: Uint8Array | string): BatchMetadata; + getFee(): Uint8Array | string; + getFee_asU8(): Uint8Array; + getFee_asB64(): string; + setFee(value: Uint8Array | string): BatchMetadata; + getConfirmationBlockNumber(): number; + setConfirmationBlockNumber(value: number): BatchMetadata; + getBatchHeaderHash(): Uint8Array | string; + getBatchHeaderHash_asU8(): Uint8Array; + getBatchHeaderHash_asB64(): string; + setBatchHeaderHash(value: Uint8Array | string): BatchMetadata; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BatchMetadata.AsObject; + static toObject(includeInstance: boolean, msg: BatchMetadata): BatchMetadata.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BatchMetadata, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BatchMetadata; + static deserializeBinaryFromReader(message: BatchMetadata, reader: jspb.BinaryReader): BatchMetadata; +} + +export namespace BatchMetadata { + export type AsObject = { + batchHeader?: BatchHeader.AsObject, + signatoryRecordHash: Uint8Array | string, + fee: Uint8Array | string, + confirmationBlockNumber: number, + batchHeaderHash: Uint8Array | string, + } +} + +export class BatchHeader extends jspb.Message { + getBatchRoot(): Uint8Array | string; + getBatchRoot_asU8(): Uint8Array; + getBatchRoot_asB64(): string; + setBatchRoot(value: Uint8Array | string): BatchHeader; + getQuorumNumbers(): Uint8Array | string; + getQuorumNumbers_asU8(): Uint8Array; + getQuorumNumbers_asB64(): string; + setQuorumNumbers(value: Uint8Array | string): BatchHeader; + getQuorumSignedPercentages(): Uint8Array | string; + getQuorumSignedPercentages_asU8(): Uint8Array; + getQuorumSignedPercentages_asB64(): string; + setQuorumSignedPercentages(value: Uint8Array | string): BatchHeader; + getReferenceBlockNumber(): number; + setReferenceBlockNumber(value: number): BatchHeader; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BatchHeader.AsObject; + static toObject(includeInstance: boolean, msg: BatchHeader): BatchHeader.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BatchHeader, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BatchHeader; + static deserializeBinaryFromReader(message: BatchHeader, reader: jspb.BinaryReader): BatchHeader; +} + +export namespace BatchHeader { + export type AsObject = { + batchRoot: Uint8Array | string, + quorumNumbers: Uint8Array | string, + quorumSignedPercentages: Uint8Array | string, + referenceBlockNumber: number, + } +} + +export enum BlobStatus { + UNKNOWN = 0, + PROCESSING = 1, + CONFIRMED = 2, + FAILED = 3, + FINALIZED = 4, + INSUFFICIENT_SIGNATURES = 5, + DISPERSING = 6, +} diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_pb.js b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_pb.js new file mode 100644 index 00000000..3bf5ea3f --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/bindings/disperser/disperser_pb.js @@ -0,0 +1,3850 @@ +// source: disperser/disperser.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); + +var common_common_pb = require('../common/common_pb.js'); +goog.object.extend(proto, common_common_pb); +goog.exportSymbol('proto.disperser.AuthenticatedReply', null, global); +goog.exportSymbol('proto.disperser.AuthenticatedReply.PayloadCase', null, global); +goog.exportSymbol('proto.disperser.AuthenticatedRequest', null, global); +goog.exportSymbol('proto.disperser.AuthenticatedRequest.PayloadCase', null, global); +goog.exportSymbol('proto.disperser.AuthenticationData', null, global); +goog.exportSymbol('proto.disperser.BatchHeader', null, global); +goog.exportSymbol('proto.disperser.BatchMetadata', null, global); +goog.exportSymbol('proto.disperser.BlobAuthHeader', null, global); +goog.exportSymbol('proto.disperser.BlobHeader', null, global); +goog.exportSymbol('proto.disperser.BlobInfo', null, global); +goog.exportSymbol('proto.disperser.BlobQuorumParam', null, global); +goog.exportSymbol('proto.disperser.BlobStatus', null, global); +goog.exportSymbol('proto.disperser.BlobStatusReply', null, global); +goog.exportSymbol('proto.disperser.BlobStatusRequest', null, global); +goog.exportSymbol('proto.disperser.BlobVerificationProof', null, global); +goog.exportSymbol('proto.disperser.DisperseBlobReply', null, global); +goog.exportSymbol('proto.disperser.DisperseBlobRequest', null, global); +goog.exportSymbol('proto.disperser.RetrieveBlobReply', null, global); +goog.exportSymbol('proto.disperser.RetrieveBlobRequest', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.AuthenticatedRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.disperser.AuthenticatedRequest.oneofGroups_); +}; +goog.inherits(proto.disperser.AuthenticatedRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.AuthenticatedRequest.displayName = 'proto.disperser.AuthenticatedRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.AuthenticatedReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.disperser.AuthenticatedReply.oneofGroups_); +}; +goog.inherits(proto.disperser.AuthenticatedReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.AuthenticatedReply.displayName = 'proto.disperser.AuthenticatedReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobAuthHeader = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobAuthHeader, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobAuthHeader.displayName = 'proto.disperser.BlobAuthHeader'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.AuthenticationData = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.AuthenticationData, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.AuthenticationData.displayName = 'proto.disperser.AuthenticationData'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.DisperseBlobRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.disperser.DisperseBlobRequest.repeatedFields_, null); +}; +goog.inherits(proto.disperser.DisperseBlobRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.DisperseBlobRequest.displayName = 'proto.disperser.DisperseBlobRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.DisperseBlobReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.DisperseBlobReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.DisperseBlobReply.displayName = 'proto.disperser.DisperseBlobReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobStatusRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobStatusRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobStatusRequest.displayName = 'proto.disperser.BlobStatusRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobStatusReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobStatusReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobStatusReply.displayName = 'proto.disperser.BlobStatusReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.RetrieveBlobRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.RetrieveBlobRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.RetrieveBlobRequest.displayName = 'proto.disperser.RetrieveBlobRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.RetrieveBlobReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.RetrieveBlobReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.RetrieveBlobReply.displayName = 'proto.disperser.RetrieveBlobReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobInfo, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobInfo.displayName = 'proto.disperser.BlobInfo'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobHeader = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.disperser.BlobHeader.repeatedFields_, null); +}; +goog.inherits(proto.disperser.BlobHeader, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobHeader.displayName = 'proto.disperser.BlobHeader'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobQuorumParam = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobQuorumParam, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobQuorumParam.displayName = 'proto.disperser.BlobQuorumParam'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobVerificationProof = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobVerificationProof, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobVerificationProof.displayName = 'proto.disperser.BlobVerificationProof'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BatchMetadata = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BatchMetadata, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BatchMetadata.displayName = 'proto.disperser.BatchMetadata'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BatchHeader = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BatchHeader, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BatchHeader.displayName = 'proto.disperser.BatchHeader'; +} + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.disperser.AuthenticatedRequest.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.disperser.AuthenticatedRequest.PayloadCase = { + PAYLOAD_NOT_SET: 0, + DISPERSE_REQUEST: 1, + AUTHENTICATION_DATA: 2 +}; + +/** + * @return {proto.disperser.AuthenticatedRequest.PayloadCase} + */ +proto.disperser.AuthenticatedRequest.prototype.getPayloadCase = function() { + return /** @type {proto.disperser.AuthenticatedRequest.PayloadCase} */(jspb.Message.computeOneofCase(this, proto.disperser.AuthenticatedRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.AuthenticatedRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.AuthenticatedRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.AuthenticatedRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedRequest.toObject = function(includeInstance, msg) { + var f, obj = { + disperseRequest: (f = msg.getDisperseRequest()) && proto.disperser.DisperseBlobRequest.toObject(includeInstance, f), + authenticationData: (f = msg.getAuthenticationData()) && proto.disperser.AuthenticationData.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.AuthenticatedRequest} + */ +proto.disperser.AuthenticatedRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.AuthenticatedRequest; + return proto.disperser.AuthenticatedRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.AuthenticatedRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.AuthenticatedRequest} + */ +proto.disperser.AuthenticatedRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.DisperseBlobRequest; + reader.readMessage(value,proto.disperser.DisperseBlobRequest.deserializeBinaryFromReader); + msg.setDisperseRequest(value); + break; + case 2: + var value = new proto.disperser.AuthenticationData; + reader.readMessage(value,proto.disperser.AuthenticationData.deserializeBinaryFromReader); + msg.setAuthenticationData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.AuthenticatedRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.AuthenticatedRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.AuthenticatedRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDisperseRequest(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.DisperseBlobRequest.serializeBinaryToWriter + ); + } + f = message.getAuthenticationData(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.AuthenticationData.serializeBinaryToWriter + ); + } +}; + + +/** + * optional DisperseBlobRequest disperse_request = 1; + * @return {?proto.disperser.DisperseBlobRequest} + */ +proto.disperser.AuthenticatedRequest.prototype.getDisperseRequest = function() { + return /** @type{?proto.disperser.DisperseBlobRequest} */ ( + jspb.Message.getWrapperField(this, proto.disperser.DisperseBlobRequest, 1)); +}; + + +/** + * @param {?proto.disperser.DisperseBlobRequest|undefined} value + * @return {!proto.disperser.AuthenticatedRequest} returns this +*/ +proto.disperser.AuthenticatedRequest.prototype.setDisperseRequest = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.disperser.AuthenticatedRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedRequest} returns this + */ +proto.disperser.AuthenticatedRequest.prototype.clearDisperseRequest = function() { + return this.setDisperseRequest(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedRequest.prototype.hasDisperseRequest = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional AuthenticationData authentication_data = 2; + * @return {?proto.disperser.AuthenticationData} + */ +proto.disperser.AuthenticatedRequest.prototype.getAuthenticationData = function() { + return /** @type{?proto.disperser.AuthenticationData} */ ( + jspb.Message.getWrapperField(this, proto.disperser.AuthenticationData, 2)); +}; + + +/** + * @param {?proto.disperser.AuthenticationData|undefined} value + * @return {!proto.disperser.AuthenticatedRequest} returns this +*/ +proto.disperser.AuthenticatedRequest.prototype.setAuthenticationData = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.disperser.AuthenticatedRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedRequest} returns this + */ +proto.disperser.AuthenticatedRequest.prototype.clearAuthenticationData = function() { + return this.setAuthenticationData(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedRequest.prototype.hasAuthenticationData = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.disperser.AuthenticatedReply.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.disperser.AuthenticatedReply.PayloadCase = { + PAYLOAD_NOT_SET: 0, + BLOB_AUTH_HEADER: 1, + DISPERSE_REPLY: 2 +}; + +/** + * @return {proto.disperser.AuthenticatedReply.PayloadCase} + */ +proto.disperser.AuthenticatedReply.prototype.getPayloadCase = function() { + return /** @type {proto.disperser.AuthenticatedReply.PayloadCase} */(jspb.Message.computeOneofCase(this, proto.disperser.AuthenticatedReply.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.AuthenticatedReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.AuthenticatedReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.AuthenticatedReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedReply.toObject = function(includeInstance, msg) { + var f, obj = { + blobAuthHeader: (f = msg.getBlobAuthHeader()) && proto.disperser.BlobAuthHeader.toObject(includeInstance, f), + disperseReply: (f = msg.getDisperseReply()) && proto.disperser.DisperseBlobReply.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.AuthenticatedReply} + */ +proto.disperser.AuthenticatedReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.AuthenticatedReply; + return proto.disperser.AuthenticatedReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.AuthenticatedReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.AuthenticatedReply} + */ +proto.disperser.AuthenticatedReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.BlobAuthHeader; + reader.readMessage(value,proto.disperser.BlobAuthHeader.deserializeBinaryFromReader); + msg.setBlobAuthHeader(value); + break; + case 2: + var value = new proto.disperser.DisperseBlobReply; + reader.readMessage(value,proto.disperser.DisperseBlobReply.deserializeBinaryFromReader); + msg.setDisperseReply(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.AuthenticatedReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.AuthenticatedReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.AuthenticatedReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBlobAuthHeader(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.BlobAuthHeader.serializeBinaryToWriter + ); + } + f = message.getDisperseReply(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.DisperseBlobReply.serializeBinaryToWriter + ); + } +}; + + +/** + * optional BlobAuthHeader blob_auth_header = 1; + * @return {?proto.disperser.BlobAuthHeader} + */ +proto.disperser.AuthenticatedReply.prototype.getBlobAuthHeader = function() { + return /** @type{?proto.disperser.BlobAuthHeader} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobAuthHeader, 1)); +}; + + +/** + * @param {?proto.disperser.BlobAuthHeader|undefined} value + * @return {!proto.disperser.AuthenticatedReply} returns this +*/ +proto.disperser.AuthenticatedReply.prototype.setBlobAuthHeader = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.disperser.AuthenticatedReply.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedReply} returns this + */ +proto.disperser.AuthenticatedReply.prototype.clearBlobAuthHeader = function() { + return this.setBlobAuthHeader(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedReply.prototype.hasBlobAuthHeader = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional DisperseBlobReply disperse_reply = 2; + * @return {?proto.disperser.DisperseBlobReply} + */ +proto.disperser.AuthenticatedReply.prototype.getDisperseReply = function() { + return /** @type{?proto.disperser.DisperseBlobReply} */ ( + jspb.Message.getWrapperField(this, proto.disperser.DisperseBlobReply, 2)); +}; + + +/** + * @param {?proto.disperser.DisperseBlobReply|undefined} value + * @return {!proto.disperser.AuthenticatedReply} returns this +*/ +proto.disperser.AuthenticatedReply.prototype.setDisperseReply = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.disperser.AuthenticatedReply.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedReply} returns this + */ +proto.disperser.AuthenticatedReply.prototype.clearDisperseReply = function() { + return this.setDisperseReply(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedReply.prototype.hasDisperseReply = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobAuthHeader.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobAuthHeader.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobAuthHeader} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobAuthHeader.toObject = function(includeInstance, msg) { + var f, obj = { + challengeParameter: jspb.Message.getFieldWithDefault(msg, 1, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobAuthHeader} + */ +proto.disperser.BlobAuthHeader.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobAuthHeader; + return proto.disperser.BlobAuthHeader.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobAuthHeader} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobAuthHeader} + */ +proto.disperser.BlobAuthHeader.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setChallengeParameter(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobAuthHeader.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobAuthHeader.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobAuthHeader} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobAuthHeader.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getChallengeParameter(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } +}; + + +/** + * optional uint32 challenge_parameter = 1; + * @return {number} + */ +proto.disperser.BlobAuthHeader.prototype.getChallengeParameter = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobAuthHeader} returns this + */ +proto.disperser.BlobAuthHeader.prototype.setChallengeParameter = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.AuthenticationData.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.AuthenticationData.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.AuthenticationData} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticationData.toObject = function(includeInstance, msg) { + var f, obj = { + authenticationData: msg.getAuthenticationData_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.AuthenticationData} + */ +proto.disperser.AuthenticationData.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.AuthenticationData; + return proto.disperser.AuthenticationData.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.AuthenticationData} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.AuthenticationData} + */ +proto.disperser.AuthenticationData.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setAuthenticationData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.AuthenticationData.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.AuthenticationData.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.AuthenticationData} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticationData.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAuthenticationData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes authentication_data = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.AuthenticationData.prototype.getAuthenticationData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes authentication_data = 1; + * This is a type-conversion wrapper around `getAuthenticationData()` + * @return {string} + */ +proto.disperser.AuthenticationData.prototype.getAuthenticationData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getAuthenticationData())); +}; + + +/** + * optional bytes authentication_data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getAuthenticationData()` + * @return {!Uint8Array} + */ +proto.disperser.AuthenticationData.prototype.getAuthenticationData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getAuthenticationData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.AuthenticationData} returns this + */ +proto.disperser.AuthenticationData.prototype.setAuthenticationData = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.disperser.DisperseBlobRequest.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.DisperseBlobRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.DisperseBlobRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.DisperseBlobRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobRequest.toObject = function(includeInstance, msg) { + var f, obj = { + data: msg.getData_asB64(), + customQuorumNumbersList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f, + accountId: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.DisperseBlobRequest} + */ +proto.disperser.DisperseBlobRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.DisperseBlobRequest; + return proto.disperser.DisperseBlobRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.DisperseBlobRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.DisperseBlobRequest} + */ +proto.disperser.DisperseBlobRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + case 2: + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); + for (var i = 0; i < values.length; i++) { + msg.addCustomQuorumNumbers(values[i]); + } + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setAccountId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.DisperseBlobRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.DisperseBlobRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCustomQuorumNumbersList(); + if (f.length > 0) { + writer.writePackedUint32( + 2, + f + ); + } + f = message.getAccountId(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional bytes data = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.DisperseBlobRequest.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data = 1; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.disperser.DisperseBlobRequest.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobRequest.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated uint32 custom_quorum_numbers = 2; + * @return {!Array} + */ +proto.disperser.DisperseBlobRequest.prototype.getCustomQuorumNumbersList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.setCustomQuorumNumbersList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {number} value + * @param {number=} opt_index + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.addCustomQuorumNumbers = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.clearCustomQuorumNumbersList = function() { + return this.setCustomQuorumNumbersList([]); +}; + + +/** + * optional string account_id = 3; + * @return {string} + */ +proto.disperser.DisperseBlobRequest.prototype.getAccountId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.setAccountId = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.DisperseBlobReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.DisperseBlobReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.DisperseBlobReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobReply.toObject = function(includeInstance, msg) { + var f, obj = { + result: jspb.Message.getFieldWithDefault(msg, 1, 0), + requestId: msg.getRequestId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.DisperseBlobReply} + */ +proto.disperser.DisperseBlobReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.DisperseBlobReply; + return proto.disperser.DisperseBlobReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.DisperseBlobReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.DisperseBlobReply} + */ +proto.disperser.DisperseBlobReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.disperser.BlobStatus} */ (reader.readEnum()); + msg.setResult(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRequestId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.DisperseBlobReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.DisperseBlobReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getResult(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getRequestId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional BlobStatus result = 1; + * @return {!proto.disperser.BlobStatus} + */ +proto.disperser.DisperseBlobReply.prototype.getResult = function() { + return /** @type {!proto.disperser.BlobStatus} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.disperser.BlobStatus} value + * @return {!proto.disperser.DisperseBlobReply} returns this + */ +proto.disperser.DisperseBlobReply.prototype.setResult = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional bytes request_id = 2; + * @return {!(string|Uint8Array)} + */ +proto.disperser.DisperseBlobReply.prototype.getRequestId = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes request_id = 2; + * This is a type-conversion wrapper around `getRequestId()` + * @return {string} + */ +proto.disperser.DisperseBlobReply.prototype.getRequestId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRequestId())); +}; + + +/** + * optional bytes request_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRequestId()` + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobReply.prototype.getRequestId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRequestId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.DisperseBlobReply} returns this + */ +proto.disperser.DisperseBlobReply.prototype.setRequestId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + requestId: msg.getRequestId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobStatusRequest} + */ +proto.disperser.BlobStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobStatusRequest; + return proto.disperser.BlobStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobStatusRequest} + */ +proto.disperser.BlobStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRequestId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getRequestId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes request_id = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BlobStatusRequest.prototype.getRequestId = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes request_id = 1; + * This is a type-conversion wrapper around `getRequestId()` + * @return {string} + */ +proto.disperser.BlobStatusRequest.prototype.getRequestId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRequestId())); +}; + + +/** + * optional bytes request_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRequestId()` + * @return {!Uint8Array} + */ +proto.disperser.BlobStatusRequest.prototype.getRequestId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRequestId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BlobStatusRequest} returns this + */ +proto.disperser.BlobStatusRequest.prototype.setRequestId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobStatusReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobStatusReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobStatusReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusReply.toObject = function(includeInstance, msg) { + var f, obj = { + status: jspb.Message.getFieldWithDefault(msg, 1, 0), + info: (f = msg.getInfo()) && proto.disperser.BlobInfo.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobStatusReply} + */ +proto.disperser.BlobStatusReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobStatusReply; + return proto.disperser.BlobStatusReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobStatusReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobStatusReply} + */ +proto.disperser.BlobStatusReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.disperser.BlobStatus} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 2: + var value = new proto.disperser.BlobInfo; + reader.readMessage(value,proto.disperser.BlobInfo.deserializeBinaryFromReader); + msg.setInfo(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobStatusReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobStatusReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobStatusReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getInfo(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.BlobInfo.serializeBinaryToWriter + ); + } +}; + + +/** + * optional BlobStatus status = 1; + * @return {!proto.disperser.BlobStatus} + */ +proto.disperser.BlobStatusReply.prototype.getStatus = function() { + return /** @type {!proto.disperser.BlobStatus} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.disperser.BlobStatus} value + * @return {!proto.disperser.BlobStatusReply} returns this + */ +proto.disperser.BlobStatusReply.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional BlobInfo info = 2; + * @return {?proto.disperser.BlobInfo} + */ +proto.disperser.BlobStatusReply.prototype.getInfo = function() { + return /** @type{?proto.disperser.BlobInfo} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobInfo, 2)); +}; + + +/** + * @param {?proto.disperser.BlobInfo|undefined} value + * @return {!proto.disperser.BlobStatusReply} returns this +*/ +proto.disperser.BlobStatusReply.prototype.setInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobStatusReply} returns this + */ +proto.disperser.BlobStatusReply.prototype.clearInfo = function() { + return this.setInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobStatusReply.prototype.hasInfo = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.RetrieveBlobRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.RetrieveBlobRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.RetrieveBlobRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobRequest.toObject = function(includeInstance, msg) { + var f, obj = { + batchHeaderHash: msg.getBatchHeaderHash_asB64(), + blobIndex: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.RetrieveBlobRequest} + */ +proto.disperser.RetrieveBlobRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.RetrieveBlobRequest; + return proto.disperser.RetrieveBlobRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.RetrieveBlobRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.RetrieveBlobRequest} + */ +proto.disperser.RetrieveBlobRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBatchHeaderHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBlobIndex(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.RetrieveBlobRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.RetrieveBlobRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchHeaderHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getBlobIndex(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } +}; + + +/** + * optional bytes batch_header_hash = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBatchHeaderHash = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes batch_header_hash = 1; + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {string} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBatchHeaderHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBatchHeaderHash())); +}; + + +/** + * optional bytes batch_header_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBatchHeaderHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBatchHeaderHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.RetrieveBlobRequest} returns this + */ +proto.disperser.RetrieveBlobRequest.prototype.setBatchHeaderHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 blob_index = 2; + * @return {number} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBlobIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.RetrieveBlobRequest} returns this + */ +proto.disperser.RetrieveBlobRequest.prototype.setBlobIndex = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.RetrieveBlobReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.RetrieveBlobReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.RetrieveBlobReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobReply.toObject = function(includeInstance, msg) { + var f, obj = { + data: msg.getData_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.RetrieveBlobReply} + */ +proto.disperser.RetrieveBlobReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.RetrieveBlobReply; + return proto.disperser.RetrieveBlobReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.RetrieveBlobReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.RetrieveBlobReply} + */ +proto.disperser.RetrieveBlobReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.RetrieveBlobReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.RetrieveBlobReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes data = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.RetrieveBlobReply.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data = 1; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.disperser.RetrieveBlobReply.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobReply.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.RetrieveBlobReply} returns this + */ +proto.disperser.RetrieveBlobReply.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobInfo.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobInfo.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobInfo} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobInfo.toObject = function(includeInstance, msg) { + var f, obj = { + blobHeader: (f = msg.getBlobHeader()) && proto.disperser.BlobHeader.toObject(includeInstance, f), + blobVerificationProof: (f = msg.getBlobVerificationProof()) && proto.disperser.BlobVerificationProof.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobInfo} + */ +proto.disperser.BlobInfo.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobInfo; + return proto.disperser.BlobInfo.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobInfo} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobInfo} + */ +proto.disperser.BlobInfo.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.BlobHeader; + reader.readMessage(value,proto.disperser.BlobHeader.deserializeBinaryFromReader); + msg.setBlobHeader(value); + break; + case 2: + var value = new proto.disperser.BlobVerificationProof; + reader.readMessage(value,proto.disperser.BlobVerificationProof.deserializeBinaryFromReader); + msg.setBlobVerificationProof(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobInfo.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobInfo.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobInfo} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobInfo.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBlobHeader(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.BlobHeader.serializeBinaryToWriter + ); + } + f = message.getBlobVerificationProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.BlobVerificationProof.serializeBinaryToWriter + ); + } +}; + + +/** + * optional BlobHeader blob_header = 1; + * @return {?proto.disperser.BlobHeader} + */ +proto.disperser.BlobInfo.prototype.getBlobHeader = function() { + return /** @type{?proto.disperser.BlobHeader} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobHeader, 1)); +}; + + +/** + * @param {?proto.disperser.BlobHeader|undefined} value + * @return {!proto.disperser.BlobInfo} returns this +*/ +proto.disperser.BlobInfo.prototype.setBlobHeader = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobInfo} returns this + */ +proto.disperser.BlobInfo.prototype.clearBlobHeader = function() { + return this.setBlobHeader(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobInfo.prototype.hasBlobHeader = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional BlobVerificationProof blob_verification_proof = 2; + * @return {?proto.disperser.BlobVerificationProof} + */ +proto.disperser.BlobInfo.prototype.getBlobVerificationProof = function() { + return /** @type{?proto.disperser.BlobVerificationProof} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobVerificationProof, 2)); +}; + + +/** + * @param {?proto.disperser.BlobVerificationProof|undefined} value + * @return {!proto.disperser.BlobInfo} returns this +*/ +proto.disperser.BlobInfo.prototype.setBlobVerificationProof = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobInfo} returns this + */ +proto.disperser.BlobInfo.prototype.clearBlobVerificationProof = function() { + return this.setBlobVerificationProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobInfo.prototype.hasBlobVerificationProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.disperser.BlobHeader.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobHeader.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobHeader.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobHeader} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobHeader.toObject = function(includeInstance, msg) { + var f, obj = { + commitment: (f = msg.getCommitment()) && common_common_pb.G1Commitment.toObject(includeInstance, f), + dataLength: jspb.Message.getFieldWithDefault(msg, 2, 0), + blobQuorumParamsList: jspb.Message.toObjectList(msg.getBlobQuorumParamsList(), + proto.disperser.BlobQuorumParam.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobHeader} + */ +proto.disperser.BlobHeader.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobHeader; + return proto.disperser.BlobHeader.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobHeader} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobHeader} + */ +proto.disperser.BlobHeader.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new common_common_pb.G1Commitment; + reader.readMessage(value,common_common_pb.G1Commitment.deserializeBinaryFromReader); + msg.setCommitment(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setDataLength(value); + break; + case 3: + var value = new proto.disperser.BlobQuorumParam; + reader.readMessage(value,proto.disperser.BlobQuorumParam.deserializeBinaryFromReader); + msg.addBlobQuorumParams(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobHeader.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobHeader.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobHeader} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobHeader.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCommitment(); + if (f != null) { + writer.writeMessage( + 1, + f, + common_common_pb.G1Commitment.serializeBinaryToWriter + ); + } + f = message.getDataLength(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getBlobQuorumParamsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.disperser.BlobQuorumParam.serializeBinaryToWriter + ); + } +}; + + +/** + * optional common.G1Commitment commitment = 1; + * @return {?proto.common.G1Commitment} + */ +proto.disperser.BlobHeader.prototype.getCommitment = function() { + return /** @type{?proto.common.G1Commitment} */ ( + jspb.Message.getWrapperField(this, common_common_pb.G1Commitment, 1)); +}; + + +/** + * @param {?proto.common.G1Commitment|undefined} value + * @return {!proto.disperser.BlobHeader} returns this +*/ +proto.disperser.BlobHeader.prototype.setCommitment = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobHeader} returns this + */ +proto.disperser.BlobHeader.prototype.clearCommitment = function() { + return this.setCommitment(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobHeader.prototype.hasCommitment = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional uint32 data_length = 2; + * @return {number} + */ +proto.disperser.BlobHeader.prototype.getDataLength = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobHeader} returns this + */ +proto.disperser.BlobHeader.prototype.setDataLength = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * repeated BlobQuorumParam blob_quorum_params = 3; + * @return {!Array} + */ +proto.disperser.BlobHeader.prototype.getBlobQuorumParamsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.disperser.BlobQuorumParam, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.disperser.BlobHeader} returns this +*/ +proto.disperser.BlobHeader.prototype.setBlobQuorumParamsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.disperser.BlobQuorumParam=} opt_value + * @param {number=} opt_index + * @return {!proto.disperser.BlobQuorumParam} + */ +proto.disperser.BlobHeader.prototype.addBlobQuorumParams = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.disperser.BlobQuorumParam, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.disperser.BlobHeader} returns this + */ +proto.disperser.BlobHeader.prototype.clearBlobQuorumParamsList = function() { + return this.setBlobQuorumParamsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobQuorumParam.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobQuorumParam.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobQuorumParam} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobQuorumParam.toObject = function(includeInstance, msg) { + var f, obj = { + quorumNumber: jspb.Message.getFieldWithDefault(msg, 1, 0), + adversaryThresholdPercentage: jspb.Message.getFieldWithDefault(msg, 2, 0), + confirmationThresholdPercentage: jspb.Message.getFieldWithDefault(msg, 3, 0), + chunkLength: jspb.Message.getFieldWithDefault(msg, 4, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobQuorumParam} + */ +proto.disperser.BlobQuorumParam.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobQuorumParam; + return proto.disperser.BlobQuorumParam.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobQuorumParam} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobQuorumParam} + */ +proto.disperser.BlobQuorumParam.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setQuorumNumber(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setAdversaryThresholdPercentage(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setConfirmationThresholdPercentage(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setChunkLength(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobQuorumParam.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobQuorumParam.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobQuorumParam} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobQuorumParam.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getQuorumNumber(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getAdversaryThresholdPercentage(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getConfirmationThresholdPercentage(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getChunkLength(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } +}; + + +/** + * optional uint32 quorum_number = 1; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getQuorumNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setQuorumNumber = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 adversary_threshold_percentage = 2; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getAdversaryThresholdPercentage = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setAdversaryThresholdPercentage = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional uint32 confirmation_threshold_percentage = 3; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getConfirmationThresholdPercentage = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setConfirmationThresholdPercentage = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional uint32 chunk_length = 4; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getChunkLength = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setChunkLength = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobVerificationProof.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobVerificationProof.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobVerificationProof} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobVerificationProof.toObject = function(includeInstance, msg) { + var f, obj = { + batchId: jspb.Message.getFieldWithDefault(msg, 1, 0), + blobIndex: jspb.Message.getFieldWithDefault(msg, 2, 0), + batchMetadata: (f = msg.getBatchMetadata()) && proto.disperser.BatchMetadata.toObject(includeInstance, f), + inclusionProof: msg.getInclusionProof_asB64(), + quorumIndexes: msg.getQuorumIndexes_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobVerificationProof} + */ +proto.disperser.BlobVerificationProof.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobVerificationProof; + return proto.disperser.BlobVerificationProof.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobVerificationProof} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobVerificationProof} + */ +proto.disperser.BlobVerificationProof.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBatchId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBlobIndex(value); + break; + case 3: + var value = new proto.disperser.BatchMetadata; + reader.readMessage(value,proto.disperser.BatchMetadata.deserializeBinaryFromReader); + msg.setBatchMetadata(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setInclusionProof(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumIndexes(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobVerificationProof.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobVerificationProof.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobVerificationProof} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobVerificationProof.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchId(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getBlobIndex(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getBatchMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.disperser.BatchMetadata.serializeBinaryToWriter + ); + } + f = message.getInclusionProof_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getQuorumIndexes_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } +}; + + +/** + * optional uint32 batch_id = 1; + * @return {number} + */ +proto.disperser.BlobVerificationProof.prototype.getBatchId = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setBatchId = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 blob_index = 2; + * @return {number} + */ +proto.disperser.BlobVerificationProof.prototype.getBlobIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setBlobIndex = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional BatchMetadata batch_metadata = 3; + * @return {?proto.disperser.BatchMetadata} + */ +proto.disperser.BlobVerificationProof.prototype.getBatchMetadata = function() { + return /** @type{?proto.disperser.BatchMetadata} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BatchMetadata, 3)); +}; + + +/** + * @param {?proto.disperser.BatchMetadata|undefined} value + * @return {!proto.disperser.BlobVerificationProof} returns this +*/ +proto.disperser.BlobVerificationProof.prototype.setBatchMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.clearBatchMetadata = function() { + return this.setBatchMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobVerificationProof.prototype.hasBatchMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional bytes inclusion_proof = 4; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BlobVerificationProof.prototype.getInclusionProof = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes inclusion_proof = 4; + * This is a type-conversion wrapper around `getInclusionProof()` + * @return {string} + */ +proto.disperser.BlobVerificationProof.prototype.getInclusionProof_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getInclusionProof())); +}; + + +/** + * optional bytes inclusion_proof = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getInclusionProof()` + * @return {!Uint8Array} + */ +proto.disperser.BlobVerificationProof.prototype.getInclusionProof_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getInclusionProof())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setInclusionProof = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional bytes quorum_indexes = 5; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BlobVerificationProof.prototype.getQuorumIndexes = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes quorum_indexes = 5; + * This is a type-conversion wrapper around `getQuorumIndexes()` + * @return {string} + */ +proto.disperser.BlobVerificationProof.prototype.getQuorumIndexes_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumIndexes())); +}; + + +/** + * optional bytes quorum_indexes = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumIndexes()` + * @return {!Uint8Array} + */ +proto.disperser.BlobVerificationProof.prototype.getQuorumIndexes_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumIndexes())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setQuorumIndexes = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BatchMetadata.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BatchMetadata.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BatchMetadata} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchMetadata.toObject = function(includeInstance, msg) { + var f, obj = { + batchHeader: (f = msg.getBatchHeader()) && proto.disperser.BatchHeader.toObject(includeInstance, f), + signatoryRecordHash: msg.getSignatoryRecordHash_asB64(), + fee: msg.getFee_asB64(), + confirmationBlockNumber: jspb.Message.getFieldWithDefault(msg, 4, 0), + batchHeaderHash: msg.getBatchHeaderHash_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BatchMetadata} + */ +proto.disperser.BatchMetadata.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BatchMetadata; + return proto.disperser.BatchMetadata.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BatchMetadata} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BatchMetadata} + */ +proto.disperser.BatchMetadata.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.BatchHeader; + reader.readMessage(value,proto.disperser.BatchHeader.deserializeBinaryFromReader); + msg.setBatchHeader(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setSignatoryRecordHash(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFee(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setConfirmationBlockNumber(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBatchHeaderHash(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BatchMetadata.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BatchMetadata} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchMetadata.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchHeader(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.BatchHeader.serializeBinaryToWriter + ); + } + f = message.getSignatoryRecordHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getFee_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getConfirmationBlockNumber(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } + f = message.getBatchHeaderHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } +}; + + +/** + * optional BatchHeader batch_header = 1; + * @return {?proto.disperser.BatchHeader} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeader = function() { + return /** @type{?proto.disperser.BatchHeader} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BatchHeader, 1)); +}; + + +/** + * @param {?proto.disperser.BatchHeader|undefined} value + * @return {!proto.disperser.BatchMetadata} returns this +*/ +proto.disperser.BatchMetadata.prototype.setBatchHeader = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.clearBatchHeader = function() { + return this.setBatchHeader(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BatchMetadata.prototype.hasBatchHeader = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional bytes signatory_record_hash = 2; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchMetadata.prototype.getSignatoryRecordHash = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes signatory_record_hash = 2; + * This is a type-conversion wrapper around `getSignatoryRecordHash()` + * @return {string} + */ +proto.disperser.BatchMetadata.prototype.getSignatoryRecordHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getSignatoryRecordHash())); +}; + + +/** + * optional bytes signatory_record_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSignatoryRecordHash()` + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.getSignatoryRecordHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getSignatoryRecordHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setSignatoryRecordHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bytes fee = 3; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchMetadata.prototype.getFee = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes fee = 3; + * This is a type-conversion wrapper around `getFee()` + * @return {string} + */ +proto.disperser.BatchMetadata.prototype.getFee_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFee())); +}; + + +/** + * optional bytes fee = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFee()` + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.getFee_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFee())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setFee = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + +/** + * optional uint32 confirmation_block_number = 4; + * @return {number} + */ +proto.disperser.BatchMetadata.prototype.getConfirmationBlockNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setConfirmationBlockNumber = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional bytes batch_header_hash = 5; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeaderHash = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes batch_header_hash = 5; + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {string} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeaderHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBatchHeaderHash())); +}; + + +/** + * optional bytes batch_header_hash = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeaderHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBatchHeaderHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setBatchHeaderHash = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BatchHeader.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BatchHeader.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BatchHeader} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchHeader.toObject = function(includeInstance, msg) { + var f, obj = { + batchRoot: msg.getBatchRoot_asB64(), + quorumNumbers: msg.getQuorumNumbers_asB64(), + quorumSignedPercentages: msg.getQuorumSignedPercentages_asB64(), + referenceBlockNumber: jspb.Message.getFieldWithDefault(msg, 4, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BatchHeader} + */ +proto.disperser.BatchHeader.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BatchHeader; + return proto.disperser.BatchHeader.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BatchHeader} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BatchHeader} + */ +proto.disperser.BatchHeader.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBatchRoot(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumNumbers(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumSignedPercentages(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setReferenceBlockNumber(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BatchHeader.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BatchHeader} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchHeader.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchRoot_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getQuorumNumbers_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getQuorumSignedPercentages_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getReferenceBlockNumber(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } +}; + + +/** + * optional bytes batch_root = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchHeader.prototype.getBatchRoot = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes batch_root = 1; + * This is a type-conversion wrapper around `getBatchRoot()` + * @return {string} + */ +proto.disperser.BatchHeader.prototype.getBatchRoot_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBatchRoot())); +}; + + +/** + * optional bytes batch_root = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBatchRoot()` + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.getBatchRoot_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBatchRoot())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setBatchRoot = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes quorum_numbers = 2; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchHeader.prototype.getQuorumNumbers = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes quorum_numbers = 2; + * This is a type-conversion wrapper around `getQuorumNumbers()` + * @return {string} + */ +proto.disperser.BatchHeader.prototype.getQuorumNumbers_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumNumbers())); +}; + + +/** + * optional bytes quorum_numbers = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumNumbers()` + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.getQuorumNumbers_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumNumbers())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setQuorumNumbers = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bytes quorum_signed_percentages = 3; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchHeader.prototype.getQuorumSignedPercentages = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes quorum_signed_percentages = 3; + * This is a type-conversion wrapper around `getQuorumSignedPercentages()` + * @return {string} + */ +proto.disperser.BatchHeader.prototype.getQuorumSignedPercentages_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumSignedPercentages())); +}; + + +/** + * optional bytes quorum_signed_percentages = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumSignedPercentages()` + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.getQuorumSignedPercentages_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumSignedPercentages())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setQuorumSignedPercentages = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + +/** + * optional uint32 reference_block_number = 4; + * @return {number} + */ +proto.disperser.BatchHeader.prototype.getReferenceBlockNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setReferenceBlockNumber = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * @enum {number} + */ +proto.disperser.BlobStatus = { + UNKNOWN: 0, + PROCESSING: 1, + CONFIRMED: 2, + FAILED: 3, + FINALIZED: 4, + INSUFFICIENT_SIGNATURES: 5, + DISPERSING: 6 +}; + +goog.object.extend(exports, proto.disperser); diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/churner/churner.proto b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/churner/churner.proto new file mode 100644 index 00000000..0687d9ca --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/churner/churner.proto @@ -0,0 +1,82 @@ +syntax = "proto3"; + +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/churner"; +package churner; + +// The Churner is a service that handles churn requests from new operators trying to +// join the EigenDA network. +// When the EigenDA network reaches the maximum number of operators, any new operator +// trying to join will have to make a churn request to this Churner, which acts as the +// sole decision maker to decide whether this new operator could join, and if so, which +// existing operator will be churned out (so the max number of operators won't be +// exceeded). +// The max number of operators, as well as the rules to make churn decisions, are +// defined onchain, see details in OperatorSetParam at: +// https://github.com/Layr-Labs/eigenlayer-middleware/blob/master/src/interfaces/IBLSRegistryCoordinatorWithIndices.sol#L24. +service Churner { + rpc Churn(ChurnRequest) returns (ChurnReply) {} +} + +message ChurnRequest { + // The Ethereum address (in hex like "0x123abcdef...") of the operator. + string operator_address = 1; + // The operator making the churn request. + bytes operator_to_register_pubkey_g1 = 2; + bytes operator_to_register_pubkey_g2 = 3; + // The operator's BLS signature signed on the keccak256 hash of + // concat("ChurnRequest", operator address, g1, g2, salt). + bytes operator_request_signature = 4; + // The salt used as part of the message to sign on for operator_request_signature. + bytes salt = 5; + // The quorums to register for. + // Note: + // - If any of the quorum here has already been registered, this entire request + // will fail to proceed. + // - If any of the quorum fails to register, this entire request will fail. + // - Regardless of whether the specified quorums are full or not, the Churner + // will return parameters for all quorums specified here. The smart contract will + // determine whether it needs to churn out existing operators based on whether + // the quorums have available space. + // The IDs must be in range [0, 254]. + repeated uint32 quorum_ids = 6; +} + +message ChurnReply { + // The signature signed by the Churner. + SignatureWithSaltAndExpiry signature_with_salt_and_expiry = 1; + // A list of existing operators that get churned out. + // This list will contain all quorums specified in the ChurnRequest even if some quorums + // may not have any churned out operators. If a quorum has available space, OperatorToChurn + // object will contain the quorum ID and empty operator and pubkey. The smart contract should + // only churn out the operators for quorums that are full. + // + // For example, if the ChurnRequest specifies quorums 0 and 1 where quorum 0 is full + // and quorum 1 has available space, the ChurnReply will contain two OperatorToChurn objects + // with the respective quorums. OperatorToChurn for quorum 0 will contain the operator to churn + // out and OperatorToChurn for quorum 1 will contain empty operator (zero address) and pubkey. + // The smart contract should only churn out the operators for quorum 0 because quorum 1 + // has available space without having any operators churned. + // Note: it's possible an operator gets churned out just for one or more quorums + // (rather than entirely churned out for all quorums). + repeated OperatorToChurn operators_to_churn = 2; +} + +message SignatureWithSaltAndExpiry { + // Churner's signature on the Operator's attributes. + bytes signature = 1; + // Salt is the keccak256 hash of + // concat("churn", time.Now(), operatorToChurn's OperatorID, Churner's ECDSA private key) + bytes salt = 2; + // When this churn decision will expire. + int64 expiry = 3; +} + +// This describes an operator to churn out for a quorum. +message OperatorToChurn { + // The ID of the quorum of the operator to churn out. + uint32 quorum_id = 1; + // The address of the operator. + bytes operator = 2; + // BLS pubkey (G1 point) of the operator. + bytes pubkey = 3; +} diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/common/common.proto b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/common/common.proto new file mode 100644 index 00000000..343222f8 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/common/common.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; +package common; +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/common"; + +message G1Commitment { + // The X coordinate of the KZG commitment. This is the raw byte representation of the field element. + bytes x = 1; + // The Y coordinate of the KZG commitment. This is the raw byte representation of the field element. + bytes y = 2; +} diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/disperser/disperser.proto b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/disperser/disperser.proto new file mode 100644 index 00000000..d83aaf31 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/disperser/disperser.proto @@ -0,0 +1,252 @@ +syntax = "proto3"; +package disperser; +import "common/common.proto"; +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/disperser"; + +// Disperser defines the public APIs for dispersing blobs. +service Disperser { + // This API accepts blob to disperse from clients. + // This executes the dispersal async, i.e. it returns once the request + // is accepted. The client could use GetBlobStatus() API to poll the the + // processing status of the blob. + rpc DisperseBlob(DisperseBlobRequest) returns (DisperseBlobReply) {} + + + // DisperseBlobAuthenticated is similar to DisperseBlob, except that it requires the + // client to authenticate itself via the AuthenticationData message. The protoco is as follows: + // 1. The client sends a DisperseBlobAuthenticated request with the DisperseBlobRequest message + // 2. The Disperser sends back a BlobAuthHeader message containing information for the client to + // verify and sign. + // 3. The client verifies the BlobAuthHeader and sends back the signed BlobAuthHeader in an + // AuthenticationData message. + // 4. The Disperser verifies the signature and returns a DisperseBlobReply message. + rpc DisperseBlobAuthenticated(stream AuthenticatedRequest) returns (stream AuthenticatedReply); + + // This API is meant to be polled for the blob status. + rpc GetBlobStatus(BlobStatusRequest) returns (BlobStatusReply) {} + + // This retrieves the requested blob from the Disperser's backend. + // This is a more efficient way to retrieve blobs than directly retrieving + // from the DA Nodes (see detail about this approach in + // api/proto/retriever/retriever.proto). + // The blob should have been initially dispersed via this Disperser service + // for this API to work. + rpc RetrieveBlob(RetrieveBlobRequest) returns (RetrieveBlobReply) {} +} + +// Requests and Responses + +// Authenicated Message Types + +message AuthenticatedRequest { + oneof payload { + DisperseBlobRequest disperse_request = 1; + AuthenticationData authentication_data = 2; + } +} + +message AuthenticatedReply { + oneof payload { + BlobAuthHeader blob_auth_header = 1; + DisperseBlobReply disperse_reply = 2; + } +} + +// BlobAuthHeader contains information about the blob for the client to verify and sign. +// - Once payments are enabled, the BlobAuthHeader will contain the KZG commitment to the blob, which the client + // will verify and sign. Having the client verify the KZG commitment instead of calculating it avoids +// the need for the client to have the KZG structured reference string (SRS), which can be large. +// The signed KZG commitment prevents the disperser from sending a different blob to the DA Nodes +// than the one the client sent. +// - In the meantime, the BlobAuthHeader contains a simple challenge parameter is used to prevent +// replay attacks in the event that a signature is leaked. +message BlobAuthHeader { + uint32 challenge_parameter = 1; +} + +// AuthenticationData contains the signature of the BlobAuthHeader. +message AuthenticationData { + bytes authentication_data = 1; +} + +message DisperseBlobRequest { + // The data to be dispersed. + // The size of data must be <= 2MiB. Every 32 bytes of data chunk is interpreted as an integer in big endian format + // where the lower address has more significant bits. The integer must stay in the valid range to be interpreted + // as a field element on the bn254 curve. The valid range is + // 0 <= x < 21888242871839275222246405745257275088548364400416034343698204186575808495617 + // containing slightly less than 254 bits and more than 253 bits. If any one of the 32 bytes chunk is outside the range, + // the whole request is deemed as invalid, and rejected. + bytes data = 1; + // The quorums to which the blob will be sent, in addition to the required quorums which are configured + // on the EigenDA smart contract. If required quorums are included here, an error will be returned. + // The disperser will ensure that the encoded blobs for each quorum are all processed + // within the same batch. + repeated uint32 custom_quorum_numbers = 2; + + // The account ID of the client. This should be a hex-encoded string of the ECSDA public key + // corresponding to the key used by the client to sign the BlobAuthHeader. + string account_id = 3; +} + +message DisperseBlobReply { + // The status of the blob associated with the request_id. + BlobStatus result = 1; + // The request ID generated by the disperser. + // Once a request is accepted (although not processed), a unique request ID will be + // generated. + // Two different DisperseBlobRequests (determined by the hash of the DisperseBlobRequest) + // will have different IDs, and the same DisperseBlobRequest sent repeatedly at different + // times will also have different IDs. + // The client should use this ID to query the processing status of the request (via + // the GetBlobStatus API). + bytes request_id = 2; +} + +// BlobStatusRequest is used to query the status of a blob. +message BlobStatusRequest { + bytes request_id = 1; +} + +message BlobStatusReply { + // The status of the blob. + BlobStatus status = 1; + // The blob info needed for clients to confirm the blob against the EigenDA contracts. + BlobInfo info = 2; +} + +// RetrieveBlobRequest contains parameters to retrieve the blob. +message RetrieveBlobRequest { + bytes batch_header_hash = 1; + uint32 blob_index = 2; +} + +// RetrieveBlobReply contains the retrieved blob data +message RetrieveBlobReply { + bytes data = 1; +} + +// Data Types + +// BlobStatus represents the status of a blob. +// The status of a blob is updated as the blob is processed by the disperser. +// The status of a blob can be queried by the client using the GetBlobStatus API. +// Intermediate states are states that the blob can be in while being processed, and it can be updated to a differet state: +// - PROCESSING +// - DISPERSING +// - CONFIRMED +// Terminal states are states that will not be updated to a different state: +// - FAILED +// - FINALIZED +// - INSUFFICIENT_SIGNATURES +enum BlobStatus { + UNKNOWN = 0; + + // PROCESSING means that the blob is currently being processed by the disperser + PROCESSING = 1; + // CONFIRMED means that the blob has been dispersed to DA Nodes and the dispersed + // batch containing the blob has been confirmed onchain + CONFIRMED = 2; + + // FAILED means that the blob has failed permanently (for reasons other than insufficient + // signatures, which is a separate state) + FAILED = 3; + // FINALIZED means that the block containing the blob's confirmation transaction has been finalized on Ethereum + FINALIZED = 4; + // INSUFFICIENT_SIGNATURES means that the confirmation threshold for the blob was not met + // for at least one quorum. + INSUFFICIENT_SIGNATURES = 5; + + // DISPERSING means that the blob is currently being dispersed to DA Nodes and being confirmed onchain + DISPERSING = 6; +} + +// Types below correspond to the types necessary to verify a blob +// https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/libraries/EigenDABlobUtils.sol#L29 + +// BlobInfo contains information needed to confirm the blob against the EigenDA contracts +message BlobInfo { + BlobHeader blob_header = 1; + BlobVerificationProof blob_verification_proof = 2; +} + +message BlobHeader { + // KZG commitment of the blob. + common.G1Commitment commitment = 1; + // The length of the blob in symbols (each symbol is 32 bytes). + uint32 data_length = 2; + // The params of the quorums that this blob participates in. + repeated BlobQuorumParam blob_quorum_params = 3; +} + +message BlobQuorumParam { + // The ID of the quorum. + uint32 quorum_number = 1; + // The max percentage of stake within the quorum that can be held by or delegated + // to adversarial operators. Currently, this and the next parameter are standardized + // across the quorum using values read from the EigenDA contracts. + uint32 adversary_threshold_percentage = 2; + // The min percentage of stake that must attest in order to consider + // the dispersal is successful. + uint32 confirmation_threshold_percentage = 3; + // The length of each chunk. + uint32 chunk_length = 4; +} + +message BlobVerificationProof { + // batch_id is an incremental ID assigned to a batch by EigenDAServiceManager + uint32 batch_id = 1; + // The index of the blob in the batch (which is logically an ordered list of blobs). + uint32 blob_index = 2; + BatchMetadata batch_metadata = 3; + // inclusion_proof is a merkle proof for a blob header's inclusion in a batch + bytes inclusion_proof = 4; + // indexes of quorums in BatchHeader.quorum_numbers that match the quorums in BlobHeader.blob_quorum_params + // Ex. BlobHeader.blob_quorum_params = [ + // { + // quorum_number = 0, + // ... + // }, + // { + // quorum_number = 3, + // ... + // }, + // { + // quorum_number = 5, + // ... + // }, + // ] + // BatchHeader.quorum_numbers = [0, 5, 3] => 0x000503 + // Then, quorum_indexes = [0, 2, 1] => 0x000201 + bytes quorum_indexes = 5; +} + +message BatchMetadata { + BatchHeader batch_header = 1; + // The hash of all public keys of the operators that did not sign the batch. + bytes signatory_record_hash = 2; + // The fee payment paid by users for dispersing this batch. It's the bytes + // representation of a big.Int value. + bytes fee = 3; + // The Ethereum block number at which the batch is confirmed onchain. + uint32 confirmation_block_number = 4; + // This is the hash of the ReducedBatchHeader defined onchain, see: + // https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/interfaces/IEigenDAServiceManager.sol#L43 + // The is the message that the operators will sign their signatures on. + bytes batch_header_hash = 5; +} + +message BatchHeader { + // The root of the merkle tree with the hashes of blob headers as leaves. + bytes batch_root = 1; + // All quorums associated with blobs in this batch. Sorted in ascending order. + // Ex. [0, 2, 1] => 0x000102 + bytes quorum_numbers = 2; + // The percentage of stake that has signed for this batch. + // The quorum_signed_percentages[i] is percentage for the quorum_numbers[i]. + bytes quorum_signed_percentages = 3; + // The Ethereum block number at which the batch was created. + // The Disperser will encode and disperse the blobs based on the onchain info + // (e.g. operator stakes) at this block number. + uint32 reference_block_number = 4; +} diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/node/node.proto b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/node/node.proto new file mode 100644 index 00000000..f32fea64 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/node/node.proto @@ -0,0 +1,218 @@ +syntax = "proto3"; +package node; +import "google/protobuf/wrappers.proto"; +import "common/common.proto"; +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/node"; + +// The EigenDA Node implements two services, Dispersal and Retrieval, as defined below, +// for better security and separation of concerns. + +service Dispersal { + // StoreChunks validates that the chunks match what the Node is supposed to receive ( + // different Nodes are responsible for different chunks, as EigenDA is horizontally + // sharded) and is correctly coded (e.g. each chunk must be a valid KZG multiproof) + // according to the EigenDA protocol. It also stores the chunks along with metadata + // for the protocol-defined length of custody. It will return a signature at the + // end to attest to the data in this request it has processed. + rpc StoreChunks(StoreChunksRequest) returns (StoreChunksReply) {} + // StoreBlobs is simiar to StoreChunks, but it stores the blobs using a different storage schema + // so that the stored blobs can later be aggregated by AttestBatch method to a bigger batch. + // StoreBlobs + AttestBatch will eventually replace and deprecate StoreChunks method. + rpc StoreBlobs(StoreBlobsRequest) returns (StoreBlobsReply) {} + // AttestBatch is used to aggregate the batches stored by StoreBlobs method to a bigger batch. + // It will return a signature at the end to attest to the aggregated batch. + rpc AttestBatch(AttestBatchRequest) returns (AttestBatchReply) {} + // Retrieve node info metadata + rpc NodeInfo(NodeInfoRequest) returns (NodeInfoReply) {} +} + +service Retrieval { + // RetrieveChunks retrieves the chunks for a blob custodied at the Node. + rpc RetrieveChunks(RetrieveChunksRequest) returns (RetrieveChunksReply) {} + // GetBlobHeader is similar to RetrieveChunks, this just returns the header of the blob. + rpc GetBlobHeader(GetBlobHeaderRequest) returns (GetBlobHeaderReply) {} + // Retrieve node info metadata + rpc NodeInfo(NodeInfoRequest) returns (NodeInfoReply) {} +} + +// Requests and replies + +message StoreChunksRequest { + // Which batch this request is for. + BatchHeader batch_header = 1; + // The chunks for each blob in the batch to be stored in an EigenDA Node. + repeated Blob blobs = 2; +} + +message StoreChunksReply { + // The operator's BLS signature signed on the batch header hash. + bytes signature = 1; +} + +message StoreBlobsRequest { + // Blobs to store + repeated Blob blobs = 1; + // The reference block number whose state is used to encode the blobs + uint32 reference_block_number = 2; +} + +message StoreBlobsReply { + // The operator's BLS sgnature signed on the blob header hashes. + // The ordering of the signatures must match the ordering of the blobs sent + // in the request, with empty signatures in the places for discarded blobs. + repeated google.protobuf.BytesValue signatures = 1; +} + +message AttestBatchRequest { + // header of the batch + BatchHeader batch_header = 1; + // the header hashes of all blobs in the batch + repeated bytes blob_header_hashes = 2; +} + +message AttestBatchReply { + bytes signature = 1; +} + +message RetrieveChunksRequest { + // The hash of the ReducedBatchHeader defined onchain, see: + // https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/interfaces/IEigenDAServiceManager.sol#L43 + // This identifies which batch to retrieve for. + bytes batch_header_hash = 1; + // Which blob in the batch to retrieve for (note: a batch is logically an ordered + // list of blobs). + uint32 blob_index = 2; + // Which quorum of the blob to retrieve for (note: a blob can have multiple + // quorums and the chunks for different quorums at a Node can be different). + // The ID must be in range [0, 254]. + uint32 quorum_id = 3; +} + +// This describes how the chunks returned in RetrieveChunksReply are encoded. +// Used to facilitate the decoding of chunks. +enum ChunkEncodingFormat { + UNKNOWN = 0; + GNARK = 1; + GOB = 2; +} + +message RetrieveChunksReply { + // All chunks the Node is storing for the requested blob per RetrieveChunksRequest. + repeated bytes chunks = 1; + // How the above chunks are encoded. + ChunkEncodingFormat chunk_encoding_format = 2; +} + +// See RetrieveChunksRequest for documentation of each parameter of GetBlobHeaderRequest. +message GetBlobHeaderRequest { + bytes batch_header_hash = 1; + uint32 blob_index = 2; + uint32 quorum_id = 3; +} + +message GetBlobHeaderReply { + // The header of the blob requested per GetBlobHeaderRequest. + BlobHeader blob_header = 1; + // Merkle proof that returned blob header belongs to the batch and is + // the batch's MerkleProof.index-th blob. + // This can be checked against the batch root on chain. + MerkleProof proof = 2; +} + +message MerkleProof { + // The proof itself. + repeated bytes hashes = 1; + // Which index (the leaf of the Merkle tree) this proof is for. + uint32 index = 2; +} + +// Types + +// In EigenDA, the original blob to disperse is encoded as a polynomial via taking +// taking different point evaluations (i.e. erasure coding). These points are split +// into disjoint subsets which are assigned to different operator nodes in the EigenDA +// network. +// The data in this message is a subset of these points that are assigned to a +// single operator node. +message Blob { + // Which (original) blob this is for. + BlobHeader header = 1; + // Each bundle contains all chunks for a single quorum of the blob. + // The number of bundles must be equal to the total number of quorums associated + // with the blob, and the ordering must be the same as BlobHeader.quorum_headers. + // Note: an operator may be in some but not all of the quorums; in that case the + // bundle corresponding to that quorum will be empty. + repeated Bundle bundles = 2; +} + +// A Bundle is the collection of chunks associated with a single blob, for a single +// operator and a single quorum. +message Bundle { + // Each chunk corresponds to a collection of points on the polynomial. + // Each chunk has same number of points. + repeated bytes chunks = 1; + // All chunks of the bundle encoded in a byte array. + bytes bundle = 2; +} + +message G2Commitment { + // The A0 element of the X coordinate of G2 point. + bytes x_a0 = 1; + // The A1 element of the X coordinate of G2 point. + bytes x_a1 = 2; + // The A0 element of the Y coordinate of G2 point. + bytes y_a0 = 3; + // The A1 element of the Y coordinate of G2 point. + bytes y_a1 = 4; +} + +message BlobHeader { + // The KZG commitment to the polynomial representing the blob. + common.G1Commitment commitment = 1; + // The KZG commitment to the polynomial representing the blob on G2, it is used + // for proving the degree of the polynomial + G2Commitment length_commitment = 2; + // The low degree proof. It's the KZG commitment to the polynomial shifted to + // the largest SRS degree. + G2Commitment length_proof = 3; + // The length of the original blob in number of symbols (in the field where + // the polynomial is defined). + uint32 length = 4; + // The params of the quorums that this blob participates in. + repeated BlobQuorumInfo quorum_headers = 5; + // The ID of the user who is dispersing this blob to EigenDA. + string account_id = 6; + // The reference block number whose state is used to encode the blob + uint32 reference_block_number = 7; +} + +// See BlobQuorumParam as defined in +// api/proto/disperser/disperser.proto +message BlobQuorumInfo { + uint32 quorum_id = 1; + uint32 adversary_threshold = 2; + uint32 confirmation_threshold = 3; + uint32 chunk_length = 4; + uint32 ratelimit = 5; +} + +// BatchHeader (see core/data.go#BatchHeader) +message BatchHeader { + // The root of the merkle tree with hashes of blob headers as leaves. + bytes batch_root = 1; + // The Ethereum block number at which the batch is dispersed. + uint32 reference_block_number = 3; +} + +// Node info request +message NodeInfoRequest { +} + +// Node info reply +message NodeInfoReply { + string semver = 1; + string arch = 2; + string os = 3; + uint32 num_cpu = 4; + uint64 mem_bytes = 5; +} diff --git a/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/retriever/retriever.proto b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/retriever/retriever.proto new file mode 100644 index 00000000..754a9348 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/eigenDA/proto/retriever/retriever.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; + +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/retriever"; +package retriever; + +// The Retriever is a service for retrieving chunks corresponding to a blob from +// the EigenDA operator nodes and reconstructing the original blob from the chunks. +// This is a client-side library that the users are supposed to operationalize. +// +// Note: Users generally have two ways to retrieve a blob from EigenDA: +// 1) Retrieve from the Disperser that the user initially used for dispersal: the API +// is Disperser.RetrieveBlob() as defined in api/proto/disperser/disperser.proto +// 2) Retrieve directly from the EigenDA Nodes, which is supported by this Retriever. +// +// The Disperser.RetrieveBlob() (the 1st approach) is generally faster and cheaper as the +// Disperser manages the blobs that it has processed, whereas the Retriever.RetrieveBlob() +// (the 2nd approach here) removes the need to trust the Disperser, with the downside of +// worse cost and performance. +service Retriever { + // This fans out request to EigenDA Nodes to retrieve the chunks and returns the + // reconstructed original blob in response. + rpc RetrieveBlob(BlobRequest) returns (BlobReply) {} +} + +message BlobRequest { + // The hash of the ReducedBatchHeader defined onchain, see: + // https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/interfaces/IEigenDAServiceManager.sol#L43 + // This identifies the batch that this blob belongs to. + bytes batch_header_hash = 1; + // Which blob in the batch this is requesting for (note: a batch is logically an + // ordered list of blobs). + uint32 blob_index = 2; + // The Ethereum block number at which the batch for this blob was constructed. + uint32 reference_block_number = 3; + // Which quorum of the blob this is requesting for (note a blob can participate in + // multiple quorums). + uint32 quorum_id = 4; +} + +message BlobReply { + // The blob retrieved and reconstructed from the EigenDA Nodes per BlobRequest. + bytes data = 1; +} diff --git a/clone-agent/eigen-layer/Execution_Service/index.js b/clone-agent/eigen-layer/Execution_Service/index.js new file mode 100644 index 00000000..db64f399 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/index.js @@ -0,0 +1,7 @@ +"use strict"; +const app = require("./configs/app.config") +const PORT = process.env.port || process.env.PORT || 4003 +const dalService = require("./src/dal.service"); + +dalService.init(); +app.listen(PORT, () => console.log("Server started on port:", PORT)) \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/interactiveEigenDA.ts b/clone-agent/eigen-layer/Execution_Service/interactiveEigenDA.ts new file mode 100644 index 00000000..0b6b163b --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/interactiveEigenDA.ts @@ -0,0 +1,165 @@ +import * as grpc from 'grpc'; +import * as readline from 'readline'; + +import { DisperserClient } from './eigenDA/bindings/disperser/disperser_grpc_pb'; +import { + DisperseBlobRequest, + DisperseBlobReply, + BlobStatusRequest, + BlobStatusReply, + RetrieveBlobRequest, + RetrieveBlobReply, +} from './eigenDA/bindings/disperser/disperser_pb'; +import { exit } from 'process'; + +const EIGEN_ENDPOINT = 'disperser-holesky.eigenda.xyz:443'; + +async function disperseBlobRoutine(data: any) { + const client = new DisperserClient(EIGEN_ENDPOINT, grpc.credentials.createSsl()); + + const encoded = encode(data); + const request = new DisperseBlobRequest(); + request.setData(encoded); + const response = await disperseBlob(client, request); + console.log(response.toObject()); +} + +async function getBlobRoutine(requestId: string) { + const client = new DisperserClient(EIGEN_ENDPOINT, grpc.credentials.createSsl()); + const statusRequest = new BlobStatusRequest(); + statusRequest.setRequestId(requestId); + const statusResponse = await getBlobStatus(client, statusRequest); + const blobIndex = statusResponse.getInfo()?.getBlobVerificationProof()?.getBlobIndex(); + const batchHeaderHash = statusResponse.getInfo()?.getBlobVerificationProof()?.getBatchMetadata()?.getBatchHeaderHash(); + + if (!blobIndex || !batchHeaderHash) { + console.log('Blob dispersal is still in progress. Blob status:'); + console.log(statusResponse.toObject()); + return; + } + + const retrieveRequest = new RetrieveBlobRequest(); + retrieveRequest.setBlobIndex(blobIndex); + retrieveRequest.setBatchHeaderHash(batchHeaderHash); + const response = await retrieveBlob(client, retrieveRequest); + console.log('Retrieved blob:'); + console.log(response.toObject()); + const data = Buffer.from(response.getData()).toString('utf-8'); + console.log('Decoded data:'); + console.log(data); + console.log(JSON.parse(data.replace(/\0/g, ''))); +} + +function encode(data: any): string { + const inputBuffer = Buffer.from(JSON.stringify(data), 'utf-8'); + const outputBuffer = encodeToBN254FieldElements(inputBuffer); + return outputBuffer.toString('base64'); +} + +function decode(data: string): any { + const inputBuffer = Buffer.from(data, 'base64'); + const outputBuffer = decodeFromBN254FieldElements(inputBuffer); + return JSON.parse(outputBuffer.toString('utf-8')); +} + +function encodeToBN254FieldElements(inputBuffer: Buffer): Buffer { + const nullByte = Buffer.from([0x00]); + const byteGroupSize = 31; + const outputBuffers: Buffer[] = []; + + for (let i = 0; i < inputBuffer.length; i += byteGroupSize) { + // Extract the next 31-byte chunk from the input buffer + const chunk = inputBuffer.subarray(i, i + byteGroupSize); + + // Prepend the chunk with a null byte and push it to the output array + outputBuffers.push(Buffer.concat([nullByte, chunk])); + } + + // Concatenate all chunks into a single output buffer + return Buffer.concat(outputBuffers); +} + +function decodeFromBN254FieldElements(inputBuffer: Buffer): Buffer { + const byteGroupSize = 32; // Original 31 bytes + 1 prepended null byte + const outputBuffers: Buffer[] = []; // Array to hold the buffer chunks after removing null bytes + + for (let i = 0; i < inputBuffer.length; i += byteGroupSize) { + // Calculate the end index for slicing, making sure not to exceed the buffer length + const end = Math.min(i + byteGroupSize, inputBuffer.length); + + // Extract the chunk, skipping the first byte (the prepended null byte) + const chunk = inputBuffer.slice(i + 1, end); + + // Push the chunk to the output array + outputBuffers.push(chunk); + } + + // Concatenate all chunks into a single output buffer + return Buffer.concat(outputBuffers); +} + +function disperseBlob(client: DisperserClient, request: DisperseBlobRequest): Promise { + return new Promise((resolve, reject) => { + client.disperseBlob(request, (err: grpc.ServiceError | null, response: DisperseBlobReply ) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +function getBlobStatus(client: DisperserClient, request: BlobStatusRequest): Promise { + return new Promise((resolve, reject) => { + client.getBlobStatus(request, (err: grpc.ServiceError | null, response: BlobStatusReply) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +function retrieveBlob(client: DisperserClient, request: RetrieveBlobRequest): Promise { + return new Promise((resolve, reject) => { + client.retrieveBlob(request, (err: grpc.ServiceError | null, response: RetrieveBlobReply) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +function prompt(question: string): Promise { + return new Promise((resolve) => { + rl.question(question, (answer) => { + resolve(answer); + }); + }); +} + +async function main() { + const action = parseInt(await prompt("Choose action (1: Disperse Blob, 2: Retrieve Blob): ")); + if (action === 1) { + const data = await prompt("Enter data to disperse: "); + await disperseBlobRoutine(data); + } else if (action === 2) { + const requestId = await prompt("Enter request ID: "); + await getBlobRoutine(requestId); + } else { + console.log(`Unrecognized action: ${action}`); + exit(1); + } + exit(0); +} + +main(); \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/package.json b/clone-agent/eigen-layer/Execution_Service/package.json new file mode 100644 index 00000000..62998f37 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/package.json @@ -0,0 +1,28 @@ +{ + "name": "execution_service", + "version": "1.0.0", + "description": "", + "module": "ESModule", + "main": "index.js", + "scripts": { + "start": "node index.js", + "build": "" + }, + "author": "", + "license": "BUSL-1.1", + "dependencies": { + "@grpc/grpc-js": "^1.11.1", + "@grpc/proto-loader": "^0.7.13", + "@pinata/sdk": "^2.1.0", + "axios": "^1.1.3", + "cors": "^2.8.5", + "dotenv": "^16.0.1", + "ethers": "^6.11.1", + "express": "^4.18.1", + "express-session": "^1.17.3", + "google-protobuf": "^3.21.2", + "grpc-tools": "^1.12.4", + "grpc_tools_node_protoc_ts": "^5.3.3", + "nodemon": "^3.1.0" + } +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/pnpm-lock.yaml b/clone-agent/eigen-layer/Execution_Service/pnpm-lock.yaml new file mode 100644 index 00000000..b990113d --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/pnpm-lock.yaml @@ -0,0 +1,1910 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@grpc/grpc-js': + specifier: ^1.11.1 + version: 1.12.6 + '@grpc/proto-loader': + specifier: ^0.7.13 + version: 0.7.13 + '@pinata/sdk': + specifier: ^2.1.0 + version: 2.1.0 + axios: + specifier: ^1.1.3 + version: 1.7.9 + cors: + specifier: ^2.8.5 + version: 2.8.5 + dotenv: + specifier: ^16.0.1 + version: 16.4.7 + ethers: + specifier: ^6.11.1 + version: 6.13.5 + express: + specifier: ^4.18.1 + version: 4.21.2 + express-session: + specifier: ^1.17.3 + version: 1.18.1 + google-protobuf: + specifier: ^3.21.2 + version: 3.21.4 + grpc-tools: + specifier: ^1.12.4 + version: 1.13.0 + grpc_tools_node_protoc_ts: + specifier: ^5.3.3 + version: 5.3.3 + nodemon: + specifier: ^3.1.0 + version: 3.1.9 + +packages: + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@grpc/grpc-js@1.12.6': + resolution: {integrity: sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@pinata/sdk@2.1.0': + resolution: {integrity: sha512-hkS0tcKtsjf9xhsEBs2Nbey5s+Db7x5rlOH9TaWHBXkJ7IwwOs2xnEDigNaxAHKjYAwcw+m2hzpO5QgOfeF7Zw==} + deprecated: Please install the new IPFS SDK at pinata-web3. More information at https://docs.pinata.cloud/web3/sdk + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + cids@0.7.5: + resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + + cids@0.8.3: + resolution: {integrity: sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA==} + engines: {node: '>=4.0.0', npm: '>=3.0.0'} + deprecated: This module has been superseded by the multiformats module + + class-is@1.1.0: + resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + ethers@6.13.5: + resolution: {integrity: sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==} + engines: {node: '>=14.0.0'} + + express-session@1.18.1: + resolution: {integrity: sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==} + engines: {node: '>= 0.8.0'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@2.5.2: + resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} + engines: {node: '>= 0.12'} + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + google-protobuf@3.15.8: + resolution: {integrity: sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==} + + google-protobuf@3.21.4: + resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + grpc-tools@1.13.0: + resolution: {integrity: sha512-7CbkJ1yWPfX0nHjbYG58BQThNhbICXBZynzCUxCb3LzX5X9B3hQbRY2STiRgIEiLILlK9fgl0z0QVGwPCdXf5g==} + hasBin: true + + grpc_tools_node_protoc_ts@5.3.3: + resolution: {integrity: sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==} + hasBin: true + + handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-ip@3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + + is-ipfs@0.6.3: + resolution: {integrity: sha512-HyRot1dvLcxImtDqPxAaY1miO6WsiP/z7Yxpg2qpaLWv5UdhAPtLvHJ4kMLM0w8GSl8AFsVF23PHe1LzuWrUlQ==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + long@5.2.4: + resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==} + + mafmt@7.1.0: + resolution: {integrity: sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multiaddr@7.5.0: + resolution: {integrity: sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw==} + deprecated: This module is deprecated, please upgrade to @multiformats/multiaddr + + multibase@0.6.1: + resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==} + deprecated: This module has been superseded by the multiformats module + + multibase@0.7.0: + resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==} + deprecated: This module has been superseded by the multiformats module + + multibase@1.0.1: + resolution: {integrity: sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw==} + engines: {node: '>=10.0.0', npm: '>=6.0.0'} + deprecated: This module has been superseded by the multiformats module + + multicodec@1.0.4: + resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==} + deprecated: This module has been superseded by the multiformats module + + multihashes@0.4.21: + resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==} + + multihashes@1.0.1: + resolution: {integrity: sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw==} + engines: {node: '>=10.0.0', npm: '>=6.0.0'} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} + engines: {node: '>=10'} + hasBin: true + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + random-bytes@1.0.0: + resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} + engines: {node: '>= 0.8'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid-safe@2.1.5: + resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} + engines: {node: '>= 0.8'} + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + +snapshots: + + '@adraffy/ens-normalize@1.10.1': {} + + '@grpc/grpc-js@1.12.6': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.4 + protobufjs: 7.4.0 + yargs: 17.7.2 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.7.1 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/hashes@1.3.2': {} + + '@pinata/sdk@2.1.0': + dependencies: + axios: 0.21.4 + form-data: 2.5.2 + is-ipfs: 0.6.3 + path: 0.12.7 + transitivePeerDependencies: + - debug + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + + '@types/node@22.7.5': + dependencies: + undici-types: 6.19.8 + + abbrev@1.1.1: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aproba@2.0.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + array-flatten@1.1.1: {} + + asynckit@0.4.0: {} + + axios@0.21.4: + dependencies: + follow-redirects: 1.15.9 + transitivePeerDependencies: + - debug + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bs58@4.0.1: + dependencies: + base-x: 3.0.10 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + cids@0.7.5: + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 0.6.1 + multicodec: 1.0.4 + multihashes: 0.4.21 + + cids@0.8.3: + dependencies: + buffer: 5.7.1 + class-is: 1.1.0 + multibase: 1.0.1 + multicodec: 1.0.4 + multihashes: 1.0.1 + + class-is@1.1.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie-signature@1.0.7: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + + delayed-stream@1.0.0: {} + + delegates@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@2.0.3: {} + + dotenv@16.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + etag@1.8.1: {} + + ethers@6.13.5: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 22.7.5 + aes-js: 4.0.0-beta.5 + tslib: 2.7.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + express-session@1.18.1: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + on-headers: 1.0.2 + parseurl: 1.3.3 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + transitivePeerDependencies: + - supports-color + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + follow-redirects@1.15.9: {} + + form-data@2.5.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + google-protobuf@3.15.8: {} + + google-protobuf@3.21.4: {} + + gopd@1.2.0: {} + + grpc-tools@1.13.0: + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + transitivePeerDependencies: + - encoding + - supports-color + + grpc_tools_node_protoc_ts@5.3.3: + dependencies: + google-protobuf: 3.15.8 + handlebars: 4.7.7 + + handlebars@4.7.7: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@3.0.0: {} + + has-symbols@1.1.0: {} + + has-unicode@2.0.1: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore-by-default@1.0.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ip-regex@4.3.0: {} + + ipaddr.js@1.9.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-ip@3.1.0: + dependencies: + ip-regex: 4.3.0 + + is-ipfs@0.6.3: + dependencies: + bs58: 4.0.1 + cids: 0.7.5 + mafmt: 7.1.0 + multiaddr: 7.5.0 + multibase: 0.6.1 + multihashes: 0.4.21 + + is-number@7.0.0: {} + + lodash.camelcase@4.3.0: {} + + long@5.2.4: {} + + mafmt@7.1.0: + dependencies: + multiaddr: 7.5.0 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + methods@1.1.2: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multiaddr@7.5.0: + dependencies: + buffer: 5.7.1 + cids: 0.8.3 + class-is: 1.1.0 + is-ip: 3.1.0 + multibase: 0.7.0 + varint: 5.0.2 + + multibase@0.6.1: + dependencies: + base-x: 3.0.10 + buffer: 5.7.1 + + multibase@0.7.0: + dependencies: + base-x: 3.0.10 + buffer: 5.7.1 + + multibase@1.0.1: + dependencies: + base-x: 3.0.10 + buffer: 5.7.1 + + multicodec@1.0.4: + dependencies: + buffer: 5.7.1 + varint: 5.0.2 + + multihashes@0.4.21: + dependencies: + buffer: 5.7.1 + multibase: 0.7.0 + varint: 5.0.2 + + multihashes@1.0.1: + dependencies: + buffer: 5.7.1 + multibase: 1.0.1 + varint: 5.0.2 + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + nodemon@3.1.9: + dependencies: + chokidar: 3.6.0 + debug: 4.4.0(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.7.1 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + + normalize-path@3.0.0: {} + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + parseurl@1.3.3: {} + + path-is-absolute@1.0.1: {} + + path-to-regexp@0.1.12: {} + + path@0.12.7: + dependencies: + process: 0.11.10 + util: 0.10.4 + + picomatch@2.3.1: {} + + process@0.11.10: {} + + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.13.1 + long: 5.2.4 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + pstree.remy@1.1.8: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + random-bytes@1.0.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.7.1: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + setprototypeof@1.2.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.1 + + source-map@0.6.1: {} + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + touch@3.1.1: {} + + tr46@0.0.3: {} + + tslib@2.7.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + uglify-js@3.19.3: + optional: true + + uid-safe@2.1.5: + dependencies: + random-bytes: 1.0.0 + + undefsafe@2.0.5: {} + + undici-types@6.19.8: {} + + undici-types@6.20.0: {} + + unpipe@1.0.0: {} + + util-deprecate@1.0.2: {} + + util@0.10.4: + dependencies: + inherits: 2.0.3 + + utils-merge@1.0.1: {} + + varint@5.0.2: {} + + vary@1.1.2: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/clone-agent/eigen-layer/Execution_Service/src/dal.service.js b/clone-agent/eigen-layer/Execution_Service/src/dal.service.js new file mode 100644 index 00000000..0b03c392 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/src/dal.service.js @@ -0,0 +1,159 @@ +require('dotenv').config(); +const { ethers } = require('ethers'); +const grpc = require('@grpc/grpc-js'); +const { DisperserClient } = require('../eigenDA/bindings/disperser/disperser_grpc_pb'); +const { DisperseBlobRequest, BlobStatusRequest, RetrieveBlobRequest } = require('../eigenDA/bindings/disperser/disperser_pb'); + +const EIGEN_ENDPOINT = 'disperser-holesky.eigenda.xyz:443'; + +var rpcBaseAddress = ''; +var privateKey = ''; +let client; + +function init() { + rpcBaseAddress = process.env.OTHENTIC_CLIENT_RPC_ADDRESS; + privateKey = process.env.PRIVATE_KEY; + client = new DisperserClient(EIGEN_ENDPOINT, grpc.credentials.createSsl()); +} + +async function sendTask(proofOfTask, data, taskDefinitionId) { + var wallet = new ethers.Wallet(privateKey); + var performerAddress = wallet.address; + data = ethers.hexlify(ethers.toUtf8Bytes(data)); + const message = ethers.AbiCoder.defaultAbiCoder().encode(["string", "bytes", "address", "uint16"], [proofOfTask, data, performerAddress, taskDefinitionId]); + const messageHash = ethers.keccak256(message); + const sig = wallet.signingKey.sign(messageHash).serialized; + + const jsonRpcBody = { + jsonrpc: "2.0", + method: "sendTask", + params: [ + proofOfTask, + data, + taskDefinitionId, + performerAddress, + sig, + ] + }; + try { + const provider = new ethers.JsonRpcProvider(rpcBaseAddress); + const response = await provider.send(jsonRpcBody.method, jsonRpcBody.params); + console.log("API response:", response); + } catch (error) { + console.error("Error making API request:", error); + } +} + +async function publishToEigenDA(data) { + let proofOfTask = ''; + let poll = null; + try { + const encoded = encode(data); + const request = new DisperseBlobRequest(); + request.setData(encoded); + const response = await disperseBlob(client, request); + proofOfTask = response.toObject().requestId; + console.log(`proofOfTask: ${proofOfTask}`); + poll = pollForBlobStatus(client, proofOfTask); + } catch (error) { + console.error("Error making API request to EigenDA:", error); + } + return [proofOfTask, poll]; +} + +function pollForBlobStatus(client, cid, interval = 30000) { + const statusRequest = new BlobStatusRequest(); + statusRequest.setRequestId(cid); + + return new Promise((resolve, reject) => { + const poll = setInterval(async () => { + try { + const statusResponse = await getBlobStatus(client, statusRequest); + const blobIndex = statusResponse.getInfo()?.getBlobVerificationProof()?.getBlobIndex(); + const batchHeaderHash = statusResponse.getInfo()?.getBlobVerificationProof()?.getBatchMetadata()?.getBatchHeaderHash(); + + if (blobIndex && batchHeaderHash) { + clearInterval(poll); // Stop polling once we have valid data + + const retrieveRequest = new RetrieveBlobRequest(); + retrieveRequest.setBlobIndex(blobIndex); + retrieveRequest.setBatchHeaderHash(batchHeaderHash); + const response = await retrieveBlob(client, retrieveRequest); + const blob = Buffer.from(response.getData()).toString('utf-8').replace(/\0/g, ''); // regex is necessary because eigenDA encoding includes null bytes which are invalid in JSON + resolve(JSON.parse(blob)); // Return the parsed data + } else { + console.log('Blob dispersal is still in progress. Blob status:'); + console.log(statusResponse.toObject()); + } + } catch (error) { + clearInterval(poll); // Stop polling in case of error + reject(error); // Reject the promise if there's an error + } + }, interval); + }); +} + +function getBlobStatus(client, request) { + return new Promise((resolve, reject) => { + client.getBlobStatus(request, (err, response) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +function disperseBlob(client, request) { + return new Promise((resolve, reject) => { + client.disperseBlob(request, (err, response) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +function retrieveBlob(client, request) { + return new Promise((resolve, reject) => { + client.retrieveBlob(request, (err, response) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +function encode(data) { + const inputBuffer = Buffer.from(JSON.stringify(data), 'utf-8'); + const outputBuffer = encodeToBN254FieldElements(inputBuffer); + return outputBuffer.toString('base64'); +} + +function encodeToBN254FieldElements(inputBuffer) { + const nullByte = Buffer.from([0x00]); + const byteGroupSize = 31; + const outputBuffers = []; + + for (let i = 0; i < inputBuffer.length; i += byteGroupSize) { + // Extract the next 31-byte chunk from the input buffer + const chunk = inputBuffer.subarray(i, i + byteGroupSize); + + // Prepend the chunk with a null byte and push it to the output array + outputBuffers.push(Buffer.concat([nullByte, chunk])); + } + + // Concatenate all chunks into a single output buffer + return Buffer.concat(outputBuffers); +} + +module.exports = { + init, + publishToEigenDA, + sendTask, +} diff --git a/clone-agent/eigen-layer/Execution_Service/src/task.controller.js b/clone-agent/eigen-layer/Execution_Service/src/task.controller.js new file mode 100644 index 00000000..b440381b --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/src/task.controller.js @@ -0,0 +1,47 @@ +"use strict"; +const { Router } = require("express") +const CustomError = require("./utils/validateError"); +const CustomResponse = require("./utils/validateResponse"); +const dalService = require("./dal.service"); + +const router = Router() + +router.post("/execute", async (req, res) => { + console.log("Executing task"); + + var taskDefinitionId = Number(req.body.taskDefinitionId) || 0; + console.log(`taskDefinitionId: ${taskDefinitionId}`); + var threadId = req.body.threadId || 0; + console.log(`threadId: ${threadId}`); + var assistantId = req.body.assistantId || 0; + console.log(`assistantId: ${assistantId}`); + + try { + let data = { + threadId: threadId, + assistantId: assistantId + } + const [cid, poll] = await dalService.publishToEigenDA(data); + res.status(200).send(new CustomResponse( + { + proofOfTask: cid, + data: data, + taskDefinitionId: taskDefinitionId + }, + "Blob dispersion started. Task will be submitted after blob is dispersed." + )); + + const blob = await poll; + console.log(`blob data: ${blob}`); + data = JSON.stringify(data); + await dalService.sendTask(cid, data, taskDefinitionId); + } catch (error) { + console.log(error); + if (!res.headersSent) { + return res.status(500).send(new CustomError("Something went wrong", {})); + } + } +}) + + +module.exports = router diff --git a/clone-agent/eigen-layer/Execution_Service/src/utils/validateError.js b/clone-agent/eigen-layer/Execution_Service/src/utils/validateError.js new file mode 100644 index 00000000..31c5ba0c --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/src/utils/validateError.js @@ -0,0 +1,20 @@ +'use strict'; +module.exports = class CustomError { + error = true + /** + * @type {string} + */ + message + /** + * @type {any} + */ + data + /** + * @param {string} message + * @param {any} data + */ + constructor(message, data) { + this.data = data + this.message = message + } +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/Execution_Service/src/utils/validateResponse.js b/clone-agent/eigen-layer/Execution_Service/src/utils/validateResponse.js new file mode 100644 index 00000000..14439472 --- /dev/null +++ b/clone-agent/eigen-layer/Execution_Service/src/utils/validateResponse.js @@ -0,0 +1,16 @@ +'use strict'; +module.exports = class CustomResponse { + /** + * @type {any} + */ + data + error = false + message = null + /** + * @param {any} data + */ + constructor(data, message) { + this.data = data + this.message = message + } +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/README.md b/clone-agent/eigen-layer/README.md new file mode 100644 index 00000000..ccdd841e --- /dev/null +++ b/clone-agent/eigen-layer/README.md @@ -0,0 +1,130 @@ +# 🍀 Othentic AVS Sample & EigenDA +![EigenDA abstra2ct](https://github.com/user-attachments/assets/bce91d7a-2d41-4bc2-a044-77af232f1dab) + + +# ⚙️ Set Up + +To set up the environment, create a `.env` file with the default Othentic +configurations (see the `.env.example`). + + +# ⬇️ Install the Othentic CLI +Install Othentic CLI with `npm`: + +```console +npm i -g @othentic/othentic-cli +``` + +Verify installation by the command: + +```console +othentic-cli -h +``` +# Prerequisites +You need to register 3 self-deploy Operators with a minimum of 0.01 stETH. + +* Deployer account: + * A minimum of 1.5 holETH (Faucet) + * A minimum of 5 Amoy MATIC (Faucet) +* Operator account x 3 (Script): + * A minimum of 0.02 holETH on Holesky +* ERC-20 token address + +# 📑 Contracts Deployment +To deploy the AVS’s on-chain components, run the following command: + +``` console +othentic-cli network deploy \ + --erc20 0x73967c6a0904aA032C103b4104747E88c566B1A2 \ + --l1-initial-deposit 1000000000000000000 \ + --l2-initial-deposit 2000000000000000000 \ + --name test-avs-name +``` + +# 🛠️ Operators Setup +Register as an operator for both EigenLayer and the AVS +``` console +othentic-cli operator register +``` + +# 🔁 Convert ETH into stETH [Optional] +This command converts 0.012 ETH into stETH before depositing it into EigenLayer pool: + +``` console +othentic-cli operator deposit --strategy stETH --shares 0.01 --convert 0.012 +``` + +Activate your Operator by depositing into EigenLayer +Deposit 0.01 stETH into EigenLayer pool. + +``` console +othentic-cli operator deposit --strategy stETH --shares 0.01 +``` +✅ Your internal Operators are now ready to opt-in to your AVS. + +## ▶️ Run the demo +We provide a sample docker-compose configuration which sets up the following +services: + +- Aggregator node +- 3 Attester nodes +- Validation Service endpoint +- Execution Service endpoint +- Sync Shares of operators across layers + + +run: +```console +docker-compose up --build +``` + +> [!NOTE] +> This might take a few minutes when building the images + + +# ⚡️ Execute a task +To execute a task we send a +POST request to the Execution Service: + + +``` console +curl -X POST +``` +✅ Your demo AVS is functional! + + +### Updating the Othentic node version +To update the `othentic-cli` inside the docker images to the latest version, you +need to rebuild the images using the following command: +```console +docker-compose build --no-cache +``` + +## 🏗️ Architecture +The attester nodes communicate with a Validation Service endpoint that +validates tasks on behalf of the nodes. The attesters then sign the tasks based +on the Validation Service's response. + +Attester nodes can either all communicate with a sole endpoint or +implement their own validation logic. + +### EigenDA +EigenDA serves as the data availability layer for the AVS. The performer uploads the price data as a blob to EigenDA and shares the `blobId` with the rest of the AVS. + +### Execution Service +The execution service is run by the performer node and is used to perform new tasks and share their results with the rest of the network. + +### Validation Service +The validation service can be a sole service or a distributed one and is used by attesters in order to validate the correctness of an execution of a task. +``` +POST task/validate returns (bool) {"proofOfTask": "{proofOfTask}"}; +``` + +### Shares Syncer +Syncs the shares of operators between L1 and L2 at a fixed interval. The default interval is 12h and can be modified in the docker-compose file. + +## Interactive EigenDA CLI Application +In order to understand better how to use and interface EigenDA, we've composed a simple CLI application that allows using EigenDA interactively: +```console +ts-node Execution_Service/interactiveEigenDA.ts +``` diff --git a/clone-agent/eigen-layer/Set_Syncer/Dockerfile b/clone-agent/eigen-layer/Set_Syncer/Dockerfile new file mode 100644 index 00000000..cfce4e8e --- /dev/null +++ b/clone-agent/eigen-layer/Set_Syncer/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22.6 + +RUN npm install -g npm@10.5.0 + +WORKDIR /app + +RUN npm install dotenv + +RUN npm i -g @othentic/othentic-cli + +ADD ./Set_Syncer/index.js ./ + +ADD .env ./ + +ADD ./Set_Syncer/package*.json ./ + +RUN npm ci + +ENTRYPOINT ["node", "index.js" ] diff --git a/clone-agent/eigen-layer/Set_Syncer/index.js b/clone-agent/eigen-layer/Set_Syncer/index.js new file mode 100644 index 00000000..25c4c860 --- /dev/null +++ b/clone-agent/eigen-layer/Set_Syncer/index.js @@ -0,0 +1,40 @@ +const execSync = require('child_process').execSync; +const { ethers } = require('ethers'); +const dotenv = require('dotenv'); +dotenv.config(); +let privateKeyDeployer = process.env.PRIVATE_KEY_DEPLOYER; +if (!privateKeyDeployer) { + console.error("PRIVATE_KEY_DEPLOYER is not set."); + process.exit(1); +} +let privateKeySyncer = process.env.PRIVATE_KEY_SYNCER; +if (!privateKeySyncer) { + console.error("PRIVATE_KEY_SYNCER is not set."); + process.exit(1); +} +if (!privateKeySyncer.startsWith("0x")) { + privateKeySyncer = "0x" + privateKeySyncer; +} + +if (!privateKeyDeployer.startsWith("0x")) { + privateKeyDeployer = "0x" + privateKeyDeployer; +} +try { + const deployerAddress = ethers.computeAddress(privateKeyDeployer); +} catch(e) { + console.error("Invalid PRIVATE_KEY_DEPLOYER"); + process.exit(1); +} +let syncerAddress; +try { + syncerAddress = ethers.computeAddress(privateKeySyncer); +} catch(e){ + console.error("Invalid PRIVATE_KEY_SYNCER"); + process.exit(1); +} +process.env.PRIVATE_KEY = privateKeyDeployer; +const output = execSync(`othentic-cli network set-syncer --syncer-address ${syncerAddress}`, { encoding: 'utf-8'}); +console.log(output); + + + diff --git a/clone-agent/eigen-layer/Set_Syncer/package-lock.json b/clone-agent/eigen-layer/Set_Syncer/package-lock.json new file mode 100644 index 00000000..694f917d --- /dev/null +++ b/clone-agent/eigen-layer/Set_Syncer/package-lock.json @@ -0,0 +1,117 @@ +{ + "name": "set_syncer", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "set_syncer", + "version": "1.0.0", + "license": "UNLICENSED", + "dependencies": { + "dotenv": "16.4.5", + "ethers": "6.13.2" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + }, + "node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ethers": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz", + "integrity": "sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/clone-agent/eigen-layer/Set_Syncer/package.json b/clone-agent/eigen-layer/Set_Syncer/package.json new file mode 100644 index 00000000..8e8d5c49 --- /dev/null +++ b/clone-agent/eigen-layer/Set_Syncer/package.json @@ -0,0 +1,15 @@ +{ + "name": "set_syncer", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "UNLICENSED", + "description": "", + "dependencies": { + "dotenv": "16.4.5", + "ethers": "6.13.2" + } +} diff --git a/clone-agent/eigen-layer/Validation_Service/.dockerignore b/clone-agent/eigen-layer/Validation_Service/.dockerignore new file mode 100644 index 00000000..b512c09d --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/.gitignore b/clone-agent/eigen-layer/Validation_Service/.gitignore new file mode 100644 index 00000000..5ff01ca3 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/.gitignore @@ -0,0 +1,3 @@ +.env +node_modules/* +node_modules/ \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/Dockerfile b/clone-agent/eigen-layer/Validation_Service/Dockerfile new file mode 100644 index 00000000..46a04f28 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/Dockerfile @@ -0,0 +1,19 @@ +FROM node:22.6 + +# Create app directory +WORKDIR /usr/src/app + +# Install app dependencies +# A wildcard is used to ensure both package.json AND package-lock.json are copied +# where available (npm@5+) +COPY package*.json ./ + +RUN npm install +# If you are building your code for production +# RUN npm ci --only=production + +# Bundle app source +COPY . . + +EXPOSE 8080 +CMD [ "node", "index.js" ] \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/configs/app.config.js b/clone-agent/eigen-layer/Validation_Service/configs/app.config.js new file mode 100644 index 00000000..7e60f2c8 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/configs/app.config.js @@ -0,0 +1,15 @@ +"use strict"; +const env = require("dotenv") +env.config() +const express = require("express") +const app = express() +const path = require("path") +const taskController = require("../src/task.controller") +const cors = require('cors') + + +app.use(express.json()) +app.use(cors()) +app.use("/task", taskController) + +module.exports = app \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_grpc_pb.js b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_grpc_pb.js new file mode 100644 index 00000000..97b3a246 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_grpc_pb.js @@ -0,0 +1 @@ +// GENERATED CODE -- NO SERVICES IN PROTO \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_pb.d.ts b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_pb.d.ts new file mode 100644 index 00000000..9ca2bd0a --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_pb.d.ts @@ -0,0 +1,34 @@ +// package: common +// file: common/common.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; + +export class G1Commitment extends jspb.Message { + getX(): Uint8Array | string; + getX_asU8(): Uint8Array; + getX_asB64(): string; + setX(value: Uint8Array | string): G1Commitment; + getY(): Uint8Array | string; + getY_asU8(): Uint8Array; + getY_asB64(): string; + setY(value: Uint8Array | string): G1Commitment; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): G1Commitment.AsObject; + static toObject(includeInstance: boolean, msg: G1Commitment): G1Commitment.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: G1Commitment, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): G1Commitment; + static deserializeBinaryFromReader(message: G1Commitment, reader: jspb.BinaryReader): G1Commitment; +} + +export namespace G1Commitment { + export type AsObject = { + x: Uint8Array | string, + y: Uint8Array | string, + } +} diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_pb.js b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_pb.js new file mode 100644 index 00000000..3dcd7210 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/common/common_pb.js @@ -0,0 +1,254 @@ +// source: common/common.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); + +goog.exportSymbol('proto.common.G1Commitment', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.common.G1Commitment = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.common.G1Commitment, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.common.G1Commitment.displayName = 'proto.common.G1Commitment'; +} + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.common.G1Commitment.prototype.toObject = function(opt_includeInstance) { + return proto.common.G1Commitment.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.common.G1Commitment} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.common.G1Commitment.toObject = function(includeInstance, msg) { + var f, obj = { + x: msg.getX_asB64(), + y: msg.getY_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.common.G1Commitment} + */ +proto.common.G1Commitment.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.common.G1Commitment; + return proto.common.G1Commitment.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.common.G1Commitment} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.common.G1Commitment} + */ +proto.common.G1Commitment.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setX(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setY(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.common.G1Commitment.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.common.G1Commitment.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.common.G1Commitment} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.common.G1Commitment.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getX_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getY_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional bytes x = 1; + * @return {!(string|Uint8Array)} + */ +proto.common.G1Commitment.prototype.getX = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes x = 1; + * This is a type-conversion wrapper around `getX()` + * @return {string} + */ +proto.common.G1Commitment.prototype.getX_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getX())); +}; + + +/** + * optional bytes x = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getX()` + * @return {!Uint8Array} + */ +proto.common.G1Commitment.prototype.getX_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getX())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.common.G1Commitment} returns this + */ +proto.common.G1Commitment.prototype.setX = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes y = 2; + * @return {!(string|Uint8Array)} + */ +proto.common.G1Commitment.prototype.getY = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes y = 2; + * This is a type-conversion wrapper around `getY()` + * @return {string} + */ +proto.common.G1Commitment.prototype.getY_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getY())); +}; + + +/** + * optional bytes y = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getY()` + * @return {!Uint8Array} + */ +proto.common.G1Commitment.prototype.getY_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getY())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.common.G1Commitment} returns this + */ +proto.common.G1Commitment.prototype.setY = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +goog.object.extend(exports, proto.common); diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_grpc_pb.d.ts b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_grpc_pb.d.ts new file mode 100644 index 00000000..16e0accd --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_grpc_pb.d.ts @@ -0,0 +1,92 @@ +// package: disperser +// file: disperser/disperser.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as grpc from "grpc"; +import * as disperser_disperser_pb from "../disperser/disperser_pb"; +import * as common_common_pb from "../common/common_pb"; + +interface IDisperserService extends grpc.ServiceDefinition { + disperseBlob: IDisperserService_IDisperseBlob; + disperseBlobAuthenticated: IDisperserService_IDisperseBlobAuthenticated; + getBlobStatus: IDisperserService_IGetBlobStatus; + retrieveBlob: IDisperserService_IRetrieveBlob; +} + +interface IDisperserService_IDisperseBlob extends grpc.MethodDefinition { + path: "/disperser.Disperser/DisperseBlob"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} +interface IDisperserService_IDisperseBlobAuthenticated extends grpc.MethodDefinition { + path: "/disperser.Disperser/DisperseBlobAuthenticated"; + requestStream: true; + responseStream: true; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} +interface IDisperserService_IGetBlobStatus extends grpc.MethodDefinition { + path: "/disperser.Disperser/GetBlobStatus"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} +interface IDisperserService_IRetrieveBlob extends grpc.MethodDefinition { + path: "/disperser.Disperser/RetrieveBlob"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} + +export const DisperserService: IDisperserService; + +export interface IDisperserServer { + disperseBlob: grpc.handleUnaryCall; + disperseBlobAuthenticated: grpc.handleBidiStreamingCall; + getBlobStatus: grpc.handleUnaryCall; + retrieveBlob: grpc.handleUnaryCall; +} + +export interface IDisperserClient { + disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + disperseBlobAuthenticated(): grpc.ClientDuplexStream; + disperseBlobAuthenticated(options: Partial): grpc.ClientDuplexStream; + disperseBlobAuthenticated(metadata: grpc.Metadata, options?: Partial): grpc.ClientDuplexStream; + getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; +} + +export class DisperserClient extends grpc.Client implements IDisperserClient { + constructor(address: string, credentials: grpc.ChannelCredentials, options?: object); + public disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + public disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + public disperseBlob(request: disperser_disperser_pb.DisperseBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.DisperseBlobReply) => void): grpc.ClientUnaryCall; + public disperseBlobAuthenticated(options?: Partial): grpc.ClientDuplexStream; + public disperseBlobAuthenticated(metadata?: grpc.Metadata, options?: Partial): grpc.ClientDuplexStream; + public getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + public getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + public getBlobStatus(request: disperser_disperser_pb.BlobStatusRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.BlobStatusReply) => void): grpc.ClientUnaryCall; + public retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + public retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; + public retrieveBlob(request: disperser_disperser_pb.RetrieveBlobRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: disperser_disperser_pb.RetrieveBlobReply) => void): grpc.ClientUnaryCall; +} diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_grpc_pb.js b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_grpc_pb.js new file mode 100644 index 00000000..cdc2a5ee --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_grpc_pb.js @@ -0,0 +1,164 @@ +// GENERATED CODE -- DO NOT EDIT! + +'use strict'; +var grpc = require('@grpc/grpc-js'); +var disperser_disperser_pb = require('../disperser/disperser_pb.js'); +var common_common_pb = require('../common/common_pb.js'); + +function serialize_disperser_AuthenticatedReply(arg) { + if (!(arg instanceof disperser_disperser_pb.AuthenticatedReply)) { + throw new Error('Expected argument of type disperser.AuthenticatedReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_AuthenticatedReply(buffer_arg) { + return disperser_disperser_pb.AuthenticatedReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_AuthenticatedRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.AuthenticatedRequest)) { + throw new Error('Expected argument of type disperser.AuthenticatedRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_AuthenticatedRequest(buffer_arg) { + return disperser_disperser_pb.AuthenticatedRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_BlobStatusReply(arg) { + if (!(arg instanceof disperser_disperser_pb.BlobStatusReply)) { + throw new Error('Expected argument of type disperser.BlobStatusReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_BlobStatusReply(buffer_arg) { + return disperser_disperser_pb.BlobStatusReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_BlobStatusRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.BlobStatusRequest)) { + throw new Error('Expected argument of type disperser.BlobStatusRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_BlobStatusRequest(buffer_arg) { + return disperser_disperser_pb.BlobStatusRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_DisperseBlobReply(arg) { + if (!(arg instanceof disperser_disperser_pb.DisperseBlobReply)) { + throw new Error('Expected argument of type disperser.DisperseBlobReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_DisperseBlobReply(buffer_arg) { + return disperser_disperser_pb.DisperseBlobReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_DisperseBlobRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.DisperseBlobRequest)) { + throw new Error('Expected argument of type disperser.DisperseBlobRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_DisperseBlobRequest(buffer_arg) { + return disperser_disperser_pb.DisperseBlobRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_RetrieveBlobReply(arg) { + if (!(arg instanceof disperser_disperser_pb.RetrieveBlobReply)) { + throw new Error('Expected argument of type disperser.RetrieveBlobReply'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_RetrieveBlobReply(buffer_arg) { + return disperser_disperser_pb.RetrieveBlobReply.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_disperser_RetrieveBlobRequest(arg) { + if (!(arg instanceof disperser_disperser_pb.RetrieveBlobRequest)) { + throw new Error('Expected argument of type disperser.RetrieveBlobRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_disperser_RetrieveBlobRequest(buffer_arg) { + return disperser_disperser_pb.RetrieveBlobRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + + +// Disperser defines the public APIs for dispersing blobs. +var DisperserService = exports.DisperserService = { + // This API accepts blob to disperse from clients. + // This executes the dispersal async, i.e. it returns once the request + // is accepted. The client could use GetBlobStatus() API to poll the the + // processing status of the blob. + disperseBlob: { + path: '/disperser.Disperser/DisperseBlob', + requestStream: false, + responseStream: false, + requestType: disperser_disperser_pb.DisperseBlobRequest, + responseType: disperser_disperser_pb.DisperseBlobReply, + requestSerialize: serialize_disperser_DisperseBlobRequest, + requestDeserialize: deserialize_disperser_DisperseBlobRequest, + responseSerialize: serialize_disperser_DisperseBlobReply, + responseDeserialize: deserialize_disperser_DisperseBlobReply, + }, + // DisperseBlobAuthenticated is similar to DisperseBlob, except that it requires the + // client to authenticate itself via the AuthenticationData message. The protoco is as follows: + // 1. The client sends a DisperseBlobAuthenticated request with the DisperseBlobRequest message + // 2. The Disperser sends back a BlobAuthHeader message containing information for the client to + // verify and sign. + // 3. The client verifies the BlobAuthHeader and sends back the signed BlobAuthHeader in an + // AuthenticationData message. + // 4. The Disperser verifies the signature and returns a DisperseBlobReply message. + disperseBlobAuthenticated: { + path: '/disperser.Disperser/DisperseBlobAuthenticated', + requestStream: true, + responseStream: true, + requestType: disperser_disperser_pb.AuthenticatedRequest, + responseType: disperser_disperser_pb.AuthenticatedReply, + requestSerialize: serialize_disperser_AuthenticatedRequest, + requestDeserialize: deserialize_disperser_AuthenticatedRequest, + responseSerialize: serialize_disperser_AuthenticatedReply, + responseDeserialize: deserialize_disperser_AuthenticatedReply, + }, + // This API is meant to be polled for the blob status. + getBlobStatus: { + path: '/disperser.Disperser/GetBlobStatus', + requestStream: false, + responseStream: false, + requestType: disperser_disperser_pb.BlobStatusRequest, + responseType: disperser_disperser_pb.BlobStatusReply, + requestSerialize: serialize_disperser_BlobStatusRequest, + requestDeserialize: deserialize_disperser_BlobStatusRequest, + responseSerialize: serialize_disperser_BlobStatusReply, + responseDeserialize: deserialize_disperser_BlobStatusReply, + }, + // This retrieves the requested blob from the Disperser's backend. + // This is a more efficient way to retrieve blobs than directly retrieving + // from the DA Nodes (see detail about this approach in + // api/proto/retriever/retriever.proto). + // The blob should have been initially dispersed via this Disperser service + // for this API to work. + retrieveBlob: { + path: '/disperser.Disperser/RetrieveBlob', + requestStream: false, + responseStream: false, + requestType: disperser_disperser_pb.RetrieveBlobRequest, + responseType: disperser_disperser_pb.RetrieveBlobReply, + requestSerialize: serialize_disperser_RetrieveBlobRequest, + requestDeserialize: deserialize_disperser_RetrieveBlobRequest, + responseSerialize: serialize_disperser_RetrieveBlobReply, + responseDeserialize: deserialize_disperser_RetrieveBlobReply, + }, +}; + +exports.DisperserClient = grpc.makeGenericClientConstructor(DisperserService); diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_pb.d.ts b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_pb.d.ts new file mode 100644 index 00000000..b0fe87d9 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_pb.d.ts @@ -0,0 +1,490 @@ +// package: disperser +// file: disperser/disperser.proto + +/* tslint:disable */ +/* eslint-disable */ + +import * as jspb from "google-protobuf"; +import * as common_common_pb from "../common/common_pb"; + +export class AuthenticatedRequest extends jspb.Message { + + hasDisperseRequest(): boolean; + clearDisperseRequest(): void; + getDisperseRequest(): DisperseBlobRequest | undefined; + setDisperseRequest(value?: DisperseBlobRequest): AuthenticatedRequest; + + hasAuthenticationData(): boolean; + clearAuthenticationData(): void; + getAuthenticationData(): AuthenticationData | undefined; + setAuthenticationData(value?: AuthenticationData): AuthenticatedRequest; + + getPayloadCase(): AuthenticatedRequest.PayloadCase; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AuthenticatedRequest.AsObject; + static toObject(includeInstance: boolean, msg: AuthenticatedRequest): AuthenticatedRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AuthenticatedRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AuthenticatedRequest; + static deserializeBinaryFromReader(message: AuthenticatedRequest, reader: jspb.BinaryReader): AuthenticatedRequest; +} + +export namespace AuthenticatedRequest { + export type AsObject = { + disperseRequest?: DisperseBlobRequest.AsObject, + authenticationData?: AuthenticationData.AsObject, + } + + export enum PayloadCase { + PAYLOAD_NOT_SET = 0, + DISPERSE_REQUEST = 1, + AUTHENTICATION_DATA = 2, + } + +} + +export class AuthenticatedReply extends jspb.Message { + + hasBlobAuthHeader(): boolean; + clearBlobAuthHeader(): void; + getBlobAuthHeader(): BlobAuthHeader | undefined; + setBlobAuthHeader(value?: BlobAuthHeader): AuthenticatedReply; + + hasDisperseReply(): boolean; + clearDisperseReply(): void; + getDisperseReply(): DisperseBlobReply | undefined; + setDisperseReply(value?: DisperseBlobReply): AuthenticatedReply; + + getPayloadCase(): AuthenticatedReply.PayloadCase; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AuthenticatedReply.AsObject; + static toObject(includeInstance: boolean, msg: AuthenticatedReply): AuthenticatedReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AuthenticatedReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AuthenticatedReply; + static deserializeBinaryFromReader(message: AuthenticatedReply, reader: jspb.BinaryReader): AuthenticatedReply; +} + +export namespace AuthenticatedReply { + export type AsObject = { + blobAuthHeader?: BlobAuthHeader.AsObject, + disperseReply?: DisperseBlobReply.AsObject, + } + + export enum PayloadCase { + PAYLOAD_NOT_SET = 0, + BLOB_AUTH_HEADER = 1, + DISPERSE_REPLY = 2, + } + +} + +export class BlobAuthHeader extends jspb.Message { + getChallengeParameter(): number; + setChallengeParameter(value: number): BlobAuthHeader; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobAuthHeader.AsObject; + static toObject(includeInstance: boolean, msg: BlobAuthHeader): BlobAuthHeader.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobAuthHeader, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobAuthHeader; + static deserializeBinaryFromReader(message: BlobAuthHeader, reader: jspb.BinaryReader): BlobAuthHeader; +} + +export namespace BlobAuthHeader { + export type AsObject = { + challengeParameter: number, + } +} + +export class AuthenticationData extends jspb.Message { + getAuthenticationData(): Uint8Array | string; + getAuthenticationData_asU8(): Uint8Array; + getAuthenticationData_asB64(): string; + setAuthenticationData(value: Uint8Array | string): AuthenticationData; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): AuthenticationData.AsObject; + static toObject(includeInstance: boolean, msg: AuthenticationData): AuthenticationData.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: AuthenticationData, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): AuthenticationData; + static deserializeBinaryFromReader(message: AuthenticationData, reader: jspb.BinaryReader): AuthenticationData; +} + +export namespace AuthenticationData { + export type AsObject = { + authenticationData: Uint8Array | string, + } +} + +export class DisperseBlobRequest extends jspb.Message { + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): DisperseBlobRequest; + clearCustomQuorumNumbersList(): void; + getCustomQuorumNumbersList(): Array; + setCustomQuorumNumbersList(value: Array): DisperseBlobRequest; + addCustomQuorumNumbers(value: number, index?: number): number; + getAccountId(): string; + setAccountId(value: string): DisperseBlobRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DisperseBlobRequest.AsObject; + static toObject(includeInstance: boolean, msg: DisperseBlobRequest): DisperseBlobRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DisperseBlobRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DisperseBlobRequest; + static deserializeBinaryFromReader(message: DisperseBlobRequest, reader: jspb.BinaryReader): DisperseBlobRequest; +} + +export namespace DisperseBlobRequest { + export type AsObject = { + data: Uint8Array | string, + customQuorumNumbersList: Array, + accountId: string, + } +} + +export class DisperseBlobReply extends jspb.Message { + getResult(): BlobStatus; + setResult(value: BlobStatus): DisperseBlobReply; + getRequestId(): Uint8Array | string; + getRequestId_asU8(): Uint8Array; + getRequestId_asB64(): string; + setRequestId(value: Uint8Array | string): DisperseBlobReply; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DisperseBlobReply.AsObject; + static toObject(includeInstance: boolean, msg: DisperseBlobReply): DisperseBlobReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DisperseBlobReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DisperseBlobReply; + static deserializeBinaryFromReader(message: DisperseBlobReply, reader: jspb.BinaryReader): DisperseBlobReply; +} + +export namespace DisperseBlobReply { + export type AsObject = { + result: BlobStatus, + requestId: Uint8Array | string, + } +} + +export class BlobStatusRequest extends jspb.Message { + getRequestId(): Uint8Array | string; + getRequestId_asU8(): Uint8Array; + getRequestId_asB64(): string; + setRequestId(value: Uint8Array | string): BlobStatusRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobStatusRequest.AsObject; + static toObject(includeInstance: boolean, msg: BlobStatusRequest): BlobStatusRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobStatusRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobStatusRequest; + static deserializeBinaryFromReader(message: BlobStatusRequest, reader: jspb.BinaryReader): BlobStatusRequest; +} + +export namespace BlobStatusRequest { + export type AsObject = { + requestId: Uint8Array | string, + } +} + +export class BlobStatusReply extends jspb.Message { + getStatus(): BlobStatus; + setStatus(value: BlobStatus): BlobStatusReply; + + hasInfo(): boolean; + clearInfo(): void; + getInfo(): BlobInfo | undefined; + setInfo(value?: BlobInfo): BlobStatusReply; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobStatusReply.AsObject; + static toObject(includeInstance: boolean, msg: BlobStatusReply): BlobStatusReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobStatusReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobStatusReply; + static deserializeBinaryFromReader(message: BlobStatusReply, reader: jspb.BinaryReader): BlobStatusReply; +} + +export namespace BlobStatusReply { + export type AsObject = { + status: BlobStatus, + info?: BlobInfo.AsObject, + } +} + +export class RetrieveBlobRequest extends jspb.Message { + getBatchHeaderHash(): Uint8Array | string; + getBatchHeaderHash_asU8(): Uint8Array; + getBatchHeaderHash_asB64(): string; + setBatchHeaderHash(value: Uint8Array | string): RetrieveBlobRequest; + getBlobIndex(): number; + setBlobIndex(value: number): RetrieveBlobRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): RetrieveBlobRequest.AsObject; + static toObject(includeInstance: boolean, msg: RetrieveBlobRequest): RetrieveBlobRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: RetrieveBlobRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): RetrieveBlobRequest; + static deserializeBinaryFromReader(message: RetrieveBlobRequest, reader: jspb.BinaryReader): RetrieveBlobRequest; +} + +export namespace RetrieveBlobRequest { + export type AsObject = { + batchHeaderHash: Uint8Array | string, + blobIndex: number, + } +} + +export class RetrieveBlobReply extends jspb.Message { + getData(): Uint8Array | string; + getData_asU8(): Uint8Array; + getData_asB64(): string; + setData(value: Uint8Array | string): RetrieveBlobReply; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): RetrieveBlobReply.AsObject; + static toObject(includeInstance: boolean, msg: RetrieveBlobReply): RetrieveBlobReply.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: RetrieveBlobReply, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): RetrieveBlobReply; + static deserializeBinaryFromReader(message: RetrieveBlobReply, reader: jspb.BinaryReader): RetrieveBlobReply; +} + +export namespace RetrieveBlobReply { + export type AsObject = { + data: Uint8Array | string, + } +} + +export class BlobInfo extends jspb.Message { + + hasBlobHeader(): boolean; + clearBlobHeader(): void; + getBlobHeader(): BlobHeader | undefined; + setBlobHeader(value?: BlobHeader): BlobInfo; + + hasBlobVerificationProof(): boolean; + clearBlobVerificationProof(): void; + getBlobVerificationProof(): BlobVerificationProof | undefined; + setBlobVerificationProof(value?: BlobVerificationProof): BlobInfo; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobInfo.AsObject; + static toObject(includeInstance: boolean, msg: BlobInfo): BlobInfo.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobInfo, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobInfo; + static deserializeBinaryFromReader(message: BlobInfo, reader: jspb.BinaryReader): BlobInfo; +} + +export namespace BlobInfo { + export type AsObject = { + blobHeader?: BlobHeader.AsObject, + blobVerificationProof?: BlobVerificationProof.AsObject, + } +} + +export class BlobHeader extends jspb.Message { + + hasCommitment(): boolean; + clearCommitment(): void; + getCommitment(): common_common_pb.G1Commitment | undefined; + setCommitment(value?: common_common_pb.G1Commitment): BlobHeader; + getDataLength(): number; + setDataLength(value: number): BlobHeader; + clearBlobQuorumParamsList(): void; + getBlobQuorumParamsList(): Array; + setBlobQuorumParamsList(value: Array): BlobHeader; + addBlobQuorumParams(value?: BlobQuorumParam, index?: number): BlobQuorumParam; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobHeader.AsObject; + static toObject(includeInstance: boolean, msg: BlobHeader): BlobHeader.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobHeader, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobHeader; + static deserializeBinaryFromReader(message: BlobHeader, reader: jspb.BinaryReader): BlobHeader; +} + +export namespace BlobHeader { + export type AsObject = { + commitment?: common_common_pb.G1Commitment.AsObject, + dataLength: number, + blobQuorumParamsList: Array, + } +} + +export class BlobQuorumParam extends jspb.Message { + getQuorumNumber(): number; + setQuorumNumber(value: number): BlobQuorumParam; + getAdversaryThresholdPercentage(): number; + setAdversaryThresholdPercentage(value: number): BlobQuorumParam; + getConfirmationThresholdPercentage(): number; + setConfirmationThresholdPercentage(value: number): BlobQuorumParam; + getChunkLength(): number; + setChunkLength(value: number): BlobQuorumParam; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobQuorumParam.AsObject; + static toObject(includeInstance: boolean, msg: BlobQuorumParam): BlobQuorumParam.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobQuorumParam, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobQuorumParam; + static deserializeBinaryFromReader(message: BlobQuorumParam, reader: jspb.BinaryReader): BlobQuorumParam; +} + +export namespace BlobQuorumParam { + export type AsObject = { + quorumNumber: number, + adversaryThresholdPercentage: number, + confirmationThresholdPercentage: number, + chunkLength: number, + } +} + +export class BlobVerificationProof extends jspb.Message { + getBatchId(): number; + setBatchId(value: number): BlobVerificationProof; + getBlobIndex(): number; + setBlobIndex(value: number): BlobVerificationProof; + + hasBatchMetadata(): boolean; + clearBatchMetadata(): void; + getBatchMetadata(): BatchMetadata | undefined; + setBatchMetadata(value?: BatchMetadata): BlobVerificationProof; + getInclusionProof(): Uint8Array | string; + getInclusionProof_asU8(): Uint8Array; + getInclusionProof_asB64(): string; + setInclusionProof(value: Uint8Array | string): BlobVerificationProof; + getQuorumIndexes(): Uint8Array | string; + getQuorumIndexes_asU8(): Uint8Array; + getQuorumIndexes_asB64(): string; + setQuorumIndexes(value: Uint8Array | string): BlobVerificationProof; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BlobVerificationProof.AsObject; + static toObject(includeInstance: boolean, msg: BlobVerificationProof): BlobVerificationProof.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BlobVerificationProof, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BlobVerificationProof; + static deserializeBinaryFromReader(message: BlobVerificationProof, reader: jspb.BinaryReader): BlobVerificationProof; +} + +export namespace BlobVerificationProof { + export type AsObject = { + batchId: number, + blobIndex: number, + batchMetadata?: BatchMetadata.AsObject, + inclusionProof: Uint8Array | string, + quorumIndexes: Uint8Array | string, + } +} + +export class BatchMetadata extends jspb.Message { + + hasBatchHeader(): boolean; + clearBatchHeader(): void; + getBatchHeader(): BatchHeader | undefined; + setBatchHeader(value?: BatchHeader): BatchMetadata; + getSignatoryRecordHash(): Uint8Array | string; + getSignatoryRecordHash_asU8(): Uint8Array; + getSignatoryRecordHash_asB64(): string; + setSignatoryRecordHash(value: Uint8Array | string): BatchMetadata; + getFee(): Uint8Array | string; + getFee_asU8(): Uint8Array; + getFee_asB64(): string; + setFee(value: Uint8Array | string): BatchMetadata; + getConfirmationBlockNumber(): number; + setConfirmationBlockNumber(value: number): BatchMetadata; + getBatchHeaderHash(): Uint8Array | string; + getBatchHeaderHash_asU8(): Uint8Array; + getBatchHeaderHash_asB64(): string; + setBatchHeaderHash(value: Uint8Array | string): BatchMetadata; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BatchMetadata.AsObject; + static toObject(includeInstance: boolean, msg: BatchMetadata): BatchMetadata.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BatchMetadata, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BatchMetadata; + static deserializeBinaryFromReader(message: BatchMetadata, reader: jspb.BinaryReader): BatchMetadata; +} + +export namespace BatchMetadata { + export type AsObject = { + batchHeader?: BatchHeader.AsObject, + signatoryRecordHash: Uint8Array | string, + fee: Uint8Array | string, + confirmationBlockNumber: number, + batchHeaderHash: Uint8Array | string, + } +} + +export class BatchHeader extends jspb.Message { + getBatchRoot(): Uint8Array | string; + getBatchRoot_asU8(): Uint8Array; + getBatchRoot_asB64(): string; + setBatchRoot(value: Uint8Array | string): BatchHeader; + getQuorumNumbers(): Uint8Array | string; + getQuorumNumbers_asU8(): Uint8Array; + getQuorumNumbers_asB64(): string; + setQuorumNumbers(value: Uint8Array | string): BatchHeader; + getQuorumSignedPercentages(): Uint8Array | string; + getQuorumSignedPercentages_asU8(): Uint8Array; + getQuorumSignedPercentages_asB64(): string; + setQuorumSignedPercentages(value: Uint8Array | string): BatchHeader; + getReferenceBlockNumber(): number; + setReferenceBlockNumber(value: number): BatchHeader; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): BatchHeader.AsObject; + static toObject(includeInstance: boolean, msg: BatchHeader): BatchHeader.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: BatchHeader, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): BatchHeader; + static deserializeBinaryFromReader(message: BatchHeader, reader: jspb.BinaryReader): BatchHeader; +} + +export namespace BatchHeader { + export type AsObject = { + batchRoot: Uint8Array | string, + quorumNumbers: Uint8Array | string, + quorumSignedPercentages: Uint8Array | string, + referenceBlockNumber: number, + } +} + +export enum BlobStatus { + UNKNOWN = 0, + PROCESSING = 1, + CONFIRMED = 2, + FAILED = 3, + FINALIZED = 4, + INSUFFICIENT_SIGNATURES = 5, + DISPERSING = 6, +} diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_pb.js b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_pb.js new file mode 100644 index 00000000..3bf5ea3f --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/bindings/disperser/disperser_pb.js @@ -0,0 +1,3850 @@ +// source: disperser/disperser.proto +/** + * @fileoverview + * @enhanceable + * @suppress {missingRequire} reports error on implicit type usages. + * @suppress {messageConventions} JS Compiler reports an error if a variable or + * field starts with 'MSG_' and isn't a translatable message. + * @public + */ +// GENERATED CODE -- DO NOT EDIT! +/* eslint-disable */ +// @ts-nocheck + +var jspb = require('google-protobuf'); +var goog = jspb; +var global = (function() { + if (this) { return this; } + if (typeof window !== 'undefined') { return window; } + if (typeof global !== 'undefined') { return global; } + if (typeof self !== 'undefined') { return self; } + return Function('return this')(); +}.call(null)); + +var common_common_pb = require('../common/common_pb.js'); +goog.object.extend(proto, common_common_pb); +goog.exportSymbol('proto.disperser.AuthenticatedReply', null, global); +goog.exportSymbol('proto.disperser.AuthenticatedReply.PayloadCase', null, global); +goog.exportSymbol('proto.disperser.AuthenticatedRequest', null, global); +goog.exportSymbol('proto.disperser.AuthenticatedRequest.PayloadCase', null, global); +goog.exportSymbol('proto.disperser.AuthenticationData', null, global); +goog.exportSymbol('proto.disperser.BatchHeader', null, global); +goog.exportSymbol('proto.disperser.BatchMetadata', null, global); +goog.exportSymbol('proto.disperser.BlobAuthHeader', null, global); +goog.exportSymbol('proto.disperser.BlobHeader', null, global); +goog.exportSymbol('proto.disperser.BlobInfo', null, global); +goog.exportSymbol('proto.disperser.BlobQuorumParam', null, global); +goog.exportSymbol('proto.disperser.BlobStatus', null, global); +goog.exportSymbol('proto.disperser.BlobStatusReply', null, global); +goog.exportSymbol('proto.disperser.BlobStatusRequest', null, global); +goog.exportSymbol('proto.disperser.BlobVerificationProof', null, global); +goog.exportSymbol('proto.disperser.DisperseBlobReply', null, global); +goog.exportSymbol('proto.disperser.DisperseBlobRequest', null, global); +goog.exportSymbol('proto.disperser.RetrieveBlobReply', null, global); +goog.exportSymbol('proto.disperser.RetrieveBlobRequest', null, global); +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.AuthenticatedRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.disperser.AuthenticatedRequest.oneofGroups_); +}; +goog.inherits(proto.disperser.AuthenticatedRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.AuthenticatedRequest.displayName = 'proto.disperser.AuthenticatedRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.AuthenticatedReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, proto.disperser.AuthenticatedReply.oneofGroups_); +}; +goog.inherits(proto.disperser.AuthenticatedReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.AuthenticatedReply.displayName = 'proto.disperser.AuthenticatedReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobAuthHeader = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobAuthHeader, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobAuthHeader.displayName = 'proto.disperser.BlobAuthHeader'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.AuthenticationData = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.AuthenticationData, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.AuthenticationData.displayName = 'proto.disperser.AuthenticationData'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.DisperseBlobRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.disperser.DisperseBlobRequest.repeatedFields_, null); +}; +goog.inherits(proto.disperser.DisperseBlobRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.DisperseBlobRequest.displayName = 'proto.disperser.DisperseBlobRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.DisperseBlobReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.DisperseBlobReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.DisperseBlobReply.displayName = 'proto.disperser.DisperseBlobReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobStatusRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobStatusRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobStatusRequest.displayName = 'proto.disperser.BlobStatusRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobStatusReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobStatusReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobStatusReply.displayName = 'proto.disperser.BlobStatusReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.RetrieveBlobRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.RetrieveBlobRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.RetrieveBlobRequest.displayName = 'proto.disperser.RetrieveBlobRequest'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.RetrieveBlobReply = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.RetrieveBlobReply, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.RetrieveBlobReply.displayName = 'proto.disperser.RetrieveBlobReply'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobInfo, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobInfo.displayName = 'proto.disperser.BlobInfo'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobHeader = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.disperser.BlobHeader.repeatedFields_, null); +}; +goog.inherits(proto.disperser.BlobHeader, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobHeader.displayName = 'proto.disperser.BlobHeader'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobQuorumParam = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobQuorumParam, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobQuorumParam.displayName = 'proto.disperser.BlobQuorumParam'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BlobVerificationProof = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BlobVerificationProof, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BlobVerificationProof.displayName = 'proto.disperser.BlobVerificationProof'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BatchMetadata = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BatchMetadata, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BatchMetadata.displayName = 'proto.disperser.BatchMetadata'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.disperser.BatchHeader = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.disperser.BatchHeader, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.disperser.BatchHeader.displayName = 'proto.disperser.BatchHeader'; +} + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.disperser.AuthenticatedRequest.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.disperser.AuthenticatedRequest.PayloadCase = { + PAYLOAD_NOT_SET: 0, + DISPERSE_REQUEST: 1, + AUTHENTICATION_DATA: 2 +}; + +/** + * @return {proto.disperser.AuthenticatedRequest.PayloadCase} + */ +proto.disperser.AuthenticatedRequest.prototype.getPayloadCase = function() { + return /** @type {proto.disperser.AuthenticatedRequest.PayloadCase} */(jspb.Message.computeOneofCase(this, proto.disperser.AuthenticatedRequest.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.AuthenticatedRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.AuthenticatedRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.AuthenticatedRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedRequest.toObject = function(includeInstance, msg) { + var f, obj = { + disperseRequest: (f = msg.getDisperseRequest()) && proto.disperser.DisperseBlobRequest.toObject(includeInstance, f), + authenticationData: (f = msg.getAuthenticationData()) && proto.disperser.AuthenticationData.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.AuthenticatedRequest} + */ +proto.disperser.AuthenticatedRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.AuthenticatedRequest; + return proto.disperser.AuthenticatedRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.AuthenticatedRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.AuthenticatedRequest} + */ +proto.disperser.AuthenticatedRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.DisperseBlobRequest; + reader.readMessage(value,proto.disperser.DisperseBlobRequest.deserializeBinaryFromReader); + msg.setDisperseRequest(value); + break; + case 2: + var value = new proto.disperser.AuthenticationData; + reader.readMessage(value,proto.disperser.AuthenticationData.deserializeBinaryFromReader); + msg.setAuthenticationData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.AuthenticatedRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.AuthenticatedRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.AuthenticatedRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getDisperseRequest(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.DisperseBlobRequest.serializeBinaryToWriter + ); + } + f = message.getAuthenticationData(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.AuthenticationData.serializeBinaryToWriter + ); + } +}; + + +/** + * optional DisperseBlobRequest disperse_request = 1; + * @return {?proto.disperser.DisperseBlobRequest} + */ +proto.disperser.AuthenticatedRequest.prototype.getDisperseRequest = function() { + return /** @type{?proto.disperser.DisperseBlobRequest} */ ( + jspb.Message.getWrapperField(this, proto.disperser.DisperseBlobRequest, 1)); +}; + + +/** + * @param {?proto.disperser.DisperseBlobRequest|undefined} value + * @return {!proto.disperser.AuthenticatedRequest} returns this +*/ +proto.disperser.AuthenticatedRequest.prototype.setDisperseRequest = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.disperser.AuthenticatedRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedRequest} returns this + */ +proto.disperser.AuthenticatedRequest.prototype.clearDisperseRequest = function() { + return this.setDisperseRequest(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedRequest.prototype.hasDisperseRequest = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional AuthenticationData authentication_data = 2; + * @return {?proto.disperser.AuthenticationData} + */ +proto.disperser.AuthenticatedRequest.prototype.getAuthenticationData = function() { + return /** @type{?proto.disperser.AuthenticationData} */ ( + jspb.Message.getWrapperField(this, proto.disperser.AuthenticationData, 2)); +}; + + +/** + * @param {?proto.disperser.AuthenticationData|undefined} value + * @return {!proto.disperser.AuthenticatedRequest} returns this +*/ +proto.disperser.AuthenticatedRequest.prototype.setAuthenticationData = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.disperser.AuthenticatedRequest.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedRequest} returns this + */ +proto.disperser.AuthenticatedRequest.prototype.clearAuthenticationData = function() { + return this.setAuthenticationData(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedRequest.prototype.hasAuthenticationData = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * Oneof group definitions for this message. Each group defines the field + * numbers belonging to that group. When of these fields' value is set, all + * other fields in the group are cleared. During deserialization, if multiple + * fields are encountered for a group, only the last value seen will be kept. + * @private {!Array>} + * @const + */ +proto.disperser.AuthenticatedReply.oneofGroups_ = [[1,2]]; + +/** + * @enum {number} + */ +proto.disperser.AuthenticatedReply.PayloadCase = { + PAYLOAD_NOT_SET: 0, + BLOB_AUTH_HEADER: 1, + DISPERSE_REPLY: 2 +}; + +/** + * @return {proto.disperser.AuthenticatedReply.PayloadCase} + */ +proto.disperser.AuthenticatedReply.prototype.getPayloadCase = function() { + return /** @type {proto.disperser.AuthenticatedReply.PayloadCase} */(jspb.Message.computeOneofCase(this, proto.disperser.AuthenticatedReply.oneofGroups_[0])); +}; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.AuthenticatedReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.AuthenticatedReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.AuthenticatedReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedReply.toObject = function(includeInstance, msg) { + var f, obj = { + blobAuthHeader: (f = msg.getBlobAuthHeader()) && proto.disperser.BlobAuthHeader.toObject(includeInstance, f), + disperseReply: (f = msg.getDisperseReply()) && proto.disperser.DisperseBlobReply.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.AuthenticatedReply} + */ +proto.disperser.AuthenticatedReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.AuthenticatedReply; + return proto.disperser.AuthenticatedReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.AuthenticatedReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.AuthenticatedReply} + */ +proto.disperser.AuthenticatedReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.BlobAuthHeader; + reader.readMessage(value,proto.disperser.BlobAuthHeader.deserializeBinaryFromReader); + msg.setBlobAuthHeader(value); + break; + case 2: + var value = new proto.disperser.DisperseBlobReply; + reader.readMessage(value,proto.disperser.DisperseBlobReply.deserializeBinaryFromReader); + msg.setDisperseReply(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.AuthenticatedReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.AuthenticatedReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.AuthenticatedReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticatedReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBlobAuthHeader(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.BlobAuthHeader.serializeBinaryToWriter + ); + } + f = message.getDisperseReply(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.DisperseBlobReply.serializeBinaryToWriter + ); + } +}; + + +/** + * optional BlobAuthHeader blob_auth_header = 1; + * @return {?proto.disperser.BlobAuthHeader} + */ +proto.disperser.AuthenticatedReply.prototype.getBlobAuthHeader = function() { + return /** @type{?proto.disperser.BlobAuthHeader} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobAuthHeader, 1)); +}; + + +/** + * @param {?proto.disperser.BlobAuthHeader|undefined} value + * @return {!proto.disperser.AuthenticatedReply} returns this +*/ +proto.disperser.AuthenticatedReply.prototype.setBlobAuthHeader = function(value) { + return jspb.Message.setOneofWrapperField(this, 1, proto.disperser.AuthenticatedReply.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedReply} returns this + */ +proto.disperser.AuthenticatedReply.prototype.clearBlobAuthHeader = function() { + return this.setBlobAuthHeader(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedReply.prototype.hasBlobAuthHeader = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional DisperseBlobReply disperse_reply = 2; + * @return {?proto.disperser.DisperseBlobReply} + */ +proto.disperser.AuthenticatedReply.prototype.getDisperseReply = function() { + return /** @type{?proto.disperser.DisperseBlobReply} */ ( + jspb.Message.getWrapperField(this, proto.disperser.DisperseBlobReply, 2)); +}; + + +/** + * @param {?proto.disperser.DisperseBlobReply|undefined} value + * @return {!proto.disperser.AuthenticatedReply} returns this +*/ +proto.disperser.AuthenticatedReply.prototype.setDisperseReply = function(value) { + return jspb.Message.setOneofWrapperField(this, 2, proto.disperser.AuthenticatedReply.oneofGroups_[0], value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.AuthenticatedReply} returns this + */ +proto.disperser.AuthenticatedReply.prototype.clearDisperseReply = function() { + return this.setDisperseReply(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.AuthenticatedReply.prototype.hasDisperseReply = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobAuthHeader.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobAuthHeader.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobAuthHeader} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobAuthHeader.toObject = function(includeInstance, msg) { + var f, obj = { + challengeParameter: jspb.Message.getFieldWithDefault(msg, 1, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobAuthHeader} + */ +proto.disperser.BlobAuthHeader.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobAuthHeader; + return proto.disperser.BlobAuthHeader.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobAuthHeader} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobAuthHeader} + */ +proto.disperser.BlobAuthHeader.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setChallengeParameter(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobAuthHeader.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobAuthHeader.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobAuthHeader} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobAuthHeader.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getChallengeParameter(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } +}; + + +/** + * optional uint32 challenge_parameter = 1; + * @return {number} + */ +proto.disperser.BlobAuthHeader.prototype.getChallengeParameter = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobAuthHeader} returns this + */ +proto.disperser.BlobAuthHeader.prototype.setChallengeParameter = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.AuthenticationData.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.AuthenticationData.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.AuthenticationData} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticationData.toObject = function(includeInstance, msg) { + var f, obj = { + authenticationData: msg.getAuthenticationData_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.AuthenticationData} + */ +proto.disperser.AuthenticationData.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.AuthenticationData; + return proto.disperser.AuthenticationData.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.AuthenticationData} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.AuthenticationData} + */ +proto.disperser.AuthenticationData.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setAuthenticationData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.AuthenticationData.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.AuthenticationData.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.AuthenticationData} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.AuthenticationData.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getAuthenticationData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes authentication_data = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.AuthenticationData.prototype.getAuthenticationData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes authentication_data = 1; + * This is a type-conversion wrapper around `getAuthenticationData()` + * @return {string} + */ +proto.disperser.AuthenticationData.prototype.getAuthenticationData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getAuthenticationData())); +}; + + +/** + * optional bytes authentication_data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getAuthenticationData()` + * @return {!Uint8Array} + */ +proto.disperser.AuthenticationData.prototype.getAuthenticationData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getAuthenticationData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.AuthenticationData} returns this + */ +proto.disperser.AuthenticationData.prototype.setAuthenticationData = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.disperser.DisperseBlobRequest.repeatedFields_ = [2]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.DisperseBlobRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.DisperseBlobRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.DisperseBlobRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobRequest.toObject = function(includeInstance, msg) { + var f, obj = { + data: msg.getData_asB64(), + customQuorumNumbersList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f, + accountId: jspb.Message.getFieldWithDefault(msg, 3, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.DisperseBlobRequest} + */ +proto.disperser.DisperseBlobRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.DisperseBlobRequest; + return proto.disperser.DisperseBlobRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.DisperseBlobRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.DisperseBlobRequest} + */ +proto.disperser.DisperseBlobRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + case 2: + var values = /** @type {!Array} */ (reader.isDelimited() ? reader.readPackedUint32() : [reader.readUint32()]); + for (var i = 0; i < values.length; i++) { + msg.addCustomQuorumNumbers(values[i]); + } + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setAccountId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.DisperseBlobRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.DisperseBlobRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getCustomQuorumNumbersList(); + if (f.length > 0) { + writer.writePackedUint32( + 2, + f + ); + } + f = message.getAccountId(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } +}; + + +/** + * optional bytes data = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.DisperseBlobRequest.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data = 1; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.disperser.DisperseBlobRequest.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobRequest.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * repeated uint32 custom_quorum_numbers = 2; + * @return {!Array} + */ +proto.disperser.DisperseBlobRequest.prototype.getCustomQuorumNumbersList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2)); +}; + + +/** + * @param {!Array} value + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.setCustomQuorumNumbersList = function(value) { + return jspb.Message.setField(this, 2, value || []); +}; + + +/** + * @param {number} value + * @param {number=} opt_index + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.addCustomQuorumNumbers = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 2, value, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.clearCustomQuorumNumbersList = function() { + return this.setCustomQuorumNumbersList([]); +}; + + +/** + * optional string account_id = 3; + * @return {string} + */ +proto.disperser.DisperseBlobRequest.prototype.getAccountId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.disperser.DisperseBlobRequest} returns this + */ +proto.disperser.DisperseBlobRequest.prototype.setAccountId = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.DisperseBlobReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.DisperseBlobReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.DisperseBlobReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobReply.toObject = function(includeInstance, msg) { + var f, obj = { + result: jspb.Message.getFieldWithDefault(msg, 1, 0), + requestId: msg.getRequestId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.DisperseBlobReply} + */ +proto.disperser.DisperseBlobReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.DisperseBlobReply; + return proto.disperser.DisperseBlobReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.DisperseBlobReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.DisperseBlobReply} + */ +proto.disperser.DisperseBlobReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.disperser.BlobStatus} */ (reader.readEnum()); + msg.setResult(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRequestId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.DisperseBlobReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.DisperseBlobReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.DisperseBlobReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getResult(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getRequestId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } +}; + + +/** + * optional BlobStatus result = 1; + * @return {!proto.disperser.BlobStatus} + */ +proto.disperser.DisperseBlobReply.prototype.getResult = function() { + return /** @type {!proto.disperser.BlobStatus} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.disperser.BlobStatus} value + * @return {!proto.disperser.DisperseBlobReply} returns this + */ +proto.disperser.DisperseBlobReply.prototype.setResult = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional bytes request_id = 2; + * @return {!(string|Uint8Array)} + */ +proto.disperser.DisperseBlobReply.prototype.getRequestId = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes request_id = 2; + * This is a type-conversion wrapper around `getRequestId()` + * @return {string} + */ +proto.disperser.DisperseBlobReply.prototype.getRequestId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRequestId())); +}; + + +/** + * optional bytes request_id = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRequestId()` + * @return {!Uint8Array} + */ +proto.disperser.DisperseBlobReply.prototype.getRequestId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRequestId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.DisperseBlobReply} returns this + */ +proto.disperser.DisperseBlobReply.prototype.setRequestId = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobStatusRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobStatusRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobStatusRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusRequest.toObject = function(includeInstance, msg) { + var f, obj = { + requestId: msg.getRequestId_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobStatusRequest} + */ +proto.disperser.BlobStatusRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobStatusRequest; + return proto.disperser.BlobStatusRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobStatusRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobStatusRequest} + */ +proto.disperser.BlobStatusRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setRequestId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobStatusRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobStatusRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobStatusRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getRequestId_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes request_id = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BlobStatusRequest.prototype.getRequestId = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes request_id = 1; + * This is a type-conversion wrapper around `getRequestId()` + * @return {string} + */ +proto.disperser.BlobStatusRequest.prototype.getRequestId_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getRequestId())); +}; + + +/** + * optional bytes request_id = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getRequestId()` + * @return {!Uint8Array} + */ +proto.disperser.BlobStatusRequest.prototype.getRequestId_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getRequestId())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BlobStatusRequest} returns this + */ +proto.disperser.BlobStatusRequest.prototype.setRequestId = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobStatusReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobStatusReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobStatusReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusReply.toObject = function(includeInstance, msg) { + var f, obj = { + status: jspb.Message.getFieldWithDefault(msg, 1, 0), + info: (f = msg.getInfo()) && proto.disperser.BlobInfo.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobStatusReply} + */ +proto.disperser.BlobStatusReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobStatusReply; + return proto.disperser.BlobStatusReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobStatusReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobStatusReply} + */ +proto.disperser.BlobStatusReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!proto.disperser.BlobStatus} */ (reader.readEnum()); + msg.setStatus(value); + break; + case 2: + var value = new proto.disperser.BlobInfo; + reader.readMessage(value,proto.disperser.BlobInfo.deserializeBinaryFromReader); + msg.setInfo(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobStatusReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobStatusReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobStatusReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobStatusReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getStatus(); + if (f !== 0.0) { + writer.writeEnum( + 1, + f + ); + } + f = message.getInfo(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.BlobInfo.serializeBinaryToWriter + ); + } +}; + + +/** + * optional BlobStatus status = 1; + * @return {!proto.disperser.BlobStatus} + */ +proto.disperser.BlobStatusReply.prototype.getStatus = function() { + return /** @type {!proto.disperser.BlobStatus} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {!proto.disperser.BlobStatus} value + * @return {!proto.disperser.BlobStatusReply} returns this + */ +proto.disperser.BlobStatusReply.prototype.setStatus = function(value) { + return jspb.Message.setProto3EnumField(this, 1, value); +}; + + +/** + * optional BlobInfo info = 2; + * @return {?proto.disperser.BlobInfo} + */ +proto.disperser.BlobStatusReply.prototype.getInfo = function() { + return /** @type{?proto.disperser.BlobInfo} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobInfo, 2)); +}; + + +/** + * @param {?proto.disperser.BlobInfo|undefined} value + * @return {!proto.disperser.BlobStatusReply} returns this +*/ +proto.disperser.BlobStatusReply.prototype.setInfo = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobStatusReply} returns this + */ +proto.disperser.BlobStatusReply.prototype.clearInfo = function() { + return this.setInfo(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobStatusReply.prototype.hasInfo = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.RetrieveBlobRequest.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.RetrieveBlobRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.RetrieveBlobRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobRequest.toObject = function(includeInstance, msg) { + var f, obj = { + batchHeaderHash: msg.getBatchHeaderHash_asB64(), + blobIndex: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.RetrieveBlobRequest} + */ +proto.disperser.RetrieveBlobRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.RetrieveBlobRequest; + return proto.disperser.RetrieveBlobRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.RetrieveBlobRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.RetrieveBlobRequest} + */ +proto.disperser.RetrieveBlobRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBatchHeaderHash(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBlobIndex(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.RetrieveBlobRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.RetrieveBlobRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchHeaderHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getBlobIndex(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } +}; + + +/** + * optional bytes batch_header_hash = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBatchHeaderHash = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes batch_header_hash = 1; + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {string} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBatchHeaderHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBatchHeaderHash())); +}; + + +/** + * optional bytes batch_header_hash = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBatchHeaderHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBatchHeaderHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.RetrieveBlobRequest} returns this + */ +proto.disperser.RetrieveBlobRequest.prototype.setBatchHeaderHash = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional uint32 blob_index = 2; + * @return {number} + */ +proto.disperser.RetrieveBlobRequest.prototype.getBlobIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.RetrieveBlobRequest} returns this + */ +proto.disperser.RetrieveBlobRequest.prototype.setBlobIndex = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.RetrieveBlobReply.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.RetrieveBlobReply.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.RetrieveBlobReply} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobReply.toObject = function(includeInstance, msg) { + var f, obj = { + data: msg.getData_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.RetrieveBlobReply} + */ +proto.disperser.RetrieveBlobReply.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.RetrieveBlobReply; + return proto.disperser.RetrieveBlobReply.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.RetrieveBlobReply} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.RetrieveBlobReply} + */ +proto.disperser.RetrieveBlobReply.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setData(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobReply.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.RetrieveBlobReply.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.RetrieveBlobReply} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.RetrieveBlobReply.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getData_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } +}; + + +/** + * optional bytes data = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.RetrieveBlobReply.prototype.getData = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes data = 1; + * This is a type-conversion wrapper around `getData()` + * @return {string} + */ +proto.disperser.RetrieveBlobReply.prototype.getData_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getData())); +}; + + +/** + * optional bytes data = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getData()` + * @return {!Uint8Array} + */ +proto.disperser.RetrieveBlobReply.prototype.getData_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getData())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.RetrieveBlobReply} returns this + */ +proto.disperser.RetrieveBlobReply.prototype.setData = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobInfo.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobInfo.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobInfo} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobInfo.toObject = function(includeInstance, msg) { + var f, obj = { + blobHeader: (f = msg.getBlobHeader()) && proto.disperser.BlobHeader.toObject(includeInstance, f), + blobVerificationProof: (f = msg.getBlobVerificationProof()) && proto.disperser.BlobVerificationProof.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobInfo} + */ +proto.disperser.BlobInfo.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobInfo; + return proto.disperser.BlobInfo.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobInfo} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobInfo} + */ +proto.disperser.BlobInfo.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.BlobHeader; + reader.readMessage(value,proto.disperser.BlobHeader.deserializeBinaryFromReader); + msg.setBlobHeader(value); + break; + case 2: + var value = new proto.disperser.BlobVerificationProof; + reader.readMessage(value,proto.disperser.BlobVerificationProof.deserializeBinaryFromReader); + msg.setBlobVerificationProof(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobInfo.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobInfo.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobInfo} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobInfo.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBlobHeader(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.BlobHeader.serializeBinaryToWriter + ); + } + f = message.getBlobVerificationProof(); + if (f != null) { + writer.writeMessage( + 2, + f, + proto.disperser.BlobVerificationProof.serializeBinaryToWriter + ); + } +}; + + +/** + * optional BlobHeader blob_header = 1; + * @return {?proto.disperser.BlobHeader} + */ +proto.disperser.BlobInfo.prototype.getBlobHeader = function() { + return /** @type{?proto.disperser.BlobHeader} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobHeader, 1)); +}; + + +/** + * @param {?proto.disperser.BlobHeader|undefined} value + * @return {!proto.disperser.BlobInfo} returns this +*/ +proto.disperser.BlobInfo.prototype.setBlobHeader = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobInfo} returns this + */ +proto.disperser.BlobInfo.prototype.clearBlobHeader = function() { + return this.setBlobHeader(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobInfo.prototype.hasBlobHeader = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional BlobVerificationProof blob_verification_proof = 2; + * @return {?proto.disperser.BlobVerificationProof} + */ +proto.disperser.BlobInfo.prototype.getBlobVerificationProof = function() { + return /** @type{?proto.disperser.BlobVerificationProof} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BlobVerificationProof, 2)); +}; + + +/** + * @param {?proto.disperser.BlobVerificationProof|undefined} value + * @return {!proto.disperser.BlobInfo} returns this +*/ +proto.disperser.BlobInfo.prototype.setBlobVerificationProof = function(value) { + return jspb.Message.setWrapperField(this, 2, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobInfo} returns this + */ +proto.disperser.BlobInfo.prototype.clearBlobVerificationProof = function() { + return this.setBlobVerificationProof(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobInfo.prototype.hasBlobVerificationProof = function() { + return jspb.Message.getField(this, 2) != null; +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.disperser.BlobHeader.repeatedFields_ = [3]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobHeader.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobHeader.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobHeader} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobHeader.toObject = function(includeInstance, msg) { + var f, obj = { + commitment: (f = msg.getCommitment()) && common_common_pb.G1Commitment.toObject(includeInstance, f), + dataLength: jspb.Message.getFieldWithDefault(msg, 2, 0), + blobQuorumParamsList: jspb.Message.toObjectList(msg.getBlobQuorumParamsList(), + proto.disperser.BlobQuorumParam.toObject, includeInstance) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobHeader} + */ +proto.disperser.BlobHeader.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobHeader; + return proto.disperser.BlobHeader.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobHeader} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobHeader} + */ +proto.disperser.BlobHeader.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new common_common_pb.G1Commitment; + reader.readMessage(value,common_common_pb.G1Commitment.deserializeBinaryFromReader); + msg.setCommitment(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setDataLength(value); + break; + case 3: + var value = new proto.disperser.BlobQuorumParam; + reader.readMessage(value,proto.disperser.BlobQuorumParam.deserializeBinaryFromReader); + msg.addBlobQuorumParams(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobHeader.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobHeader.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobHeader} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobHeader.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getCommitment(); + if (f != null) { + writer.writeMessage( + 1, + f, + common_common_pb.G1Commitment.serializeBinaryToWriter + ); + } + f = message.getDataLength(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getBlobQuorumParamsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 3, + f, + proto.disperser.BlobQuorumParam.serializeBinaryToWriter + ); + } +}; + + +/** + * optional common.G1Commitment commitment = 1; + * @return {?proto.common.G1Commitment} + */ +proto.disperser.BlobHeader.prototype.getCommitment = function() { + return /** @type{?proto.common.G1Commitment} */ ( + jspb.Message.getWrapperField(this, common_common_pb.G1Commitment, 1)); +}; + + +/** + * @param {?proto.common.G1Commitment|undefined} value + * @return {!proto.disperser.BlobHeader} returns this +*/ +proto.disperser.BlobHeader.prototype.setCommitment = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobHeader} returns this + */ +proto.disperser.BlobHeader.prototype.clearCommitment = function() { + return this.setCommitment(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobHeader.prototype.hasCommitment = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional uint32 data_length = 2; + * @return {number} + */ +proto.disperser.BlobHeader.prototype.getDataLength = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobHeader} returns this + */ +proto.disperser.BlobHeader.prototype.setDataLength = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * repeated BlobQuorumParam blob_quorum_params = 3; + * @return {!Array} + */ +proto.disperser.BlobHeader.prototype.getBlobQuorumParamsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.disperser.BlobQuorumParam, 3)); +}; + + +/** + * @param {!Array} value + * @return {!proto.disperser.BlobHeader} returns this +*/ +proto.disperser.BlobHeader.prototype.setBlobQuorumParamsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 3, value); +}; + + +/** + * @param {!proto.disperser.BlobQuorumParam=} opt_value + * @param {number=} opt_index + * @return {!proto.disperser.BlobQuorumParam} + */ +proto.disperser.BlobHeader.prototype.addBlobQuorumParams = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.disperser.BlobQuorumParam, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.disperser.BlobHeader} returns this + */ +proto.disperser.BlobHeader.prototype.clearBlobQuorumParamsList = function() { + return this.setBlobQuorumParamsList([]); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobQuorumParam.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobQuorumParam.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobQuorumParam} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobQuorumParam.toObject = function(includeInstance, msg) { + var f, obj = { + quorumNumber: jspb.Message.getFieldWithDefault(msg, 1, 0), + adversaryThresholdPercentage: jspb.Message.getFieldWithDefault(msg, 2, 0), + confirmationThresholdPercentage: jspb.Message.getFieldWithDefault(msg, 3, 0), + chunkLength: jspb.Message.getFieldWithDefault(msg, 4, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobQuorumParam} + */ +proto.disperser.BlobQuorumParam.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobQuorumParam; + return proto.disperser.BlobQuorumParam.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobQuorumParam} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobQuorumParam} + */ +proto.disperser.BlobQuorumParam.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setQuorumNumber(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setAdversaryThresholdPercentage(value); + break; + case 3: + var value = /** @type {number} */ (reader.readUint32()); + msg.setConfirmationThresholdPercentage(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setChunkLength(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobQuorumParam.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobQuorumParam.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobQuorumParam} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobQuorumParam.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getQuorumNumber(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getAdversaryThresholdPercentage(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getConfirmationThresholdPercentage(); + if (f !== 0) { + writer.writeUint32( + 3, + f + ); + } + f = message.getChunkLength(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } +}; + + +/** + * optional uint32 quorum_number = 1; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getQuorumNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setQuorumNumber = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 adversary_threshold_percentage = 2; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getAdversaryThresholdPercentage = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setAdversaryThresholdPercentage = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional uint32 confirmation_threshold_percentage = 3; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getConfirmationThresholdPercentage = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setConfirmationThresholdPercentage = function(value) { + return jspb.Message.setProto3IntField(this, 3, value); +}; + + +/** + * optional uint32 chunk_length = 4; + * @return {number} + */ +proto.disperser.BlobQuorumParam.prototype.getChunkLength = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobQuorumParam} returns this + */ +proto.disperser.BlobQuorumParam.prototype.setChunkLength = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BlobVerificationProof.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BlobVerificationProof.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BlobVerificationProof} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobVerificationProof.toObject = function(includeInstance, msg) { + var f, obj = { + batchId: jspb.Message.getFieldWithDefault(msg, 1, 0), + blobIndex: jspb.Message.getFieldWithDefault(msg, 2, 0), + batchMetadata: (f = msg.getBatchMetadata()) && proto.disperser.BatchMetadata.toObject(includeInstance, f), + inclusionProof: msg.getInclusionProof_asB64(), + quorumIndexes: msg.getQuorumIndexes_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BlobVerificationProof} + */ +proto.disperser.BlobVerificationProof.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BlobVerificationProof; + return proto.disperser.BlobVerificationProof.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BlobVerificationProof} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BlobVerificationProof} + */ +proto.disperser.BlobVerificationProof.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBatchId(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setBlobIndex(value); + break; + case 3: + var value = new proto.disperser.BatchMetadata; + reader.readMessage(value,proto.disperser.BatchMetadata.deserializeBinaryFromReader); + msg.setBatchMetadata(value); + break; + case 4: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setInclusionProof(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumIndexes(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BlobVerificationProof.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BlobVerificationProof.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BlobVerificationProof} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BlobVerificationProof.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchId(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getBlobIndex(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } + f = message.getBatchMetadata(); + if (f != null) { + writer.writeMessage( + 3, + f, + proto.disperser.BatchMetadata.serializeBinaryToWriter + ); + } + f = message.getInclusionProof_asU8(); + if (f.length > 0) { + writer.writeBytes( + 4, + f + ); + } + f = message.getQuorumIndexes_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } +}; + + +/** + * optional uint32 batch_id = 1; + * @return {number} + */ +proto.disperser.BlobVerificationProof.prototype.getBatchId = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setBatchId = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 blob_index = 2; + * @return {number} + */ +proto.disperser.BlobVerificationProof.prototype.getBlobIndex = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setBlobIndex = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + +/** + * optional BatchMetadata batch_metadata = 3; + * @return {?proto.disperser.BatchMetadata} + */ +proto.disperser.BlobVerificationProof.prototype.getBatchMetadata = function() { + return /** @type{?proto.disperser.BatchMetadata} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BatchMetadata, 3)); +}; + + +/** + * @param {?proto.disperser.BatchMetadata|undefined} value + * @return {!proto.disperser.BlobVerificationProof} returns this +*/ +proto.disperser.BlobVerificationProof.prototype.setBatchMetadata = function(value) { + return jspb.Message.setWrapperField(this, 3, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.clearBatchMetadata = function() { + return this.setBatchMetadata(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BlobVerificationProof.prototype.hasBatchMetadata = function() { + return jspb.Message.getField(this, 3) != null; +}; + + +/** + * optional bytes inclusion_proof = 4; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BlobVerificationProof.prototype.getInclusionProof = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * optional bytes inclusion_proof = 4; + * This is a type-conversion wrapper around `getInclusionProof()` + * @return {string} + */ +proto.disperser.BlobVerificationProof.prototype.getInclusionProof_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getInclusionProof())); +}; + + +/** + * optional bytes inclusion_proof = 4; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getInclusionProof()` + * @return {!Uint8Array} + */ +proto.disperser.BlobVerificationProof.prototype.getInclusionProof_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getInclusionProof())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setInclusionProof = function(value) { + return jspb.Message.setProto3BytesField(this, 4, value); +}; + + +/** + * optional bytes quorum_indexes = 5; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BlobVerificationProof.prototype.getQuorumIndexes = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes quorum_indexes = 5; + * This is a type-conversion wrapper around `getQuorumIndexes()` + * @return {string} + */ +proto.disperser.BlobVerificationProof.prototype.getQuorumIndexes_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumIndexes())); +}; + + +/** + * optional bytes quorum_indexes = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumIndexes()` + * @return {!Uint8Array} + */ +proto.disperser.BlobVerificationProof.prototype.getQuorumIndexes_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumIndexes())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BlobVerificationProof} returns this + */ +proto.disperser.BlobVerificationProof.prototype.setQuorumIndexes = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BatchMetadata.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BatchMetadata.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BatchMetadata} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchMetadata.toObject = function(includeInstance, msg) { + var f, obj = { + batchHeader: (f = msg.getBatchHeader()) && proto.disperser.BatchHeader.toObject(includeInstance, f), + signatoryRecordHash: msg.getSignatoryRecordHash_asB64(), + fee: msg.getFee_asB64(), + confirmationBlockNumber: jspb.Message.getFieldWithDefault(msg, 4, 0), + batchHeaderHash: msg.getBatchHeaderHash_asB64() + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BatchMetadata} + */ +proto.disperser.BatchMetadata.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BatchMetadata; + return proto.disperser.BatchMetadata.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BatchMetadata} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BatchMetadata} + */ +proto.disperser.BatchMetadata.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.disperser.BatchHeader; + reader.readMessage(value,proto.disperser.BatchHeader.deserializeBinaryFromReader); + msg.setBatchHeader(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setSignatoryRecordHash(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setFee(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setConfirmationBlockNumber(value); + break; + case 5: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBatchHeaderHash(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BatchMetadata.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BatchMetadata} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchMetadata.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchHeader(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.disperser.BatchHeader.serializeBinaryToWriter + ); + } + f = message.getSignatoryRecordHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getFee_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getConfirmationBlockNumber(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } + f = message.getBatchHeaderHash_asU8(); + if (f.length > 0) { + writer.writeBytes( + 5, + f + ); + } +}; + + +/** + * optional BatchHeader batch_header = 1; + * @return {?proto.disperser.BatchHeader} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeader = function() { + return /** @type{?proto.disperser.BatchHeader} */ ( + jspb.Message.getWrapperField(this, proto.disperser.BatchHeader, 1)); +}; + + +/** + * @param {?proto.disperser.BatchHeader|undefined} value + * @return {!proto.disperser.BatchMetadata} returns this +*/ +proto.disperser.BatchMetadata.prototype.setBatchHeader = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.clearBatchHeader = function() { + return this.setBatchHeader(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.disperser.BatchMetadata.prototype.hasBatchHeader = function() { + return jspb.Message.getField(this, 1) != null; +}; + + +/** + * optional bytes signatory_record_hash = 2; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchMetadata.prototype.getSignatoryRecordHash = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes signatory_record_hash = 2; + * This is a type-conversion wrapper around `getSignatoryRecordHash()` + * @return {string} + */ +proto.disperser.BatchMetadata.prototype.getSignatoryRecordHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getSignatoryRecordHash())); +}; + + +/** + * optional bytes signatory_record_hash = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getSignatoryRecordHash()` + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.getSignatoryRecordHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getSignatoryRecordHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setSignatoryRecordHash = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bytes fee = 3; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchMetadata.prototype.getFee = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes fee = 3; + * This is a type-conversion wrapper around `getFee()` + * @return {string} + */ +proto.disperser.BatchMetadata.prototype.getFee_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getFee())); +}; + + +/** + * optional bytes fee = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getFee()` + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.getFee_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getFee())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setFee = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + +/** + * optional uint32 confirmation_block_number = 4; + * @return {number} + */ +proto.disperser.BatchMetadata.prototype.getConfirmationBlockNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setConfirmationBlockNumber = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * optional bytes batch_header_hash = 5; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeaderHash = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 5, "")); +}; + + +/** + * optional bytes batch_header_hash = 5; + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {string} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeaderHash_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBatchHeaderHash())); +}; + + +/** + * optional bytes batch_header_hash = 5; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBatchHeaderHash()` + * @return {!Uint8Array} + */ +proto.disperser.BatchMetadata.prototype.getBatchHeaderHash_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBatchHeaderHash())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchMetadata} returns this + */ +proto.disperser.BatchMetadata.prototype.setBatchHeaderHash = function(value) { + return jspb.Message.setProto3BytesField(this, 5, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.disperser.BatchHeader.prototype.toObject = function(opt_includeInstance) { + return proto.disperser.BatchHeader.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.disperser.BatchHeader} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchHeader.toObject = function(includeInstance, msg) { + var f, obj = { + batchRoot: msg.getBatchRoot_asB64(), + quorumNumbers: msg.getQuorumNumbers_asB64(), + quorumSignedPercentages: msg.getQuorumSignedPercentages_asB64(), + referenceBlockNumber: jspb.Message.getFieldWithDefault(msg, 4, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.disperser.BatchHeader} + */ +proto.disperser.BatchHeader.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.disperser.BatchHeader; + return proto.disperser.BatchHeader.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.disperser.BatchHeader} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.disperser.BatchHeader} + */ +proto.disperser.BatchHeader.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setBatchRoot(value); + break; + case 2: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumNumbers(value); + break; + case 3: + var value = /** @type {!Uint8Array} */ (reader.readBytes()); + msg.setQuorumSignedPercentages(value); + break; + case 4: + var value = /** @type {number} */ (reader.readUint32()); + msg.setReferenceBlockNumber(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.disperser.BatchHeader.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.disperser.BatchHeader} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.disperser.BatchHeader.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getBatchRoot_asU8(); + if (f.length > 0) { + writer.writeBytes( + 1, + f + ); + } + f = message.getQuorumNumbers_asU8(); + if (f.length > 0) { + writer.writeBytes( + 2, + f + ); + } + f = message.getQuorumSignedPercentages_asU8(); + if (f.length > 0) { + writer.writeBytes( + 3, + f + ); + } + f = message.getReferenceBlockNumber(); + if (f !== 0) { + writer.writeUint32( + 4, + f + ); + } +}; + + +/** + * optional bytes batch_root = 1; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchHeader.prototype.getBatchRoot = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * optional bytes batch_root = 1; + * This is a type-conversion wrapper around `getBatchRoot()` + * @return {string} + */ +proto.disperser.BatchHeader.prototype.getBatchRoot_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getBatchRoot())); +}; + + +/** + * optional bytes batch_root = 1; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getBatchRoot()` + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.getBatchRoot_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getBatchRoot())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setBatchRoot = function(value) { + return jspb.Message.setProto3BytesField(this, 1, value); +}; + + +/** + * optional bytes quorum_numbers = 2; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchHeader.prototype.getQuorumNumbers = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * optional bytes quorum_numbers = 2; + * This is a type-conversion wrapper around `getQuorumNumbers()` + * @return {string} + */ +proto.disperser.BatchHeader.prototype.getQuorumNumbers_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumNumbers())); +}; + + +/** + * optional bytes quorum_numbers = 2; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumNumbers()` + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.getQuorumNumbers_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumNumbers())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setQuorumNumbers = function(value) { + return jspb.Message.setProto3BytesField(this, 2, value); +}; + + +/** + * optional bytes quorum_signed_percentages = 3; + * @return {!(string|Uint8Array)} + */ +proto.disperser.BatchHeader.prototype.getQuorumSignedPercentages = function() { + return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * optional bytes quorum_signed_percentages = 3; + * This is a type-conversion wrapper around `getQuorumSignedPercentages()` + * @return {string} + */ +proto.disperser.BatchHeader.prototype.getQuorumSignedPercentages_asB64 = function() { + return /** @type {string} */ (jspb.Message.bytesAsB64( + this.getQuorumSignedPercentages())); +}; + + +/** + * optional bytes quorum_signed_percentages = 3; + * Note that Uint8Array is not supported on all browsers. + * @see http://caniuse.com/Uint8Array + * This is a type-conversion wrapper around `getQuorumSignedPercentages()` + * @return {!Uint8Array} + */ +proto.disperser.BatchHeader.prototype.getQuorumSignedPercentages_asU8 = function() { + return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8( + this.getQuorumSignedPercentages())); +}; + + +/** + * @param {!(string|Uint8Array)} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setQuorumSignedPercentages = function(value) { + return jspb.Message.setProto3BytesField(this, 3, value); +}; + + +/** + * optional uint32 reference_block_number = 4; + * @return {number} + */ +proto.disperser.BatchHeader.prototype.getReferenceBlockNumber = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.disperser.BatchHeader} returns this + */ +proto.disperser.BatchHeader.prototype.setReferenceBlockNumber = function(value) { + return jspb.Message.setProto3IntField(this, 4, value); +}; + + +/** + * @enum {number} + */ +proto.disperser.BlobStatus = { + UNKNOWN: 0, + PROCESSING: 1, + CONFIRMED: 2, + FAILED: 3, + FINALIZED: 4, + INSUFFICIENT_SIGNATURES: 5, + DISPERSING: 6 +}; + +goog.object.extend(exports, proto.disperser); diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/churner/churner.proto b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/churner/churner.proto new file mode 100644 index 00000000..0687d9ca --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/churner/churner.proto @@ -0,0 +1,82 @@ +syntax = "proto3"; + +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/churner"; +package churner; + +// The Churner is a service that handles churn requests from new operators trying to +// join the EigenDA network. +// When the EigenDA network reaches the maximum number of operators, any new operator +// trying to join will have to make a churn request to this Churner, which acts as the +// sole decision maker to decide whether this new operator could join, and if so, which +// existing operator will be churned out (so the max number of operators won't be +// exceeded). +// The max number of operators, as well as the rules to make churn decisions, are +// defined onchain, see details in OperatorSetParam at: +// https://github.com/Layr-Labs/eigenlayer-middleware/blob/master/src/interfaces/IBLSRegistryCoordinatorWithIndices.sol#L24. +service Churner { + rpc Churn(ChurnRequest) returns (ChurnReply) {} +} + +message ChurnRequest { + // The Ethereum address (in hex like "0x123abcdef...") of the operator. + string operator_address = 1; + // The operator making the churn request. + bytes operator_to_register_pubkey_g1 = 2; + bytes operator_to_register_pubkey_g2 = 3; + // The operator's BLS signature signed on the keccak256 hash of + // concat("ChurnRequest", operator address, g1, g2, salt). + bytes operator_request_signature = 4; + // The salt used as part of the message to sign on for operator_request_signature. + bytes salt = 5; + // The quorums to register for. + // Note: + // - If any of the quorum here has already been registered, this entire request + // will fail to proceed. + // - If any of the quorum fails to register, this entire request will fail. + // - Regardless of whether the specified quorums are full or not, the Churner + // will return parameters for all quorums specified here. The smart contract will + // determine whether it needs to churn out existing operators based on whether + // the quorums have available space. + // The IDs must be in range [0, 254]. + repeated uint32 quorum_ids = 6; +} + +message ChurnReply { + // The signature signed by the Churner. + SignatureWithSaltAndExpiry signature_with_salt_and_expiry = 1; + // A list of existing operators that get churned out. + // This list will contain all quorums specified in the ChurnRequest even if some quorums + // may not have any churned out operators. If a quorum has available space, OperatorToChurn + // object will contain the quorum ID and empty operator and pubkey. The smart contract should + // only churn out the operators for quorums that are full. + // + // For example, if the ChurnRequest specifies quorums 0 and 1 where quorum 0 is full + // and quorum 1 has available space, the ChurnReply will contain two OperatorToChurn objects + // with the respective quorums. OperatorToChurn for quorum 0 will contain the operator to churn + // out and OperatorToChurn for quorum 1 will contain empty operator (zero address) and pubkey. + // The smart contract should only churn out the operators for quorum 0 because quorum 1 + // has available space without having any operators churned. + // Note: it's possible an operator gets churned out just for one or more quorums + // (rather than entirely churned out for all quorums). + repeated OperatorToChurn operators_to_churn = 2; +} + +message SignatureWithSaltAndExpiry { + // Churner's signature on the Operator's attributes. + bytes signature = 1; + // Salt is the keccak256 hash of + // concat("churn", time.Now(), operatorToChurn's OperatorID, Churner's ECDSA private key) + bytes salt = 2; + // When this churn decision will expire. + int64 expiry = 3; +} + +// This describes an operator to churn out for a quorum. +message OperatorToChurn { + // The ID of the quorum of the operator to churn out. + uint32 quorum_id = 1; + // The address of the operator. + bytes operator = 2; + // BLS pubkey (G1 point) of the operator. + bytes pubkey = 3; +} diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/common/common.proto b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/common/common.proto new file mode 100644 index 00000000..343222f8 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/common/common.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; +package common; +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/common"; + +message G1Commitment { + // The X coordinate of the KZG commitment. This is the raw byte representation of the field element. + bytes x = 1; + // The Y coordinate of the KZG commitment. This is the raw byte representation of the field element. + bytes y = 2; +} diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/disperser/disperser.proto b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/disperser/disperser.proto new file mode 100644 index 00000000..d83aaf31 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/disperser/disperser.proto @@ -0,0 +1,252 @@ +syntax = "proto3"; +package disperser; +import "common/common.proto"; +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/disperser"; + +// Disperser defines the public APIs for dispersing blobs. +service Disperser { + // This API accepts blob to disperse from clients. + // This executes the dispersal async, i.e. it returns once the request + // is accepted. The client could use GetBlobStatus() API to poll the the + // processing status of the blob. + rpc DisperseBlob(DisperseBlobRequest) returns (DisperseBlobReply) {} + + + // DisperseBlobAuthenticated is similar to DisperseBlob, except that it requires the + // client to authenticate itself via the AuthenticationData message. The protoco is as follows: + // 1. The client sends a DisperseBlobAuthenticated request with the DisperseBlobRequest message + // 2. The Disperser sends back a BlobAuthHeader message containing information for the client to + // verify and sign. + // 3. The client verifies the BlobAuthHeader and sends back the signed BlobAuthHeader in an + // AuthenticationData message. + // 4. The Disperser verifies the signature and returns a DisperseBlobReply message. + rpc DisperseBlobAuthenticated(stream AuthenticatedRequest) returns (stream AuthenticatedReply); + + // This API is meant to be polled for the blob status. + rpc GetBlobStatus(BlobStatusRequest) returns (BlobStatusReply) {} + + // This retrieves the requested blob from the Disperser's backend. + // This is a more efficient way to retrieve blobs than directly retrieving + // from the DA Nodes (see detail about this approach in + // api/proto/retriever/retriever.proto). + // The blob should have been initially dispersed via this Disperser service + // for this API to work. + rpc RetrieveBlob(RetrieveBlobRequest) returns (RetrieveBlobReply) {} +} + +// Requests and Responses + +// Authenicated Message Types + +message AuthenticatedRequest { + oneof payload { + DisperseBlobRequest disperse_request = 1; + AuthenticationData authentication_data = 2; + } +} + +message AuthenticatedReply { + oneof payload { + BlobAuthHeader blob_auth_header = 1; + DisperseBlobReply disperse_reply = 2; + } +} + +// BlobAuthHeader contains information about the blob for the client to verify and sign. +// - Once payments are enabled, the BlobAuthHeader will contain the KZG commitment to the blob, which the client + // will verify and sign. Having the client verify the KZG commitment instead of calculating it avoids +// the need for the client to have the KZG structured reference string (SRS), which can be large. +// The signed KZG commitment prevents the disperser from sending a different blob to the DA Nodes +// than the one the client sent. +// - In the meantime, the BlobAuthHeader contains a simple challenge parameter is used to prevent +// replay attacks in the event that a signature is leaked. +message BlobAuthHeader { + uint32 challenge_parameter = 1; +} + +// AuthenticationData contains the signature of the BlobAuthHeader. +message AuthenticationData { + bytes authentication_data = 1; +} + +message DisperseBlobRequest { + // The data to be dispersed. + // The size of data must be <= 2MiB. Every 32 bytes of data chunk is interpreted as an integer in big endian format + // where the lower address has more significant bits. The integer must stay in the valid range to be interpreted + // as a field element on the bn254 curve. The valid range is + // 0 <= x < 21888242871839275222246405745257275088548364400416034343698204186575808495617 + // containing slightly less than 254 bits and more than 253 bits. If any one of the 32 bytes chunk is outside the range, + // the whole request is deemed as invalid, and rejected. + bytes data = 1; + // The quorums to which the blob will be sent, in addition to the required quorums which are configured + // on the EigenDA smart contract. If required quorums are included here, an error will be returned. + // The disperser will ensure that the encoded blobs for each quorum are all processed + // within the same batch. + repeated uint32 custom_quorum_numbers = 2; + + // The account ID of the client. This should be a hex-encoded string of the ECSDA public key + // corresponding to the key used by the client to sign the BlobAuthHeader. + string account_id = 3; +} + +message DisperseBlobReply { + // The status of the blob associated with the request_id. + BlobStatus result = 1; + // The request ID generated by the disperser. + // Once a request is accepted (although not processed), a unique request ID will be + // generated. + // Two different DisperseBlobRequests (determined by the hash of the DisperseBlobRequest) + // will have different IDs, and the same DisperseBlobRequest sent repeatedly at different + // times will also have different IDs. + // The client should use this ID to query the processing status of the request (via + // the GetBlobStatus API). + bytes request_id = 2; +} + +// BlobStatusRequest is used to query the status of a blob. +message BlobStatusRequest { + bytes request_id = 1; +} + +message BlobStatusReply { + // The status of the blob. + BlobStatus status = 1; + // The blob info needed for clients to confirm the blob against the EigenDA contracts. + BlobInfo info = 2; +} + +// RetrieveBlobRequest contains parameters to retrieve the blob. +message RetrieveBlobRequest { + bytes batch_header_hash = 1; + uint32 blob_index = 2; +} + +// RetrieveBlobReply contains the retrieved blob data +message RetrieveBlobReply { + bytes data = 1; +} + +// Data Types + +// BlobStatus represents the status of a blob. +// The status of a blob is updated as the blob is processed by the disperser. +// The status of a blob can be queried by the client using the GetBlobStatus API. +// Intermediate states are states that the blob can be in while being processed, and it can be updated to a differet state: +// - PROCESSING +// - DISPERSING +// - CONFIRMED +// Terminal states are states that will not be updated to a different state: +// - FAILED +// - FINALIZED +// - INSUFFICIENT_SIGNATURES +enum BlobStatus { + UNKNOWN = 0; + + // PROCESSING means that the blob is currently being processed by the disperser + PROCESSING = 1; + // CONFIRMED means that the blob has been dispersed to DA Nodes and the dispersed + // batch containing the blob has been confirmed onchain + CONFIRMED = 2; + + // FAILED means that the blob has failed permanently (for reasons other than insufficient + // signatures, which is a separate state) + FAILED = 3; + // FINALIZED means that the block containing the blob's confirmation transaction has been finalized on Ethereum + FINALIZED = 4; + // INSUFFICIENT_SIGNATURES means that the confirmation threshold for the blob was not met + // for at least one quorum. + INSUFFICIENT_SIGNATURES = 5; + + // DISPERSING means that the blob is currently being dispersed to DA Nodes and being confirmed onchain + DISPERSING = 6; +} + +// Types below correspond to the types necessary to verify a blob +// https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/libraries/EigenDABlobUtils.sol#L29 + +// BlobInfo contains information needed to confirm the blob against the EigenDA contracts +message BlobInfo { + BlobHeader blob_header = 1; + BlobVerificationProof blob_verification_proof = 2; +} + +message BlobHeader { + // KZG commitment of the blob. + common.G1Commitment commitment = 1; + // The length of the blob in symbols (each symbol is 32 bytes). + uint32 data_length = 2; + // The params of the quorums that this blob participates in. + repeated BlobQuorumParam blob_quorum_params = 3; +} + +message BlobQuorumParam { + // The ID of the quorum. + uint32 quorum_number = 1; + // The max percentage of stake within the quorum that can be held by or delegated + // to adversarial operators. Currently, this and the next parameter are standardized + // across the quorum using values read from the EigenDA contracts. + uint32 adversary_threshold_percentage = 2; + // The min percentage of stake that must attest in order to consider + // the dispersal is successful. + uint32 confirmation_threshold_percentage = 3; + // The length of each chunk. + uint32 chunk_length = 4; +} + +message BlobVerificationProof { + // batch_id is an incremental ID assigned to a batch by EigenDAServiceManager + uint32 batch_id = 1; + // The index of the blob in the batch (which is logically an ordered list of blobs). + uint32 blob_index = 2; + BatchMetadata batch_metadata = 3; + // inclusion_proof is a merkle proof for a blob header's inclusion in a batch + bytes inclusion_proof = 4; + // indexes of quorums in BatchHeader.quorum_numbers that match the quorums in BlobHeader.blob_quorum_params + // Ex. BlobHeader.blob_quorum_params = [ + // { + // quorum_number = 0, + // ... + // }, + // { + // quorum_number = 3, + // ... + // }, + // { + // quorum_number = 5, + // ... + // }, + // ] + // BatchHeader.quorum_numbers = [0, 5, 3] => 0x000503 + // Then, quorum_indexes = [0, 2, 1] => 0x000201 + bytes quorum_indexes = 5; +} + +message BatchMetadata { + BatchHeader batch_header = 1; + // The hash of all public keys of the operators that did not sign the batch. + bytes signatory_record_hash = 2; + // The fee payment paid by users for dispersing this batch. It's the bytes + // representation of a big.Int value. + bytes fee = 3; + // The Ethereum block number at which the batch is confirmed onchain. + uint32 confirmation_block_number = 4; + // This is the hash of the ReducedBatchHeader defined onchain, see: + // https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/interfaces/IEigenDAServiceManager.sol#L43 + // The is the message that the operators will sign their signatures on. + bytes batch_header_hash = 5; +} + +message BatchHeader { + // The root of the merkle tree with the hashes of blob headers as leaves. + bytes batch_root = 1; + // All quorums associated with blobs in this batch. Sorted in ascending order. + // Ex. [0, 2, 1] => 0x000102 + bytes quorum_numbers = 2; + // The percentage of stake that has signed for this batch. + // The quorum_signed_percentages[i] is percentage for the quorum_numbers[i]. + bytes quorum_signed_percentages = 3; + // The Ethereum block number at which the batch was created. + // The Disperser will encode and disperse the blobs based on the onchain info + // (e.g. operator stakes) at this block number. + uint32 reference_block_number = 4; +} diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/node/node.proto b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/node/node.proto new file mode 100644 index 00000000..f32fea64 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/node/node.proto @@ -0,0 +1,218 @@ +syntax = "proto3"; +package node; +import "google/protobuf/wrappers.proto"; +import "common/common.proto"; +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/node"; + +// The EigenDA Node implements two services, Dispersal and Retrieval, as defined below, +// for better security and separation of concerns. + +service Dispersal { + // StoreChunks validates that the chunks match what the Node is supposed to receive ( + // different Nodes are responsible for different chunks, as EigenDA is horizontally + // sharded) and is correctly coded (e.g. each chunk must be a valid KZG multiproof) + // according to the EigenDA protocol. It also stores the chunks along with metadata + // for the protocol-defined length of custody. It will return a signature at the + // end to attest to the data in this request it has processed. + rpc StoreChunks(StoreChunksRequest) returns (StoreChunksReply) {} + // StoreBlobs is simiar to StoreChunks, but it stores the blobs using a different storage schema + // so that the stored blobs can later be aggregated by AttestBatch method to a bigger batch. + // StoreBlobs + AttestBatch will eventually replace and deprecate StoreChunks method. + rpc StoreBlobs(StoreBlobsRequest) returns (StoreBlobsReply) {} + // AttestBatch is used to aggregate the batches stored by StoreBlobs method to a bigger batch. + // It will return a signature at the end to attest to the aggregated batch. + rpc AttestBatch(AttestBatchRequest) returns (AttestBatchReply) {} + // Retrieve node info metadata + rpc NodeInfo(NodeInfoRequest) returns (NodeInfoReply) {} +} + +service Retrieval { + // RetrieveChunks retrieves the chunks for a blob custodied at the Node. + rpc RetrieveChunks(RetrieveChunksRequest) returns (RetrieveChunksReply) {} + // GetBlobHeader is similar to RetrieveChunks, this just returns the header of the blob. + rpc GetBlobHeader(GetBlobHeaderRequest) returns (GetBlobHeaderReply) {} + // Retrieve node info metadata + rpc NodeInfo(NodeInfoRequest) returns (NodeInfoReply) {} +} + +// Requests and replies + +message StoreChunksRequest { + // Which batch this request is for. + BatchHeader batch_header = 1; + // The chunks for each blob in the batch to be stored in an EigenDA Node. + repeated Blob blobs = 2; +} + +message StoreChunksReply { + // The operator's BLS signature signed on the batch header hash. + bytes signature = 1; +} + +message StoreBlobsRequest { + // Blobs to store + repeated Blob blobs = 1; + // The reference block number whose state is used to encode the blobs + uint32 reference_block_number = 2; +} + +message StoreBlobsReply { + // The operator's BLS sgnature signed on the blob header hashes. + // The ordering of the signatures must match the ordering of the blobs sent + // in the request, with empty signatures in the places for discarded blobs. + repeated google.protobuf.BytesValue signatures = 1; +} + +message AttestBatchRequest { + // header of the batch + BatchHeader batch_header = 1; + // the header hashes of all blobs in the batch + repeated bytes blob_header_hashes = 2; +} + +message AttestBatchReply { + bytes signature = 1; +} + +message RetrieveChunksRequest { + // The hash of the ReducedBatchHeader defined onchain, see: + // https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/interfaces/IEigenDAServiceManager.sol#L43 + // This identifies which batch to retrieve for. + bytes batch_header_hash = 1; + // Which blob in the batch to retrieve for (note: a batch is logically an ordered + // list of blobs). + uint32 blob_index = 2; + // Which quorum of the blob to retrieve for (note: a blob can have multiple + // quorums and the chunks for different quorums at a Node can be different). + // The ID must be in range [0, 254]. + uint32 quorum_id = 3; +} + +// This describes how the chunks returned in RetrieveChunksReply are encoded. +// Used to facilitate the decoding of chunks. +enum ChunkEncodingFormat { + UNKNOWN = 0; + GNARK = 1; + GOB = 2; +} + +message RetrieveChunksReply { + // All chunks the Node is storing for the requested blob per RetrieveChunksRequest. + repeated bytes chunks = 1; + // How the above chunks are encoded. + ChunkEncodingFormat chunk_encoding_format = 2; +} + +// See RetrieveChunksRequest for documentation of each parameter of GetBlobHeaderRequest. +message GetBlobHeaderRequest { + bytes batch_header_hash = 1; + uint32 blob_index = 2; + uint32 quorum_id = 3; +} + +message GetBlobHeaderReply { + // The header of the blob requested per GetBlobHeaderRequest. + BlobHeader blob_header = 1; + // Merkle proof that returned blob header belongs to the batch and is + // the batch's MerkleProof.index-th blob. + // This can be checked against the batch root on chain. + MerkleProof proof = 2; +} + +message MerkleProof { + // The proof itself. + repeated bytes hashes = 1; + // Which index (the leaf of the Merkle tree) this proof is for. + uint32 index = 2; +} + +// Types + +// In EigenDA, the original blob to disperse is encoded as a polynomial via taking +// taking different point evaluations (i.e. erasure coding). These points are split +// into disjoint subsets which are assigned to different operator nodes in the EigenDA +// network. +// The data in this message is a subset of these points that are assigned to a +// single operator node. +message Blob { + // Which (original) blob this is for. + BlobHeader header = 1; + // Each bundle contains all chunks for a single quorum of the blob. + // The number of bundles must be equal to the total number of quorums associated + // with the blob, and the ordering must be the same as BlobHeader.quorum_headers. + // Note: an operator may be in some but not all of the quorums; in that case the + // bundle corresponding to that quorum will be empty. + repeated Bundle bundles = 2; +} + +// A Bundle is the collection of chunks associated with a single blob, for a single +// operator and a single quorum. +message Bundle { + // Each chunk corresponds to a collection of points on the polynomial. + // Each chunk has same number of points. + repeated bytes chunks = 1; + // All chunks of the bundle encoded in a byte array. + bytes bundle = 2; +} + +message G2Commitment { + // The A0 element of the X coordinate of G2 point. + bytes x_a0 = 1; + // The A1 element of the X coordinate of G2 point. + bytes x_a1 = 2; + // The A0 element of the Y coordinate of G2 point. + bytes y_a0 = 3; + // The A1 element of the Y coordinate of G2 point. + bytes y_a1 = 4; +} + +message BlobHeader { + // The KZG commitment to the polynomial representing the blob. + common.G1Commitment commitment = 1; + // The KZG commitment to the polynomial representing the blob on G2, it is used + // for proving the degree of the polynomial + G2Commitment length_commitment = 2; + // The low degree proof. It's the KZG commitment to the polynomial shifted to + // the largest SRS degree. + G2Commitment length_proof = 3; + // The length of the original blob in number of symbols (in the field where + // the polynomial is defined). + uint32 length = 4; + // The params of the quorums that this blob participates in. + repeated BlobQuorumInfo quorum_headers = 5; + // The ID of the user who is dispersing this blob to EigenDA. + string account_id = 6; + // The reference block number whose state is used to encode the blob + uint32 reference_block_number = 7; +} + +// See BlobQuorumParam as defined in +// api/proto/disperser/disperser.proto +message BlobQuorumInfo { + uint32 quorum_id = 1; + uint32 adversary_threshold = 2; + uint32 confirmation_threshold = 3; + uint32 chunk_length = 4; + uint32 ratelimit = 5; +} + +// BatchHeader (see core/data.go#BatchHeader) +message BatchHeader { + // The root of the merkle tree with hashes of blob headers as leaves. + bytes batch_root = 1; + // The Ethereum block number at which the batch is dispersed. + uint32 reference_block_number = 3; +} + +// Node info request +message NodeInfoRequest { +} + +// Node info reply +message NodeInfoReply { + string semver = 1; + string arch = 2; + string os = 3; + uint32 num_cpu = 4; + uint64 mem_bytes = 5; +} diff --git a/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/retriever/retriever.proto b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/retriever/retriever.proto new file mode 100644 index 00000000..754a9348 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/eigenDA/proto/retriever/retriever.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; + +option go_package = "github.com/Layr-Labs/eigenda/api/grpc/retriever"; +package retriever; + +// The Retriever is a service for retrieving chunks corresponding to a blob from +// the EigenDA operator nodes and reconstructing the original blob from the chunks. +// This is a client-side library that the users are supposed to operationalize. +// +// Note: Users generally have two ways to retrieve a blob from EigenDA: +// 1) Retrieve from the Disperser that the user initially used for dispersal: the API +// is Disperser.RetrieveBlob() as defined in api/proto/disperser/disperser.proto +// 2) Retrieve directly from the EigenDA Nodes, which is supported by this Retriever. +// +// The Disperser.RetrieveBlob() (the 1st approach) is generally faster and cheaper as the +// Disperser manages the blobs that it has processed, whereas the Retriever.RetrieveBlob() +// (the 2nd approach here) removes the need to trust the Disperser, with the downside of +// worse cost and performance. +service Retriever { + // This fans out request to EigenDA Nodes to retrieve the chunks and returns the + // reconstructed original blob in response. + rpc RetrieveBlob(BlobRequest) returns (BlobReply) {} +} + +message BlobRequest { + // The hash of the ReducedBatchHeader defined onchain, see: + // https://github.com/Layr-Labs/eigenda/blob/master/contracts/src/interfaces/IEigenDAServiceManager.sol#L43 + // This identifies the batch that this blob belongs to. + bytes batch_header_hash = 1; + // Which blob in the batch this is requesting for (note: a batch is logically an + // ordered list of blobs). + uint32 blob_index = 2; + // The Ethereum block number at which the batch for this blob was constructed. + uint32 reference_block_number = 3; + // Which quorum of the blob this is requesting for (note a blob can participate in + // multiple quorums). + uint32 quorum_id = 4; +} + +message BlobReply { + // The blob retrieved and reconstructed from the EigenDA Nodes per BlobRequest. + bytes data = 1; +} diff --git a/clone-agent/eigen-layer/Validation_Service/index.js b/clone-agent/eigen-layer/Validation_Service/index.js new file mode 100644 index 00000000..ccda7b77 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/index.js @@ -0,0 +1,7 @@ +"use strict"; +const app = require("./configs/app.config") +const PORT = process.env.port || process.env.PORT || 4002 +const dalService = require("./src/dal.service"); + +dalService.init(); +app.listen(PORT, () => console.log("Server started on port:", PORT)) \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/package.json b/clone-agent/eigen-layer/Validation_Service/package.json new file mode 100644 index 00000000..e20bd210 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/package.json @@ -0,0 +1,27 @@ +{ + "name": "validation_service", + "version": "1.0.0", + "description": "", + "module": "ESModule", + "main": "index.js", + "scripts": { + "start": "node index.js", + "build": "" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@grpc/grpc-js": "^1.11.2", + "@grpc/proto-loader": "^0.7.13", + "axios": "^1.1.3", + "cors": "^2.8.5", + "dotenv": "^16.0.1", + "express": "^4.18.1", + "express-session": "^1.17.3", + "fs": "^0.0.1-security", + "grpc-tools": "^1.12.4", + "grpc_tools_node_protoc_ts": "^5.3.3", + "nodemon": "^3.1.0", + "google-protobuf": "^3.21.2" + } +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/pnpm-lock.yaml b/clone-agent/eigen-layer/Validation_Service/pnpm-lock.yaml new file mode 100644 index 00000000..ed86add6 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/pnpm-lock.yaml @@ -0,0 +1,1612 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@grpc/grpc-js': + specifier: ^1.11.2 + version: 1.12.6 + '@grpc/proto-loader': + specifier: ^0.7.13 + version: 0.7.13 + axios: + specifier: ^1.1.3 + version: 1.7.9 + cors: + specifier: ^2.8.5 + version: 2.8.5 + dotenv: + specifier: ^16.0.1 + version: 16.4.7 + express: + specifier: ^4.18.1 + version: 4.21.2 + express-session: + specifier: ^1.17.3 + version: 1.18.1 + fs: + specifier: ^0.0.1-security + version: 0.0.1-security + google-protobuf: + specifier: ^3.21.2 + version: 3.21.4 + grpc-tools: + specifier: ^1.12.4 + version: 1.13.0 + grpc_tools_node_protoc_ts: + specifier: ^5.3.3 + version: 5.3.3 + nodemon: + specifier: ^3.1.0 + version: 3.1.9 + +packages: + + '@grpc/grpc-js@1.12.6': + resolution: {integrity: sha512-JXUj6PI0oqqzTGvKtzOkxtpsyPRNsrmhh41TtIz/zEB6J+AUiZZ0dxWzcMwO9Ns5rmSPuMdghlTbUuqIM48d3Q==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.13': + resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==} + engines: {node: '>=6'} + hasBin: true + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + express-session@1.18.1: + resolution: {integrity: sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA==} + engines: {node: '>= 0.8.0'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fs@0.0.1-security: + resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + google-protobuf@3.15.8: + resolution: {integrity: sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==} + + google-protobuf@3.21.4: + resolution: {integrity: sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + grpc-tools@1.13.0: + resolution: {integrity: sha512-7CbkJ1yWPfX0nHjbYG58BQThNhbICXBZynzCUxCb3LzX5X9B3hQbRY2STiRgIEiLILlK9fgl0z0QVGwPCdXf5g==} + hasBin: true + + grpc_tools_node_protoc_ts@5.3.3: + resolution: {integrity: sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==} + hasBin: true + + handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + long@5.2.4: + resolution: {integrity: sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + nodemon@3.1.9: + resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} + engines: {node: '>=10'} + hasBin: true + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + protobufjs@7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + random-bytes@1.0.0: + resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} + engines: {node: '>= 0.8'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid-safe@2.1.5: + resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} + engines: {node: '>= 0.8'} + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + +snapshots: + + '@grpc/grpc-js@1.12.6': + dependencies: + '@grpc/proto-loader': 0.7.13 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.13': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.4 + protobufjs: 7.4.0 + yargs: 17.7.2 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@mapbox/node-pre-gyp@1.0.11': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.7.1 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + + abbrev@1.1.1: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + agent-base@6.0.2: + dependencies: + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + aproba@2.0.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + array-flatten@1.1.1: {} + + asynckit@0.4.0: {} + + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@2.0.0: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie-signature@1.0.7: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + + delayed-stream@1.0.0: {} + + delegates@1.0.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@2.0.3: {} + + dotenv@16.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + etag@1.8.1: {} + + express-session@1.18.1: + dependencies: + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + on-headers: 1.0.2 + parseurl: 1.3.3 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + transitivePeerDependencies: + - supports-color + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + follow-redirects@1.15.9: {} + + form-data@4.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + + fs@0.0.1-security: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + google-protobuf@3.15.8: {} + + google-protobuf@3.21.4: {} + + gopd@1.2.0: {} + + grpc-tools@1.13.0: + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + transitivePeerDependencies: + - encoding + - supports-color + + grpc_tools_node_protoc_ts@5.3.3: + dependencies: + google-protobuf: 3.15.8 + handlebars: 4.7.7 + + handlebars@4.7.7: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@3.0.0: {} + + has-symbols@1.1.0: {} + + has-unicode@2.0.1: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ignore-by-default@1.0.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ipaddr.js@1.9.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + lodash.camelcase@4.3.0: {} + + long@5.2.4: {} + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + methods@1.1.2: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.8: {} + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp@1.0.4: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + nodemon@3.1.9: + dependencies: + chokidar: 3.6.0 + debug: 4.4.0(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.7.1 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + + normalize-path@3.0.0: {} + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + parseurl@1.3.3: {} + + path-is-absolute@1.0.1: {} + + path-to-regexp@0.1.12: {} + + picomatch@2.3.1: {} + + protobufjs@7.4.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.13.1 + long: 5.2.4 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + pstree.remy@1.1.8: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + random-bytes@1.0.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + require-directory@2.1.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.7.1: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-blocking@2.0.0: {} + + setprototypeof@1.2.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.1 + + source-map@0.6.1: {} + + statuses@2.0.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + touch@3.1.1: {} + + tr46@0.0.3: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + uglify-js@3.19.3: + optional: true + + uid-safe@2.1.5: + dependencies: + random-bytes: 1.0.0 + + undefsafe@2.0.5: {} + + undici-types@6.20.0: {} + + unpipe@1.0.0: {} + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + vary@1.1.2: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + wordwrap@1.0.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yallist@4.0.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/clone-agent/eigen-layer/Validation_Service/src/ai.service.js b/clone-agent/eigen-layer/Validation_Service/src/ai.service.js new file mode 100644 index 00000000..4ab31380 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/src/ai.service.js @@ -0,0 +1,36 @@ +require('dotenv').config(); +const axios = require("axios"); + +async function handleChatResponse(response) { + try { + console.log('🟢 Validation Service received response:', { + assistantId: response.assistantId, + threadId: response.threadId + }); + + return { + assistantId: response.assistantId, + threadId: response.threadId + }; + } catch (err) { + console.error('🔴 Error in Validation Service:', err.message); + throw err; + } +} + +async function subscribeToChat() { + try { + console.log('🟡 Attempting to subscribe to chat...'); + const response = await axios.post(`${process.env.API_BASE_URL}/api/chat/subscribe`); + console.log('🟢 Subscription successful, got response:', response.data); + return handleChatResponse(response.data); + } catch (err) { + console.error('🔴 Error subscribing to chat:', err.message); + throw err; + } +} + +module.exports = { + handleChatResponse, + subscribeToChat +}; \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/src/dal.service.js b/clone-agent/eigen-layer/Validation_Service/src/dal.service.js new file mode 100644 index 00000000..fc444a67 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/src/dal.service.js @@ -0,0 +1,62 @@ +require('dotenv').config(); +const grpc = require('@grpc/grpc-js'); +const { DisperserClient } = require('../eigenDA/bindings/disperser/disperser_grpc_pb'); +const { BlobStatusRequest, RetrieveBlobRequest } = require('../eigenDA/bindings/disperser/disperser_pb'); + +const EIGEN_ENDPOINT = 'disperser-holesky.eigenda.xyz:443'; +var client; + +function init() { + client = new DisperserClient(EIGEN_ENDPOINT, grpc.credentials.createSsl()); +} + + +async function getEigenDATask(cid) { + const statusRequest = new BlobStatusRequest(); + statusRequest.setRequestId(cid); + const statusResponse = await getBlobStatus(client, statusRequest); + const blobIndex = statusResponse.getInfo()?.getBlobVerificationProof()?.getBlobIndex(); + const batchHeaderHash = statusResponse.getInfo()?.getBlobVerificationProof()?.getBatchMetadata()?.getBatchHeaderHash(); + + if (!blobIndex || !batchHeaderHash) { + console.log('Blob dispersal is still in progress. Blob status:'); + console.log(statusResponse.toObject()); + return null; + } + + const retrieveRequest = new RetrieveBlobRequest(); + retrieveRequest.setBlobIndex(blobIndex); + retrieveRequest.setBatchHeaderHash(batchHeaderHash); + const response = await retrieveBlob(client, retrieveRequest); + const data = Buffer.from(response.getData()).toString('utf-8').replace(/\0/g, ''); + return JSON.parse(data); +} + +function getBlobStatus(client, request) { + return new Promise((resolve, reject) => { + client.getBlobStatus(request, (err, response) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +function retrieveBlob(client, request) { + return new Promise((resolve, reject) => { + client.retrieveBlob(request, (err, response) => { + if (err) { + reject(err); + } else { + resolve(response); + } + }); + }); +} + +module.exports = { + init, + getEigenDATask, +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/src/task.controller.js b/clone-agent/eigen-layer/Validation_Service/src/task.controller.js new file mode 100644 index 00000000..fe649188 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/src/task.controller.js @@ -0,0 +1,22 @@ +"use strict"; +const { Router } = require("express") +const CustomError = require("./utils/validateError"); +const CustomResponse = require("./utils/validateResponse"); +const validatorService = require("./validator.service"); + +const router = Router() + +router.post("/validate", async (req, res) => { + var proofOfTask = req.body.proofOfTask; + console.log(`Validate task: proof of task: ${proofOfTask}`); + try { + const result = await validatorService.validate(proofOfTask); + console.log('Vote:', result ? 'Approve' : 'Not Approved'); + return res.status(200).send(new CustomResponse(result)); + } catch (error) { + console.log(error) + return res.status(500).send(new CustomError("Something went wrong", {})); + } +}) + +module.exports = router diff --git a/clone-agent/eigen-layer/Validation_Service/src/test-subscription.js b/clone-agent/eigen-layer/Validation_Service/src/test-subscription.js new file mode 100644 index 00000000..c05e45a5 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/src/test-subscription.js @@ -0,0 +1,13 @@ +const { subscribeToChat } = require('./ai.service'); + +async function testSubscription() { + console.log('🟡 Starting subscription test...'); + try { + const response = await subscribeToChat(); + console.log('🟢 Test successful:', response); + } catch (error) { + console.error('🔴 Test failed:', error.message); + } +} + +testSubscription(); \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/src/utils/validateError.js b/clone-agent/eigen-layer/Validation_Service/src/utils/validateError.js new file mode 100644 index 00000000..31c5ba0c --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/src/utils/validateError.js @@ -0,0 +1,20 @@ +'use strict'; +module.exports = class CustomError { + error = true + /** + * @type {string} + */ + message + /** + * @type {any} + */ + data + /** + * @param {string} message + * @param {any} data + */ + constructor(message, data) { + this.data = data + this.message = message + } +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/src/utils/validateResponse.js b/clone-agent/eigen-layer/Validation_Service/src/utils/validateResponse.js new file mode 100644 index 00000000..14439472 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/src/utils/validateResponse.js @@ -0,0 +1,16 @@ +'use strict'; +module.exports = class CustomResponse { + /** + * @type {any} + */ + data + error = false + message = null + /** + * @param {any} data + */ + constructor(data, message) { + this.data = data + this.message = message + } +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/Validation_Service/src/validator.service.js b/clone-agent/eigen-layer/Validation_Service/src/validator.service.js new file mode 100644 index 00000000..9eed9f17 --- /dev/null +++ b/clone-agent/eigen-layer/Validation_Service/src/validator.service.js @@ -0,0 +1,27 @@ +require('dotenv').config(); +const dalService = require("./dal.service"); +const aiService = require("./ai.service"); + +async function validate(proofOfTask) { + console.log('Proof of task: ', proofOfTask); + try { + const taskResult = await dalService.getEigenDATask(proofOfTask); + if (taskResult === null) { + throw new Error(`ProofOfTask not found on EigenDA: ${proofOfTask}`); + } + var data = await aiService.subscribeToChat(); + var threadId = data.threadId + let isApproved = true; + if (taskResult.threadId !== threadId) { + isApproved = false; + } + return isApproved; + } catch (err) { + console.error(err?.message); + return false; + } +} + +module.exports = { + validate, +} \ No newline at end of file diff --git a/clone-agent/eigen-layer/docker-compose.yml b/clone-agent/eigen-layer/docker-compose.yml new file mode 100644 index 00000000..28433639 --- /dev/null +++ b/clone-agent/eigen-layer/docker-compose.yml @@ -0,0 +1,127 @@ +version: "3.7" +x-othentic-cli: &othentic-cli + env_file: + - .env + build: + context: . + dockerfile: ./Dockerfile +services: + aggregator: + <<: *othentic-cli + command: ["node", "aggregator", "--json-rpc"] + environment: + - PRIVATE_KEY=${PRIVATE_KEY_AGGREGATOR:-${PRIVATE_KEY:-}} + ports: + - "8545:8545" + - "9876:9876" + networks: + p2p: + ipv4_address: 10.8.0.69 + attester-1: + <<: *othentic-cli + command: + [ + "node", + "attester", + "/ip4/10.8.0.69/tcp/9876/p2p/${OTHENTIC_BOOTSTRAP_ID}", + "--avs-webapi", + "http://10.8.0.42", + ] + environment: + - PRIVATE_KEY=${PRIVATE_KEY_ATTESTER1:-${PRIVATE_KEY_VALIDATOR1:-}} + - TASK_PERFORMER=0x0000000000000000000000000000000000000000 + depends_on: + aggregator: + condition: service_started + networks: + p2p: + ipv4_address: 10.8.0.2 + attester-2: + <<: *othentic-cli + command: + [ + "node", + "attester", + "/ip4/10.8.0.69/tcp/9876/p2p/${OTHENTIC_BOOTSTRAP_ID}", + "--avs-webapi", + "http://10.8.0.42", + ] + environment: + - PRIVATE_KEY=${PRIVATE_KEY_ATTESTER2:-${PRIVATE_KEY_VALIDATOR2:-}} + - TASK_PERFORMER=0x0000000000000000000000000000000000000000 + depends_on: + aggregator: + condition: service_started + networks: + p2p: + ipv4_address: 10.8.0.3 + attester-3: + <<: *othentic-cli + command: + [ + "node", + "attester", + "/ip4/10.8.0.69/tcp/9876/p2p/${OTHENTIC_BOOTSTRAP_ID}", + "--avs-webapi", + "http://10.8.0.42", + ] + environment: + - PRIVATE_KEY=${PRIVATE_KEY_ATTESTER3:-${PRIVATE_KEY_VALIDATOR3:-}} + - TASK_PERFORMER=0x0000000000000000000000000000000000000000 + depends_on: + aggregator: + condition: service_started + networks: + p2p: + ipv4_address: 10.8.0.4 + set-syncer: + env_file: + - .env + build: + context: . + dockerfile: ./Set_Syncer/Dockerfile + syncer: + <<: *othentic-cli + command: ["node", "sync", "--sync-interval", "12h"] + environment: + - PRIVATE_KEY=${PRIVATE_KEY_SYNCER} + - ATTESTATION_CENTER_ADDRESS=${ATTESTATION_CENTER_ADDRESS} + - AVS_GOVERNANCE_ADDRESS=${AVS_GOVERNANCE_ADDRESS} + depends_on: + set-syncer: + condition: service_completed_successfully + networks: + p2p: + ipv4_address: 10.8.0.6 + validation-service: + build: + context: ./Validation_Service + dockerfile: ./Dockerfile + env_file: + - .env + networks: + p2p: + ipv4_address: 10.8.0.42 + execution-service: + build: + context: ./Execution_Service + dockerfile: ./Dockerfile + environment: + - OTHENTIC_CLIENT_RPC_ADDRESS=http://10.8.0.69:8545 + - PRIVATE_KEY=${PRIVATE_KEY_PERFORMER:-${PRIVATE_KEY:-}} + env_file: + - .env + ports: + - "4003:4003" + networks: + default: + p2p: + ipv4_address: 10.8.0.101 + +networks: + p2p: + driver: bridge + ipam: + config: + - subnet: 10.8.0.0/16 + gateway: 10.8.0.1 diff --git a/clone-agent/eliza-on-flow/.editorconfig b/clone-agent/eliza-on-flow/.editorconfig new file mode 100644 index 00000000..1769e4f1 --- /dev/null +++ b/clone-agent/eliza-on-flow/.editorconfig @@ -0,0 +1,22 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.cdc] +indent_style = space +indent_size = 4 + +[*.key] +insert_final_newline = false + +[Makefile] +indent_style = tab diff --git a/clone-agent/eliza-on-flow/.env.example b/clone-agent/eliza-on-flow/.env.example new file mode 120000 index 00000000..6d11299d --- /dev/null +++ b/clone-agent/eliza-on-flow/.env.example @@ -0,0 +1 @@ +deps/eliza/.env.example \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/.env.flow.example b/clone-agent/eliza-on-flow/.env.flow.example new file mode 100644 index 00000000..0362d8af --- /dev/null +++ b/clone-agent/eliza-on-flow/.env.flow.example @@ -0,0 +1,7 @@ + +# Flow Blockchain Configuration +FLOW_ADDRESS= +FLOW_PRIVATE_KEY= # Private key for SHA3-256 + P256 ECDSA +FLOW_NETWORK= # Default: mainnet +FLOW_ENDPOINT_URL= # Default: https://mainnet.onflow.org + diff --git a/clone-agent/eliza-on-flow/.github/ISSUE_TEMPLATE/bug_report.md b/clone-agent/eliza-on-flow/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..7d707c90 --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "" +labels: "bug" +assignees: "" +--- + +**Describe the bug** + + + +**To Reproduce** + + + +**Expected behavior** + + + +**Screenshots** + + + +**Additional context** + + diff --git a/clone-agent/eliza-on-flow/.github/ISSUE_TEMPLATE/feature_request.md b/clone-agent/eliza-on-flow/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..7eeb966c --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "" +labels: "enhancement" +assignees: "" +--- + +**Is your feature request related to a problem? Please describe.** + + + +**Describe the solution you'd like** + + + +**Describe alternatives you've considered** + + + +**Additional context** + + diff --git a/clone-agent/eliza-on-flow/.github/pull_request_template.md b/clone-agent/eliza-on-flow/.github/pull_request_template.md new file mode 100644 index 00000000..f78136ce --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/pull_request_template.md @@ -0,0 +1,88 @@ + + +# Relates to + + + + + +# Risks + + + +# Background + + + + + + + + +## What does this PR do? + + + +## What kind of change is this? + + + + + + + + +# Testing + +## Where should a reviewer start? + +## Detailed testing steps + + + + + + + + + + + + + + + + + + + diff --git a/clone-agent/eliza-on-flow/.github/workflows/generate-changelog.yml b/clone-agent/eliza-on-flow/.github/workflows/generate-changelog.yml new file mode 100644 index 00000000..5b2cd359 --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/workflows/generate-changelog.yml @@ -0,0 +1,30 @@ +name: Generate Changelog +on: + push: + tags: + - "*" +jobs: + changelog: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + ref: main + token: ${{ secrets.CHANGELOG_GITHUB_TOKEN }} + - name: Generate Changelog + run: | + export PATH="$PATH:/home/runner/.local/share/gem/ruby/3.0.0/bin" + gem install --user-install github_changelog_generator + github_changelog_generator \ + -u ${{ github.repository_owner }} \ + -p ${{ github.event.repository.name }} \ + --token ${{ secrets.CHANGELOG_GITHUB_TOKEN }} + - name: Commit Changelog + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore: update changelog" + branch: main + file_pattern: "CHANGELOG.md" + commit_author: "GitHub Action " diff --git a/clone-agent/eliza-on-flow/.github/workflows/pr.yaml b/clone-agent/eliza-on-flow/.github/workflows/pr.yaml new file mode 100644 index 00000000..5ead06d3 --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/workflows/pr.yaml @@ -0,0 +1,32 @@ +name: PR Title Check + +on: + pull_request: + types: [opened, edited, synchronize] + +jobs: + check-pr-title: + runs-on: ubuntu-latest + + steps: + - name: Check out the repository + uses: actions/checkout@v3 + + - name: Validate PR title + id: validate + run: | + PR_TITLE=$(jq -r .pull_request.title "$GITHUB_EVENT_PATH") + echo "PR Title: $PR_TITLE" + if [[ ! "$PR_TITLE" =~ ^(feat|fix|docs|style|refactor|test|chore)(\([a-zA-Z0-9-]+\))?:\ .+ ]]; then + echo "PR title does not match the required pattern." + exit 1 + fi + + - name: Set status + if: failure() + env: + GH_TOKEN: ${{ github.token }} + run: | + gh pr comment ${{ github.event.pull_request.number }} --body "❌ PR title does not match the required pattern. Please use one of these formats: + - 'type: description' (e.g., 'feat: add new feature') + - 'type(scope): description' (e.g., 'chore(core): update dependencies')" diff --git a/clone-agent/eliza-on-flow/.github/workflows/pre-release.yml b/clone-agent/eliza-on-flow/.github/workflows/pre-release.yml new file mode 100644 index 00000000..e228b9d0 --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/workflows/pre-release.yml @@ -0,0 +1,76 @@ +name: Pre-Release + +on: + workflow_dispatch: + inputs: + release_type: + description: "Type of release (prerelease, prepatch, patch, minor, preminor, major)" + required: true + default: "prerelease" + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v4 + with: + node-version: 22 + + - uses: pnpm/action-setup@v3 + with: + version: 8 + + - name: Configure Git + run: | + git config user.name "${{ github.actor }}" + git config user.email "${{ github.actor }}@users.noreply.github.com" + + - name: "Setup npm for npmjs" + run: | + npm config set registry https://registry.npmjs.org/ + echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc + + - name: Install Protobuf Compiler + run: sudo apt-get install -y protobuf-compiler + + - name: Install dependencies + run: pnpm install + + - name: Build packages + run: pnpm run build + + - name: Tag and Publish Packages + id: tag_publish + run: | + RELEASE_TYPE=${{ github.event_name == 'push' && 'prerelease' || github.event.inputs.release_type }} + npx lerna version $RELEASE_TYPE --conventional-commits --yes --no-private --force-publish + npx lerna publish from-git --yes --dist-tag next + + - name: Get Version Tag + id: get_tag + run: echo "TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_OUTPUT + + - name: Generate Release Body + id: release_body + run: | + if [ -f CHANGELOG.md ]; then + echo "body=$(cat CHANGELOG.md)" >> $GITHUB_OUTPUT + else + echo "body=No changelog provided for this release." >> $GITHUB_OUTPUT + fi + + - name: Create GitHub Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} + PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin + with: + tag_name: ${{ steps.get_tag.outputs.TAG }} + release_name: Release + body_path: CHANGELOG.md + draft: false + prerelease: ${{ github.event_name == 'push' }} diff --git a/clone-agent/eliza-on-flow/.github/workflows/release.yaml b/clone-agent/eliza-on-flow/.github/workflows/release.yaml new file mode 100644 index 00000000..d640179b --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/workflows/release.yaml @@ -0,0 +1,61 @@ +name: Release + +on: + release: + types: [created] + workflow_dispatch: + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v4 + with: + node-version: 23.3.0 + + - uses: pnpm/action-setup@v3 + with: + version: 9.15.0 + + - name: Configure Git + run: | + git config user.name "${{ github.actor }}" + git config user.email "${{ github.actor }}@users.noreply.github.com" + + - name: "Setup npm for npmjs" + run: | + npm config set registry https://registry.npmjs.org/ + echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc + + - name: Install Protobuf Compiler + run: sudo apt-get install -y protobuf-compiler + + - name: Install dependencies + run: pnpm install -r --no-frozen-lockfile + + - name: Build packages + run: pnpm run build + + - name: Publish Packages + id: publish + run: | + # Get the latest release tag + LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`) + + # Force clean the working directory and reset any changes + echo "Cleaning working directory and resetting any changes" + git clean -fd + git reset --hard HEAD + + # Force checkout the latest tag + echo "Checking out latest tag: $LATEST_TAG" + git checkout -b temp-publish-branch $LATEST_TAG + + echo "Publishing version: $LATEST_TAG" + npx lerna publish from-package --yes --dist-tag latest + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/clone-agent/eliza-on-flow/.github/workflows/sync-upstream.yaml b/clone-agent/eliza-on-flow/.github/workflows/sync-upstream.yaml new file mode 100644 index 00000000..fe1989e0 --- /dev/null +++ b/clone-agent/eliza-on-flow/.github/workflows/sync-upstream.yaml @@ -0,0 +1,48 @@ +name: Sync Upstream Branches + +on: + schedule: + # Run every day at 00:00 + - cron: '0 0 * * *' + workflow_dispatch: + +jobs: + sync-upstream: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Add upstream remote + run: | + git remote add upstream https://github.com/fixes-world/elizaOnFlow.git + git fetch upstream + + - name: Check and create develop branch if not exists + run: | + if ! git show-ref --quiet refs/heads/develop; then + git checkout -b develop upstream/develop + git push --set-upstream origin develop + fi + + - name: Check and create main branch if not exists + run: | + if ! git show-ref --quiet refs/heads/main; then + git checkout -b main upstream/main + git push --set-upstream origin main + fi + + - name: Sync develop branch + run: | + git checkout develop + git pull upstream develop + git push origin develop || echo "Develop branch sync failed" + + - name: Sync main branch + run: | + git checkout main + git pull upstream main + git push origin main || echo "Main branch sync failed" diff --git a/clone-agent/eliza-on-flow/.gitignore b/clone-agent/eliza-on-flow/.gitignore new file mode 100644 index 00000000..45a395ad --- /dev/null +++ b/clone-agent/eliza-on-flow/.gitignore @@ -0,0 +1,191 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# From Eliza + +concatenated-output.ts +embedding-cache.json + +# Allow models directory but ignore model files +models/*.gguf + +cookies.json + +db.sqlite +searches/ +tweets/ + +*.gguf +*.onnx +*.wav +*.mp3 + +logs/ + +test-report.json +content_cache/ +test_data/ +tokencache/ +tweetcache/ +twitter_cookies.json +timeline_cache.json + +*.sqlite + +imports/ + +deps/eliza/packages/core/src/providers/cache +deps/eliza/packages/core/src/providers/cache/* +cache/* + +tsup.config.bundled_*.mjs + +.turbo +.cursorrules + +coverage +.eslintcache + +agent/content + +eliza.manifest +eliza.manifest.sgx +eliza.sig + +characters/**/secrets.json +characters/*.character.json + +lit-config.json + +# Configuration to exclude the extra and local_docs directories +extra + +*.pkey diff --git a/clone-agent/eliza-on-flow/.gitmodules b/clone-agent/eliza-on-flow/.gitmodules new file mode 100644 index 00000000..d9bc7ccd --- /dev/null +++ b/clone-agent/eliza-on-flow/.gitmodules @@ -0,0 +1,3 @@ +[submodule "deps/eliza"] + path = deps/eliza + url = https://github.com/btspoony/eliza.git diff --git a/clone-agent/eliza-on-flow/.gitpod.yml b/clone-agent/eliza-on-flow/.gitpod.yml new file mode 120000 index 00000000..c01aff9b --- /dev/null +++ b/clone-agent/eliza-on-flow/.gitpod.yml @@ -0,0 +1 @@ +deps/eliza/.gitpod.yml \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/.npmrc b/clone-agent/eliza-on-flow/.npmrc new file mode 120000 index 00000000..67864c1d --- /dev/null +++ b/clone-agent/eliza-on-flow/.npmrc @@ -0,0 +1 @@ +deps/eliza/.npmrc \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/.nvmrc b/clone-agent/eliza-on-flow/.nvmrc new file mode 120000 index 00000000..f94ac4ad --- /dev/null +++ b/clone-agent/eliza-on-flow/.nvmrc @@ -0,0 +1 @@ +deps/eliza/.nvmrc \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/.prettierignore b/clone-agent/eliza-on-flow/.prettierignore new file mode 100644 index 00000000..172df038 --- /dev/null +++ b/clone-agent/eliza-on-flow/.prettierignore @@ -0,0 +1,9 @@ +**/*/target +**/*/dist + +# ignore lock files +**/*-lock.yaml +package-lock.json +dev-dist + +**/CHANGELOG.md diff --git a/clone-agent/eliza-on-flow/.vscode/extensions.json b/clone-agent/eliza-on-flow/.vscode/extensions.json new file mode 100644 index 00000000..dfe330fc --- /dev/null +++ b/clone-agent/eliza-on-flow/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "biomejs.biome", + ], + "unwantedRecommendations": [] +} \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/.vscode/settings.json b/clone-agent/eliza-on-flow/.vscode/settings.json new file mode 100644 index 00000000..5cff654d --- /dev/null +++ b/clone-agent/eliza-on-flow/.vscode/settings.json @@ -0,0 +1,39 @@ +{ + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "editor.formatOnSave": true, + "editor.insertSpaces": true, + "editor.detectIndentation": false, + "editor.tabSize": 4, + "biome.enabled": true, + "eslint.enable": false, + "eslint.format.enable": false, + "prettier.enable": false, + "javascript.format.enable": false, + "typescript.format.enable": false, + "files.trimTrailingWhitespace": true, + "editor.trimAutoWhitespace": true, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[jsonc]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "files.associations": { + "*.css": "tailwindcss" + }, + "typescript.tsdk": "node_modules/typescript/lib" +} diff --git a/clone-agent/eliza-on-flow/CHANGELOG.md b/clone-agent/eliza-on-flow/CHANGELOG.md new file mode 100644 index 00000000..825c32f0 --- /dev/null +++ b/clone-agent/eliza-on-flow/CHANGELOG.md @@ -0,0 +1 @@ +# Changelog diff --git a/clone-agent/eliza-on-flow/CODE_OF_CONDUCT.md b/clone-agent/eliza-on-flow/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..29183cdd --- /dev/null +++ b/clone-agent/eliza-on-flow/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[telegram group](https://t.me/fixes_world). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +. Translations are available at +. diff --git a/clone-agent/eliza-on-flow/LICENSE b/clone-agent/eliza-on-flow/LICENSE new file mode 100644 index 00000000..4a7a4b2a --- /dev/null +++ b/clone-agent/eliza-on-flow/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Fixes World + +Permission 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: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE 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. diff --git a/clone-agent/eliza-on-flow/README.md b/clone-agent/eliza-on-flow/README.md new file mode 100644 index 00000000..ab4a42c7 --- /dev/null +++ b/clone-agent/eliza-on-flow/README.md @@ -0,0 +1,66 @@ +# Eliza 🤖 on Flow Blockchain + +Flow-dedicated Autonomous Agents powered by [Eliza](https://github.com/elizaOs/eliza). + +
+ ElizaOnFlow Banner +
+ +## ✨ Features & Use Cases + +> Basic Features + +Check out the [Eliza's README](https://github.com/elizaOS/eliza/tree/main?tab=readme-ov-file#-features) + +> Extra Features + +- Provide Flow-dedicated Agent without other extra blockchain dependencies runtime(by default). + - You can still use other blockchains if you want. +- Use [InversifyJS](https://github.com/inversify/InversifyJS) for dependency injection. + - Share the same instances of providers across the application and plugins. + - All actions / evaluators / providers for plugins can be dynamically loaded and injected. + - Provide standard action / evaluator wrapper for plugins. + - Let develoeprs focus on the business logic of actions / evaluators. +- Use shared `flow.json` for all Flow Cadence contracts dependencies in Flow relevant plugins. +- Provide accounts management for AI Agents based on Flow’s unique Account Linking feature. + - Fully on-chain child accounts management without any extra off-chain private key custodial service. + - Each user account in Eliza system can be allocated with a full functional Flow wallet fully controlled by the AI Agent as its child account. + - You can customize any transaction for your users based on the on-chain child accounts management system. +- Both Flow EVM and Flow Cadence projects will be supported. +- Fully compatible with origin Eliza plugins. + +## 🚀 Quick Start + +Please follow the [Quick Start Guide](./docs/guides/quickstart.md) to create your first Agent on Flow. + +## 🌊 Flow Cadence + +### Core Cadence Contracts + +- [AccountsPool](./cadence/contracts/AccountsPool.cdc) - A contract to let the agent account manage multiple child accounts. + +| Contract | Testnet Address | Mainnet Address | +| --- | --- | --- | +| AccountsPool | [0x9f9cd022231f7a19](https://testnet.flowscan.io/contract/A.9f9cd022231f7a19.AccountsPool) | [0xa253e78e8971f273](https://www.flowscan.io/contract/A.a253e78e8971f273.AccountsPool) | + +### Install / Add new Flow Cadence contracts dependencies + +All Flow Cadence contracts dependencies should be installed to `flow.json` file. +To ensure development and deployment, you need to install all dependencies. + +```bash +flow deps install +``` + +And if you want to add a new contract dependency, you can use the following command: + +```bash +flow deps add mainnet://0xAddress.ContractName +``` + +### Community & contact + +- [GitHub Issues](https://github.com/fixes-world/elizaOnFlow/issues). Best for: bugs you encounter using ElizaOnFlow, and feature proposals. +- [Fixes Telegram](https://t.me/fixes_world). Best for: sharing your applications and hanging out with the Fixes community. +- [Eliza Discord](https://discord.gg/ai16z) +- [Flow Discord](https://discord.gg/flow) diff --git a/clone-agent/eliza-on-flow/agent/.gitignore b/clone-agent/eliza-on-flow/agent/.gitignore new file mode 100644 index 00000000..54b041f3 --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/.gitignore @@ -0,0 +1,5 @@ +.env +*.env +.env* +/data +/generatedImages diff --git a/clone-agent/eliza-on-flow/agent/jest.config.js b/clone-agent/eliza-on-flow/agent/jest.config.js new file mode 100644 index 00000000..984eca86 --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/jest.config.js @@ -0,0 +1,17 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +export default { + preset: "ts-jest", + testEnvironment: "node", + extensionsToTreatAsEsm: [".ts"], + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + }, + transform: { + "^.+\\.tsx?$": [ + "ts-jest", + { + useESM: true, + }, + ], + }, +}; diff --git a/clone-agent/eliza-on-flow/agent/nodemon.json b/clone-agent/eliza-on-flow/agent/nodemon.json new file mode 100644 index 00000000..c6ec5ae4 --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/nodemon.json @@ -0,0 +1,11 @@ +{ + "watch": [ + "src", + "../core/dist" + ], + "ext": "ts,json", + "ignore": [ + "src/**/*.spec.ts" + ], + "exec": "node --enable-source-maps --loader ts-node/esm src/index.ts" +} diff --git a/clone-agent/eliza-on-flow/agent/package.json b/clone-agent/eliza-on-flow/agent/package.json new file mode 100644 index 00000000..d86d4c43 --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/package.json @@ -0,0 +1,159 @@ +{ + "name": "@fixes-ai/agent", + "version": "0.1.0-alpha.0", + "main": "src/index.ts", + "type": "module", + "scripts": { + "start": "node --loader ts-node/esm src/index.ts", + "dev": "node --loader ts-node/esm src/index.ts", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@elizaos/adapter-supabase": "workspace:*", + "@elizaos/adapter-pglite": "workspace:*", + "@elizaos/adapter-postgres": "workspace:*", + "@elizaos/adapter-redis": "workspace:*", + "@elizaos/adapter-sqlite": "workspace:*", + "@elizaos/adapter-qdrant": "workspace:*", + "@elizaos/adapter-mongodb": "workspace:*", + "@elizaos/client-auto": "workspace:*", + "@elizaos/client-direct": "workspace:*", + "@elizaos/client-discord": "workspace:*", + "@elizaos/client-farcaster": "workspace:*", + "@elizaos/client-lens": "workspace:*", + "@elizaos/client-telegram": "workspace:*", + "@elizaos/client-telegram-account": "workspace:*", + "@elizaos/client-twitter": "workspace:*", + "@elizaos/client-instagram": "workspace:*", + "@elizaos/client-slack": "workspace:*", + "@elizaos/client-alexa": "workspace:*", + "@elizaos/client-simsai": "workspace:*", + "@elizaos/core": "workspace:*", + "@elizaos/plugin-0g": "workspace:*", + "@elizaos/plugin-abstract": "workspace:*", + "@elizaos/plugin-agentkit": "workspace:*", + "@elizaos/plugin-aptos": "workspace:*", + "@elizaos/plugin-birdeye": "workspace:*", + "@elizaos/plugin-zerion": "workspace:*", + "@elizaos/plugin-binance": "workspace:*", + "@elizaos/plugin-avail": "workspace:*", + "@elizaos/plugin-bnb": "workspace:*", + "@elizaos/plugin-bootstrap": "workspace:*", + "@elizaos/plugin-di": "workspace:*", + "@elizaos/plugin-intiface": "workspace:*", + "@elizaos/plugin-coinbase": "workspace:*", + "@elizaos/plugin-coingecko": "workspace:*", + "@elizaos/plugin-coinmarketcap": "workspace:*", + "@elizaos/plugin-conflux": "workspace:*", + "@elizaos/plugin-cosmos": "workspace:*", + "@elizaos/plugin-desk-exchange": "workspace:*", + "@elizaos/plugin-echochambers": "workspace:*", + "@elizaos/plugin-evm": "workspace:*", + "@elizaos/plugin-edwin": "workspace:*", + "@elizaos/plugin-flow": "workspace:*", + "@elizaos/plugin-gelato": "workspace:*", + "@elizaos/plugin-giphy": "workspace:*", + "@elizaos/plugin-gitbook": "workspace:*", + "@elizaos/plugin-gitcoin-passport": "workspace:*", + "@elizaos/plugin-goat": "workspace:*", + "@elizaos/plugin-icp": "workspace:*", + "@elizaos/plugin-initia": "workspace:*", + "@elizaos/plugin-image-generation": "workspace:*", + "@elizaos/plugin-lens-network": "workspace:*", + "@elizaos/plugin-lit": "workspace:*", + "@elizaos/plugin-massa": "workspace:*", + "@elizaos/plugin-mind-network": "workspace:*", + "@elizaos/plugin-moralis": "workspace:*", + "@elizaos/plugin-movement": "workspace:*", + "@elizaos/plugin-news": "workspace:*", + "@elizaos/plugin-nft-generation": "workspace:*", + "@elizaos/plugin-node": "workspace:*", + "@elizaos/plugin-quick-intel": "workspace:*", + "@elizaos/plugin-solana": "workspace:*", + "@elizaos/plugin-solana-v2": "workspace:*", + "@elizaos/plugin-injective": "workspace:*", + "@elizaos/plugin-solana-agent-kit": "workspace:*", + "@elizaos/plugin-squid-router": "workspace:*", + "@elizaos/plugin-autonome": "workspace:*", + "@elizaos/plugin-starknet": "workspace:*", + "@elizaos/plugin-story": "workspace:*", + "@elizaos/plugin-sui": "workspace:*", + "@elizaos/plugin-sgx": "workspace:*", + "@elizaos/plugin-iq6900": "workspace:*", + "@elizaos/plugin-tee": "workspace:*", + "@elizaos/plugin-tee-log": "workspace:*", + "@elizaos/plugin-tee-marlin": "workspace:*", + "@elizaos/plugin-ton": "workspace:*", + "@elizaos/plugin-twitter": "workspace:*", + "@elizaos/plugin-primus": "workspace:*", + "@elizaos/plugin-cronoszkevm": "workspace:*", + "@elizaos/plugin-cronos": "workspace:*", + "@elizaos/plugin-3d-generation": "workspace:*", + "@elizaos/plugin-fuel": "workspace:*", + "@elizaos/plugin-avalanche": "workspace:*", + "@elizaos/plugin-video-generation": "workspace:*", + "@elizaos/plugin-web-search": "workspace:*", + "@elizaos/plugin-dexscreener": "workspace:*", + "@elizaos/plugin-letzai": "workspace:*", + "@elizaos/plugin-thirdweb": "workspace:*", + "@elizaos/plugin-genlayer": "workspace:*", + "@elizaos/plugin-tee-verifiable-log": "workspace:*", + "@elizaos/plugin-depin": "workspace:*", + "@elizaos/plugin-open-weather": "workspace:*", + "@elizaos/plugin-obsidian": "workspace:*", + "@elizaos/plugin-arthera": "workspace:*", + "@elizaos/plugin-allora": "workspace:*", + "@elizaos/plugin-opacity": "workspace:*", + "@elizaos/plugin-hyperliquid": "workspace:*", + "@elizaos/plugin-akash": "workspace:*", + "@elizaos/plugin-quai": "workspace:*", + "@elizaos/plugin-lightning": "workspace:*", + "@elizaos/plugin-b2": "workspace:*", + "@elizaos/plugin-nft-collections": "workspace:*", + "@elizaos/plugin-pyth-data": "workspace:*", + "@elizaos/plugin-openai": "workspace:*", + "@elizaos/plugin-devin": "workspace:*", + "@elizaos/plugin-holdstation": "workspace:*", + "@elizaos/plugin-router-nitro": "workspace:*", + "@elizaos/plugin-nvidia-nim": "workspace:*", + "@elizaos/plugin-0x": "workspace:*", + "@elizaos/plugin-bittensor": "workspace:*", + "@elizaos/plugin-chainbase": "workspace:*", + "@elizaos/plugin-dkg": "workspace:*", + "@elizaos/plugin-email": "workspace:*", + "@elizaos/plugin-sei": "workspace:*", + "@elizaos/plugin-omniflix": "workspace:*", + "@elizaos/plugin-suno": "workspace:*", + "@elizaos/plugin-udio": "workspace:*", + "@elizaos/plugin-hyperbolic": "workspace:*", + "@elizaos/plugin-football": "workspace:*", + "@elizaos/plugin-imgflip": "workspace:*", + "@elizaos/plugin-ethstorage": "workspace:*", + "@elizaos/plugin-mina": "workspace:*", + "@elizaos/plugin-email-automation": "workspace:*", + "@elizaos/plugin-dcap": "workspace:*", + "@elizaos/plugin-form": "workspace:*", + "@elizaos/plugin-ankr": "workspace:*", + "@elizaos/client-xmtp": "workspace:*", + "@elizaos/plugin-trikon": "workspace:*", + "@elizaos/plugin-zilliqa": "workspace:*", + "@elizaos/client-deva": "workspace:*", + "@elizaos/plugin-arbitrage": "workspace:*", + "@elizaos/plugin-multiversx": "workspace:*", + "@elizaos/plugin-near": "workspace:*", + "@elizaos/plugin-stargaze": "workspace:*", + "@elizaos/plugin-zksync-era": "workspace:*", + "@fixes-ai/core": "workspace:*", + "@fixes-ai/common": "workspace:*", + "readline": "1.3.0", + "ws": "8.18.0", + "yargs": "17.7.2" + }, + "devDependencies": { + "@types/jest": "^29.5.14", + "jest": "^29.7.0", + "ts-jest": "^29.2.5", + "ts-node": "10.9.2", + "tsup": "8.3.5" + } +} diff --git a/clone-agent/eliza-on-flow/agent/src/character.ts b/clone-agent/eliza-on-flow/agent/src/character.ts new file mode 100644 index 00000000..d916e54d --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/src/character.ts @@ -0,0 +1,20 @@ +import { + type Character, + ModelProviderName, + defaultCharacter as DefaultElizaCharacter, +} from "@elizaos/core"; +import { basicFlowPlugin } from "@fixes-ai/common"; + +const localDefaultCharacter: Character = { + modelProvider: ModelProviderName.OPENAI, + plugins: [basicFlowPlugin], +} as Character; + +export const defaultCharacter: Character = Object.assign( + {}, + DefaultElizaCharacter, + localDefaultCharacter +); + +export default defaultCharacter; + \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/agent/src/index.ts b/clone-agent/eliza-on-flow/agent/src/index.ts new file mode 100644 index 00000000..7f875417 --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/src/index.ts @@ -0,0 +1,114 @@ +import { elizaLogger, parseBooleanFromText, settings } from "@elizaos/core"; +import { DirectClient } from "@elizaos/client-direct"; +import { normalizeCharacter } from "@elizaos/plugin-di"; +import net from "node:net"; + +import { defaultCharacter } from "./character"; +import { + handlePluginImporting, + hasValidRemoteUrls, + jsonToCharacter, + loadCharacterFromOnchain, + loadCharacters, + loadCharacterTryPath, + parseArguments, + startAgent, +} from "./index.utils"; + +const checkPortAvailable = (port: number): Promise => { + return new Promise((resolve) => { + const server = net.createServer(); + + server.once("error", (err: NodeJS.ErrnoException) => { + if (err.code === "EADDRINUSE") { + resolve(false); + } + }); + + server.once("listening", () => { + server.close(); + resolve(true); + }); + + server.listen(port); + }); +}; + +const startAgents = async () => { + const directClient = new DirectClient(); + let serverPort = Number.parseInt(settings.SERVER_PORT || "3000"); + const args = parseArguments(); + const charactersArg = args.characters || args.character; + let characters = [defaultCharacter]; + + const useOnchain = process.env.IQ_WALLET_ADDRESS && process.env.IQSOlRPC; + if (useOnchain) { + characters = await loadCharacterFromOnchain(); + } + + if ((!useOnchain && charactersArg) || hasValidRemoteUrls()) { + characters = await loadCharacters(charactersArg); + } + + // Normalize characters for injectable plugins + characters = await Promise.all(characters.map(normalizeCharacter)); + + try { + for (const character of characters) { + await startAgent(character, directClient); + } + } catch (error) { + elizaLogger.error("Error starting agents:", error); + } + + // Find available port + while (!(await checkPortAvailable(serverPort))) { + elizaLogger.warn( + `Port ${serverPort} is in use, trying ${serverPort + 1}` + ); + serverPort++; + } + + // upload some agent functionality into directClient + directClient.startAgent = async (character) => { + // Handle plugins + character.plugins = await handlePluginImporting(character.plugins); + + // wrap it so we don't have to inject directClient later + return startAgent(await normalizeCharacter(character), directClient); + }; + + directClient.loadCharacterTryPath = loadCharacterTryPath; + directClient.jsonToCharacter = jsonToCharacter; + + directClient.start(serverPort); + + if (serverPort !== Number.parseInt(settings.SERVER_PORT || "3000")) { + elizaLogger.log(`Server started on alternate port ${serverPort}`); + } + + elizaLogger.log( + "Run `pnpm start:client` to start the client and visit the outputted URL (http://localhost:5173) to chat with your agents. When running multiple agents, use client with different port `SERVER_PORT=3001 pnpm start:client`" + ); +}; + +startAgents().catch((error) => { + elizaLogger.error("Unhandled error in startAgents:", error); + process.exit(1); +}); + +// Prevent unhandled exceptions from crashing the process if desired +if ( + process.env.PREVENT_UNHANDLED_EXIT && + parseBooleanFromText(process.env.PREVENT_UNHANDLED_EXIT) +) { + // Handle uncaught exceptions to prevent the process from crashing + process.on("uncaughtException", (err) => { + console.error("uncaughtException", err); + }); + + // Handle unhandled rejections to prevent the process from crashing + process.on("unhandledRejection", (err) => { + console.error("unhandledRejection", err); + }); +} diff --git a/clone-agent/eliza-on-flow/agent/src/index.utils.ts b/clone-agent/eliza-on-flow/agent/src/index.utils.ts new file mode 100644 index 00000000..b424d127 --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/src/index.utils.ts @@ -0,0 +1,1063 @@ +import { PGLiteDatabaseAdapter } from "@elizaos/adapter-pglite"; +import { PostgresDatabaseAdapter } from "@elizaos/adapter-postgres"; +import { QdrantDatabaseAdapter } from "@elizaos/adapter-qdrant"; +import { RedisClient } from "@elizaos/adapter-redis"; +import { SqliteDatabaseAdapter } from "@elizaos/adapter-sqlite"; +import { SupabaseDatabaseAdapter } from "@elizaos/adapter-supabase"; +import { MongoDBDatabaseAdapter } from "@elizaos/adapter-mongodb"; +import { AutoClientInterface } from "@elizaos/client-auto"; +import { DiscordClientInterface } from "@elizaos/client-discord"; +import { InstagramClientInterface } from "@elizaos/client-instagram"; +import { LensAgentClient } from "@elizaos/client-lens"; +import { SlackClientInterface } from "@elizaos/client-slack"; +import { TelegramClientInterface } from "@elizaos/client-telegram"; +import { TelegramAccountClientInterface } from "@elizaos/client-telegram-account"; +import { TwitterClientInterface } from "@elizaos/client-twitter"; +import { AlexaClientInterface } from "@elizaos/client-alexa"; +import { DevaClientInterface } from "@elizaos/client-deva"; + +import { FarcasterClientInterface } from "@elizaos/client-farcaster"; +import { JeeterClientInterface } from "@elizaos/client-simsai"; +import { XmtpClientInterface } from "@elizaos/client-xmtp"; +import type { DirectClient } from "@elizaos/client-direct"; + +import { + AgentRuntime, + CacheManager, + CacheStore, + type Character, + type Client, + Clients, + DbCacheAdapter, + defaultCharacter, + elizaLogger, + FsCacheAdapter, + type IAgentRuntime, + type ICacheManager, + type IDatabaseAdapter, + type IDatabaseCacheAdapter, + ModelProviderName, + settings, + stringToUuid, + validateCharacterConfig, +} from "@elizaos/core"; +import { PrimusAdapter } from "@elizaos/plugin-primus"; +import { bootstrapPlugin } from "@elizaos/plugin-bootstrap"; +import { ThreeDGenerationPlugin } from "@elizaos/plugin-3d-generation"; +import { imageGenerationPlugin } from "@elizaos/plugin-image-generation"; +import { createNodePlugin } from "@elizaos/plugin-node"; +import { OpacityAdapter } from "@elizaos/plugin-opacity"; +import { sgxPlugin } from "@elizaos/plugin-sgx"; +import { TEEMode, teePlugin } from "@elizaos/plugin-tee"; +import { teeLogPlugin } from "@elizaos/plugin-tee-log"; +import { teeMarlinPlugin } from "@elizaos/plugin-tee-marlin"; +import { verifiableLogPlugin } from "@elizaos/plugin-tee-verifiable-log"; + +import Database from "better-sqlite3"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import yargs from "yargs"; +import { MongoClient } from "mongodb"; + +const __filename = fileURLToPath(import.meta.url); // get the resolved path to the file +const __dirname = path.dirname(__filename); // get the name of the directory + +export const wait = (minTime = 1000, maxTime = 3000) => { + const waitTime = + Math.floor(Math.random() * (maxTime - minTime + 1)) + minTime; + return new Promise((resolve) => setTimeout(resolve, waitTime)); +}; + +const logFetch = async (url: string, options: any) => { + elizaLogger.debug(`Fetching ${url}`); + // Disabled to avoid disclosure of sensitive information such as API keys + // elizaLogger.debug(JSON.stringify(options, null, 2)); + return fetch(url, options); +}; + +export function parseArguments(): { + character?: string; + characters?: string; +} { + try { + return yargs(process.argv.slice(3)) + .option("character", { + type: "string", + description: "Path to the character JSON file", + }) + .option("characters", { + type: "string", + description: + "Comma separated list of paths to character JSON files", + }) + .parseSync(); + } catch (error) { + elizaLogger.error("Error parsing arguments:", error); + return {}; + } +} + +function tryLoadFile(filePath: string): string | null { + try { + return fs.readFileSync(filePath, "utf8"); + } catch (e) { + return null; + } +} +function mergeCharacters(base: Character, child: Character): Character { + const mergeObjects = (baseObj: any, childObj: any) => { + const result: any = {}; + const keys = new Set([ + ...Object.keys(baseObj || {}), + ...Object.keys(childObj || {}), + ]); + keys.forEach((key) => { + if ( + typeof baseObj[key] === "object" && + typeof childObj[key] === "object" && + !Array.isArray(baseObj[key]) && + !Array.isArray(childObj[key]) + ) { + result[key] = mergeObjects(baseObj[key], childObj[key]); + } else if ( + Array.isArray(baseObj[key]) || + Array.isArray(childObj[key]) + ) { + result[key] = [ + ...(baseObj[key] || []), + ...(childObj[key] || []), + ]; + } else { + result[key] = + childObj[key] !== undefined ? childObj[key] : baseObj[key]; + } + }); + return result; + }; + return mergeObjects(base, child); +} +function isAllStrings(arr: unknown[]): boolean { + return Array.isArray(arr) && arr.every((item) => typeof item === "string"); +} + +export async function loadCharacterFromOnchain(): Promise { + const { onchainJson } = await import("@elizaos/plugin-iq6900"); + const jsonText = onchainJson; + + console.log("JSON:", jsonText); + if (!jsonText) return []; + const loadedCharacters = []; + try { + const character = JSON.parse(jsonText); + validateCharacterConfig(character); + + // .id isn't really valid + const characterId = character.id || character.name; + const characterPrefix = `CHARACTER.${characterId + .toUpperCase() + .replace(/ /g, "_")}.`; + + const characterSettings = Object.entries(process.env) + .filter(([key]) => key.startsWith(characterPrefix)) + .reduce((settings, [key, value]) => { + const settingKey = key.slice(characterPrefix.length); + settings[settingKey] = value; + return settings; + }, {}); + + if (Object.keys(characterSettings).length > 0) { + character.settings = character.settings || {}; + character.settings.secrets = { + ...characterSettings, + ...character.settings.secrets, + }; + } + + // Handle plugins + if (isAllStrings(character.plugins)) { + elizaLogger.info("Plugins are: ", character.plugins); + const importedPlugins = await Promise.all( + character.plugins.map(async (plugin) => { + const importedPlugin = await import(plugin); + return importedPlugin.default; + }) + ); + character.plugins = importedPlugins; + } + + loadedCharacters.push(character); + elizaLogger.info( + `Successfully loaded character from: ${process.env.IQ_WALLET_ADDRESS}` + ); + return loadedCharacters; + } catch (e) { + elizaLogger.error( + `Error parsing character from ${process.env.IQ_WALLET_ADDRESS}: ${e}` + ); + process.exit(1); + } +} + +async function loadCharactersFromUrl(url: string): Promise { + try { + const response = await fetch(url); + const responseJson = await response.json(); + + let characters: Character[] = []; + if (Array.isArray(responseJson)) { + characters = await Promise.all( + responseJson.map((character) => jsonToCharacter(url, character)) + ); + } else { + const character = await jsonToCharacter(url, responseJson); + characters.push(character); + } + return characters; + } catch (e) { + elizaLogger.error(`Error loading character(s) from ${url}: ${e}`); + process.exit(1); + } +} + +export async function jsonToCharacter( + filePath: string, + character: any +): Promise { + validateCharacterConfig(character); + + // .id isn't really valid + const characterId = character.id || character.name; + const characterPrefix = `CHARACTER.${characterId + .toUpperCase() + .replace(/ /g, "_")}.`; + const characterSettings = Object.entries(process.env) + .filter(([key]) => key.startsWith(characterPrefix)) + .reduce((settings, [key, value]) => { + const settingKey = key.slice(characterPrefix.length); + return { ...settings, [settingKey]: value }; + }, {}); + if (Object.keys(characterSettings).length > 0) { + character.settings = character.settings || {}; + character.settings.secrets = { + ...characterSettings, + ...character.settings.secrets, + }; + } + // Handle plugins + character.plugins = await handlePluginImporting(character.plugins); + if (character.extends) { + elizaLogger.info( + `Merging ${character.name} character with parent characters` + ); + for (const extendPath of character.extends) { + const baseCharacter = await loadCharacter( + path.resolve(path.dirname(filePath), extendPath) + ); + character = mergeCharacters(baseCharacter, character); + elizaLogger.info( + `Merged ${character.name} with ${baseCharacter.name}` + ); + } + } + return character; +} + +async function loadCharacter(filePath: string): Promise { + const content = tryLoadFile(filePath); + if (!content) { + throw new Error(`Character file not found: ${filePath}`); + } + const character = JSON.parse(content); + return jsonToCharacter(filePath, character); +} + +export async function loadCharacterTryPath(characterPath: string): Promise { + let content: string | null = null; + let resolvedPath = ""; + + // Try different path resolutions in order + const pathsToTry = [ + characterPath, // exact path as specified + path.resolve(process.cwd(), characterPath), // relative to cwd + path.resolve(process.cwd(), "agent", characterPath), // Add this + path.resolve(__dirname, characterPath), // relative to current script + path.resolve(__dirname, "characters", path.basename(characterPath)), // relative to agent/characters + path.resolve(__dirname, "../characters", path.basename(characterPath)), // relative to characters dir from agent + path.resolve( + __dirname, + "../../characters", + path.basename(characterPath) + ), // relative to project root characters dir + ]; + + elizaLogger.info( + "Trying paths:", + pathsToTry.map((p) => ({ + path: p, + exists: fs.existsSync(p), + })) + ); + + for (const tryPath of pathsToTry) { + content = tryLoadFile(tryPath); + if (content !== null) { + resolvedPath = tryPath; + break; + } + } + + if (content === null) { + elizaLogger.error( + `Error loading character from ${characterPath}: File not found in any of the expected locations` + ); + elizaLogger.error("Tried the following paths:"); + pathsToTry.forEach((p) => elizaLogger.error(` - ${p}`)); + throw new Error( + `Error loading character from ${characterPath}: File not found in any of the expected locations` + ); + } + try { + const character: Character = await loadCharacter(resolvedPath); + elizaLogger.info(`Successfully loaded character from: ${resolvedPath}`); + return character; + } catch (e) { + elizaLogger.error(`Error parsing character from ${resolvedPath}: ${e}`); + throw new Error(`Error parsing character from ${resolvedPath}: ${e}`); + } +} + +function commaSeparatedStringToArray(commaSeparated: string): string[] { + return commaSeparated?.split(",").map((value) => value.trim()); +} + +async function readCharactersFromStorage( + characterPaths: string[] +): Promise { + try { + const uploadDir = path.join(process.cwd(), "data", "characters"); + await fs.promises.mkdir(uploadDir, { recursive: true }); + const fileNames = await fs.promises.readdir(uploadDir); + fileNames.forEach((fileName) => { + characterPaths.push(path.join(uploadDir, fileName)); + }); + } catch (err) { + elizaLogger.error(`Error reading directory: ${err.message}`); + } + + return characterPaths; +} + +export async function loadCharacters( + charactersArg: string +): Promise { + let characterPaths = commaSeparatedStringToArray(charactersArg); + + if (process.env.USE_CHARACTER_STORAGE === "true") { + characterPaths = await readCharactersFromStorage(characterPaths); + } + + const loadedCharacters: Character[] = []; + + if (characterPaths?.length > 0) { + for (const characterPath of characterPaths) { + try { + const character: Character = await loadCharacterTryPath( + characterPath + ); + loadedCharacters.push(character); + } catch (e) { + process.exit(1); + } + } + } + + if (hasValidRemoteUrls()) { + elizaLogger.info("Loading characters from remote URLs"); + const characterUrls = commaSeparatedStringToArray( + process.env.REMOTE_CHARACTER_URLS + ); + for (const characterUrl of characterUrls) { + const characters = await loadCharactersFromUrl(characterUrl); + loadedCharacters.push(...characters); + } + } + + if (loadedCharacters.length === 0) { + elizaLogger.info("No characters found, using default character"); + loadedCharacters.push(defaultCharacter); + } + + return loadedCharacters; +} + +export async function handlePluginImporting(plugins: string[]) { + if (plugins.length > 0) { + elizaLogger.info("Plugins are: ", plugins); + const importedPlugins = await Promise.all( + plugins.map(async (plugin) => { + try { + const importedPlugin = await import(plugin); + const functionName = + plugin + .replace("@elizaos/plugin-", "") + .replace(/-./g, (x) => x[1].toUpperCase()) + + "Plugin"; // Assumes plugin function is camelCased with Plugin suffix + return ( + importedPlugin.default || importedPlugin[functionName] + ); + } catch (importError) { + elizaLogger.error( + `Failed to import plugin: ${plugin}`, + importError + ); + return []; // Return null for failed imports + } + }) + ); + return importedPlugins; + } else { + return []; + } +} + +export function getTokenForProvider( + provider: ModelProviderName, + character: Character +): string | undefined { + switch (provider) { + // no key needed for llama_local, ollama, lmstudio, gaianet or bedrock + case ModelProviderName.LLAMALOCAL: + return ""; + case ModelProviderName.OLLAMA: + return ""; + case ModelProviderName.LMSTUDIO: + return ""; + case ModelProviderName.GAIANET: + return ""; + case ModelProviderName.BEDROCK: + return ""; + case ModelProviderName.OPENAI: + return ( + character.settings?.secrets?.OPENAI_API_KEY || + settings.OPENAI_API_KEY + ); + case ModelProviderName.ETERNALAI: + return ( + character.settings?.secrets?.ETERNALAI_API_KEY || + settings.ETERNALAI_API_KEY + ); + case ModelProviderName.NINETEEN_AI: + return ( + character.settings?.secrets?.NINETEEN_AI_API_KEY || + settings.NINETEEN_AI_API_KEY + ); + case ModelProviderName.LLAMACLOUD: + case ModelProviderName.TOGETHER: + return ( + character.settings?.secrets?.LLAMACLOUD_API_KEY || + settings.LLAMACLOUD_API_KEY || + character.settings?.secrets?.TOGETHER_API_KEY || + settings.TOGETHER_API_KEY || + character.settings?.secrets?.OPENAI_API_KEY || + settings.OPENAI_API_KEY + ); + case ModelProviderName.CLAUDE_VERTEX: + case ModelProviderName.ANTHROPIC: + return ( + character.settings?.secrets?.ANTHROPIC_API_KEY || + character.settings?.secrets?.CLAUDE_API_KEY || + settings.ANTHROPIC_API_KEY || + settings.CLAUDE_API_KEY + ); + case ModelProviderName.REDPILL: + return ( + character.settings?.secrets?.REDPILL_API_KEY || + settings.REDPILL_API_KEY + ); + case ModelProviderName.OPENROUTER: + return ( + character.settings?.secrets?.OPENROUTER_API_KEY || + settings.OPENROUTER_API_KEY + ); + case ModelProviderName.GROK: + return ( + character.settings?.secrets?.GROK_API_KEY || + settings.GROK_API_KEY + ); + case ModelProviderName.HEURIST: + return ( + character.settings?.secrets?.HEURIST_API_KEY || + settings.HEURIST_API_KEY + ); + case ModelProviderName.GROQ: + return ( + character.settings?.secrets?.GROQ_API_KEY || + settings.GROQ_API_KEY + ); + case ModelProviderName.GALADRIEL: + return ( + character.settings?.secrets?.GALADRIEL_API_KEY || + settings.GALADRIEL_API_KEY + ); + case ModelProviderName.FAL: + return ( + character.settings?.secrets?.FAL_API_KEY || settings.FAL_API_KEY + ); + case ModelProviderName.ALI_BAILIAN: + return ( + character.settings?.secrets?.ALI_BAILIAN_API_KEY || + settings.ALI_BAILIAN_API_KEY + ); + case ModelProviderName.VOLENGINE: + return ( + character.settings?.secrets?.VOLENGINE_API_KEY || + settings.VOLENGINE_API_KEY + ); + case ModelProviderName.NANOGPT: + return ( + character.settings?.secrets?.NANOGPT_API_KEY || + settings.NANOGPT_API_KEY + ); + case ModelProviderName.HYPERBOLIC: + return ( + character.settings?.secrets?.HYPERBOLIC_API_KEY || + settings.HYPERBOLIC_API_KEY + ); + + case ModelProviderName.VENICE: + return ( + character.settings?.secrets?.VENICE_API_KEY || + settings.VENICE_API_KEY + ); + case ModelProviderName.ATOMA: + return ( + character.settings?.secrets?.ATOMASDK_BEARER_AUTH || + settings.ATOMASDK_BEARER_AUTH + ); + case ModelProviderName.NVIDIA: + return ( + character.settings?.secrets?.NVIDIA_API_KEY || + settings.NVIDIA_API_KEY + ); + case ModelProviderName.AKASH_CHAT_API: + return ( + character.settings?.secrets?.AKASH_CHAT_API_KEY || + settings.AKASH_CHAT_API_KEY + ); + case ModelProviderName.GOOGLE: + return ( + character.settings?.secrets?.GOOGLE_GENERATIVE_AI_API_KEY || + settings.GOOGLE_GENERATIVE_AI_API_KEY + ); + case ModelProviderName.MISTRAL: + return ( + character.settings?.secrets?.MISTRAL_API_KEY || + settings.MISTRAL_API_KEY + ); + case ModelProviderName.LETZAI: + return ( + character.settings?.secrets?.LETZAI_API_KEY || + settings.LETZAI_API_KEY + ); + case ModelProviderName.INFERA: + return ( + character.settings?.secrets?.INFERA_API_KEY || + settings.INFERA_API_KEY + ); + case ModelProviderName.DEEPSEEK: + return ( + character.settings?.secrets?.DEEPSEEK_API_KEY || + settings.DEEPSEEK_API_KEY + ); + case ModelProviderName.LIVEPEER: + return ( + character.settings?.secrets?.LIVEPEER_GATEWAY_URL || + settings.LIVEPEER_GATEWAY_URL + ); + default: + const errorMessage = `Failed to get token - unsupported model provider: ${provider}`; + elizaLogger.error(errorMessage); + throw new Error(errorMessage); + } +} + +function initializeDatabase(dataDir: string) { + if (process.env.MONGODB_CONNECTION_STRING) { + elizaLogger.log("Initializing database on MongoDB Atlas"); + const client = new MongoClient(process.env.MONGODB_CONNECTION_STRING, { + maxPoolSize: 100, + minPoolSize: 5, + maxIdleTimeMS: 60000, + connectTimeoutMS: 10000, + serverSelectionTimeoutMS: 5000, + socketTimeoutMS: 45000, + compressors: ["zlib"], + retryWrites: true, + retryReads: true, + }); + + const dbName = process.env.MONGODB_DATABASE || "elizaAgent"; + const db = new MongoDBDatabaseAdapter(client, dbName); + + // Test the connection + db.init() + .then(() => { + elizaLogger.success("Successfully connected to MongoDB Atlas"); + }) + .catch((error) => { + elizaLogger.error("Failed to connect to MongoDB Atlas:", error); + throw error; // Re-throw to handle it in the calling code + }); + + return db; + } else if (process.env.SUPABASE_URL && process.env.SUPABASE_ANON_KEY) { + elizaLogger.info("Initializing Supabase connection..."); + const db = new SupabaseDatabaseAdapter( + process.env.SUPABASE_URL, + process.env.SUPABASE_ANON_KEY + ); + + // Test the connection + db.init() + .then(() => { + elizaLogger.success( + "Successfully connected to Supabase database" + ); + }) + .catch((error) => { + elizaLogger.error("Failed to connect to Supabase:", error); + }); + + return db; + } else if (process.env.POSTGRES_URL) { + elizaLogger.info("Initializing PostgreSQL connection..."); + const db = new PostgresDatabaseAdapter({ + connectionString: process.env.POSTGRES_URL, + parseInputs: true, + }); + + // Test the connection + db.init() + .then(() => { + elizaLogger.success( + "Successfully connected to PostgreSQL database" + ); + }) + .catch((error) => { + elizaLogger.error("Failed to connect to PostgreSQL:", error); + }); + + return db; + } else if (process.env.PGLITE_DATA_DIR) { + elizaLogger.info("Initializing PgLite adapter..."); + // `dataDir: memory://` for in memory pg + const db = new PGLiteDatabaseAdapter({ + dataDir: process.env.PGLITE_DATA_DIR, + }); + return db; + } else if ( + process.env.QDRANT_URL && + process.env.QDRANT_KEY && + process.env.QDRANT_PORT && + process.env.QDRANT_VECTOR_SIZE + ) { + elizaLogger.info("Initializing Qdrant adapter..."); + const db = new QdrantDatabaseAdapter( + process.env.QDRANT_URL, + process.env.QDRANT_KEY, + Number(process.env.QDRANT_PORT), + Number(process.env.QDRANT_VECTOR_SIZE) + ); + return db; + } else { + const filePath = + process.env.SQLITE_FILE ?? path.resolve(dataDir, "db.sqlite"); + elizaLogger.info(`Initializing SQLite database at ${filePath}...`); + const db = new SqliteDatabaseAdapter(new Database(filePath)); + + // Test the connection + db.init() + .then(() => { + elizaLogger.success( + "Successfully connected to SQLite database" + ); + }) + .catch((error) => { + elizaLogger.error("Failed to connect to SQLite:", error); + }); + + return db; + } +} + +// also adds plugins from character file into the runtime +export async function initializeClients( + character: Character, + runtime: IAgentRuntime +) { + // each client can only register once + // and if we want two we can explicitly support it + const clients: Record = {}; + const clientTypes: string[] = + character.clients?.map((str) => str.toLowerCase()) || []; + elizaLogger.log("initializeClients", clientTypes, "for", character.name); + + // Start Auto Client if "auto" detected as a configured client + if (clientTypes.includes(Clients.AUTO)) { + const autoClient = await AutoClientInterface.start(runtime); + if (autoClient) clients.auto = autoClient; + } + + if (clientTypes.includes(Clients.XMTP)) { + const xmtpClient = await XmtpClientInterface.start(runtime); + if (xmtpClient) clients.xmtp = xmtpClient; + } + + if (clientTypes.includes(Clients.DISCORD)) { + const discordClient = await DiscordClientInterface.start(runtime); + if (discordClient) clients.discord = discordClient; + } + + if (clientTypes.includes(Clients.TELEGRAM)) { + const telegramClient = await TelegramClientInterface.start(runtime); + if (telegramClient) clients.telegram = telegramClient; + } + + if (clientTypes.includes(Clients.TELEGRAM_ACCOUNT)) { + const telegramAccountClient = + await TelegramAccountClientInterface.start(runtime); + if (telegramAccountClient) + clients.telegram_account = telegramAccountClient; + } + + if (clientTypes.includes(Clients.TWITTER)) { + const twitterClient = await TwitterClientInterface.start(runtime); + if (twitterClient) { + clients.twitter = twitterClient; + } + } + + if (clientTypes.includes(Clients.ALEXA)) { + const alexaClient = await AlexaClientInterface.start(runtime); + if (alexaClient) { + clients.alexa = alexaClient; + } + } + + if (clientTypes.includes(Clients.INSTAGRAM)) { + const instagramClient = await InstagramClientInterface.start(runtime); + if (instagramClient) { + clients.instagram = instagramClient; + } + } + + if (clientTypes.includes(Clients.FARCASTER)) { + const farcasterClient = await FarcasterClientInterface.start(runtime); + if (farcasterClient) { + clients.farcaster = farcasterClient; + } + } + + if (clientTypes.includes("lens")) { + const lensClient = new LensAgentClient(runtime); + lensClient.start(); + clients.lens = lensClient; + } + + if (clientTypes.includes(Clients.SIMSAI)) { + const simsaiClient = await JeeterClientInterface.start(runtime); + if (simsaiClient) clients.simsai = simsaiClient; + } + + elizaLogger.log("client keys", Object.keys(clients)); + + if (clientTypes.includes("deva")) { + if (clientTypes.includes("deva")) { + const devaClient = await DevaClientInterface.start(runtime); + if (devaClient) clients.deva = devaClient; + } + } + + if (clientTypes.includes("slack")) { + const slackClient = await SlackClientInterface.start(runtime); + if (slackClient) clients.slack = slackClient; // Use object property instead of push + } + + function determineClientType(client: Client): string { + // Check if client has a direct type identifier + if ("type" in client) { + return (client as any).type; + } + + // Check constructor name + const constructorName = client.constructor?.name; + if (constructorName && !constructorName.includes("Object")) { + return constructorName.toLowerCase().replace("client", ""); + } + + // Fallback: Generate a unique identifier + return `client_${Date.now()}`; + } + + if (character.plugins?.length > 0) { + for (const plugin of character.plugins) { + if (plugin.clients) { + for (const client of plugin.clients) { + const startedClient = await client.start(runtime); + const clientType = determineClientType(client); + elizaLogger.debug( + `Initializing client of type: ${clientType}` + ); + clients[clientType] = startedClient; + } + } + } + } + + return clients; +} + +function getSecret(character: Character, secret: string) { + return character.settings?.secrets?.[secret] || process.env[secret]; +} + +let nodePlugin: any | undefined; + +export async function createAgent( + character: Character, + db: IDatabaseAdapter, + cache: ICacheManager, + token: string +): Promise { + elizaLogger.log(`Creating runtime for character ${character.name}`); + + nodePlugin ??= createNodePlugin(); + + const teeMode = getSecret(character, "TEE_MODE") || "OFF"; + const walletSecretSalt = getSecret(character, "WALLET_SECRET_SALT"); + + // Validate TEE configuration + if (teeMode !== TEEMode.OFF && !walletSecretSalt) { + elizaLogger.error( + "A WALLET_SECRET_SALT required when TEE_MODE is enabled" + ); + throw new Error("Invalid TEE configuration"); + } + + // Initialize Opacity adapter if environment variables are present + let verifiableInferenceAdapter; + if ( + process.env.OPACITY_TEAM_ID && + process.env.OPACITY_CLOUDFLARE_NAME && + process.env.OPACITY_PROVER_URL && + process.env.VERIFIABLE_INFERENCE_ENABLED === "true" + ) { + verifiableInferenceAdapter = new OpacityAdapter({ + teamId: process.env.OPACITY_TEAM_ID, + teamName: process.env.OPACITY_CLOUDFLARE_NAME, + opacityProverUrl: process.env.OPACITY_PROVER_URL, + modelProvider: character.modelProvider, + token: token, + }); + elizaLogger.log("Verifiable inference adapter initialized"); + elizaLogger.log("teamId", process.env.OPACITY_TEAM_ID); + elizaLogger.log("teamName", process.env.OPACITY_CLOUDFLARE_NAME); + elizaLogger.log("opacityProverUrl", process.env.OPACITY_PROVER_URL); + elizaLogger.log("modelProvider", character.modelProvider); + elizaLogger.log("token", token); + } + if ( + process.env.PRIMUS_APP_ID && + process.env.PRIMUS_APP_SECRET && + process.env.VERIFIABLE_INFERENCE_ENABLED === "true" + ) { + verifiableInferenceAdapter = new PrimusAdapter({ + appId: process.env.PRIMUS_APP_ID, + appSecret: process.env.PRIMUS_APP_SECRET, + attMode: "proxytls", + modelProvider: character.modelProvider, + token, + }); + elizaLogger.log("Verifiable inference primus adapter initialized"); + } + + return new AgentRuntime({ + databaseAdapter: db, + token, + modelProvider: character.modelProvider, + evaluators: [], + character, + // character.plugins are handled when clients are added + plugins: [ + bootstrapPlugin, + nodePlugin, + getSecret(character, "FAL_API_KEY") || + getSecret(character, "OPENAI_API_KEY") || + getSecret(character, "VENICE_API_KEY") || + getSecret(character, "NVIDIA_API_KEY") || + getSecret(character, "NINETEEN_AI_API_KEY") || + getSecret(character, "HEURIST_API_KEY") || + getSecret(character, "LIVEPEER_GATEWAY_URL") + ? imageGenerationPlugin + : null, + getSecret(character, "FAL_API_KEY") ? ThreeDGenerationPlugin : null, + ...(teeMode !== TEEMode.OFF && walletSecretSalt ? [teePlugin] : []), + teeMode !== TEEMode.OFF && + walletSecretSalt && + getSecret(character, "VLOG") + ? verifiableLogPlugin + : null, + getSecret(character, "SGX") ? sgxPlugin : null, + getSecret(character, "ENABLE_TEE_LOG") && + ((teeMode !== TEEMode.OFF && walletSecretSalt) || + getSecret(character, "SGX")) + ? teeLogPlugin + : null, + getSecret(character, "TEE_MARLIN") ? teeMarlinPlugin : null, + ] + .flat() + .filter(Boolean), + providers: [], + managers: [], + cacheManager: cache, + fetch: logFetch, + verifiableInferenceAdapter, + }); +} + +function initializeFsCache(baseDir: string, character: Character) { + if (!character?.id) { + throw new Error( + "initializeFsCache requires id to be set in character definition" + ); + } + const cacheDir = path.resolve(baseDir, character.id, "cache"); + + const cache = new CacheManager(new FsCacheAdapter(cacheDir)); + return cache; +} + +function initializeDbCache(character: Character, db: IDatabaseCacheAdapter) { + if (!character?.id) { + throw new Error( + "initializeFsCache requires id to be set in character definition" + ); + } + const cache = new CacheManager(new DbCacheAdapter(db, character.id)); + return cache; +} + +function initializeCache( + cacheStore: string, + character: Character, + baseDir?: string, + db?: IDatabaseCacheAdapter +) { + switch (cacheStore) { + case CacheStore.REDIS: + if (process.env.REDIS_URL) { + elizaLogger.info("Connecting to Redis..."); + const redisClient = new RedisClient(process.env.REDIS_URL); + if (!character?.id) { + throw new Error( + "CacheStore.REDIS requires id to be set in character definition" + ); + } + return new CacheManager( + new DbCacheAdapter(redisClient, character.id) // Using DbCacheAdapter since RedisClient also implements IDatabaseCacheAdapter + ); + } else { + throw new Error("REDIS_URL environment variable is not set."); + } + + case CacheStore.DATABASE: + if (db) { + elizaLogger.info("Using Database Cache..."); + return initializeDbCache(character, db); + } else { + throw new Error( + "Database adapter is not provided for CacheStore.Database." + ); + } + + case CacheStore.FILESYSTEM: + elizaLogger.info("Using File System Cache..."); + if (!baseDir) { + throw new Error( + "baseDir must be provided for CacheStore.FILESYSTEM." + ); + } + return initializeFsCache(baseDir, character); + + default: + throw new Error( + `Invalid cache store: ${cacheStore} or required configuration missing.` + ); + } +} + +export async function startAgent( + character: Character, + directClient: DirectClient +): Promise { + let db: IDatabaseAdapter & IDatabaseCacheAdapter; + try { + character.id ??= stringToUuid(character.name); + character.username ??= character.name; + + const token = getTokenForProvider(character.modelProvider, character); + const dataDir = path.join(__dirname, "../data"); + + if (!fs.existsSync(dataDir)) { + fs.mkdirSync(dataDir, { recursive: true }); + } + + db = initializeDatabase(dataDir) as IDatabaseAdapter & + IDatabaseCacheAdapter; + + await db.init(); + + const cache = initializeCache( + process.env.CACHE_STORE ?? CacheStore.DATABASE, + character, + "", + db + ); // "" should be replaced with dir for file system caching. THOUGHTS: might probably make this into an env + const runtime: AgentRuntime = await createAgent( + character, + db, + cache, + token + ); + + // start services/plugins/process knowledge + await runtime.initialize(); + + // start assigned clients + runtime.clients = await initializeClients(character, runtime); + + // add to container + directClient.registerAgent(runtime); + + // report to console + elizaLogger.debug(`Started ${character.name} as ${runtime.agentId}`); + + return runtime; + } catch (error) { + elizaLogger.error( + `Error starting agent for character ${character.name}:`, + error + ); + elizaLogger.error(error); + if (db) { + await db.close(); + } + throw error; + } +} + +export const hasValidRemoteUrls = () => + process.env.REMOTE_CHARACTER_URLS && + process.env.REMOTE_CHARACTER_URLS !== "" && + process.env.REMOTE_CHARACTER_URLS.startsWith("http"); diff --git a/clone-agent/eliza-on-flow/agent/tsconfig.json b/clone-agent/eliza-on-flow/agent/tsconfig.json new file mode 100644 index 00000000..f9d2feaf --- /dev/null +++ b/clone-agent/eliza-on-flow/agent/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../packages/core/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": ".", + "module": "ESNext", + "moduleResolution": "Bundler", + "types": [ + "node", + "jest" + ] + }, + "ts-node": { + "experimentalSpecifierResolution": "node", + "transpileOnly": true, + "esm": true + }, + "include": [ + "src" + ] +} diff --git a/clone-agent/eliza-on-flow/biome.json b/clone-agent/eliza-on-flow/biome.json new file mode 120000 index 00000000..647990c3 --- /dev/null +++ b/clone-agent/eliza-on-flow/biome.json @@ -0,0 +1 @@ +deps/eliza/biome.json \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/cadence/README.md b/clone-agent/eliza-on-flow/cadence/README.md new file mode 100644 index 00000000..b9933ed5 --- /dev/null +++ b/clone-agent/eliza-on-flow/cadence/README.md @@ -0,0 +1,6 @@ +# Contracts to support Eliza on Flow + +## AccountsPool.cdc for ChildAccount Creation and Management based on Eliza's userId + +This contract is used to create and manage child accounts for Eliza's users. +It is used by the Eliza contract to create child accounts for users and to manage the child accounts. diff --git a/clone-agent/eliza-on-flow/cadence/contracts/AccountsPool.cdc b/clone-agent/eliza-on-flow/cadence/contracts/AccountsPool.cdc new file mode 100644 index 00000000..c2015e7b --- /dev/null +++ b/clone-agent/eliza-on-flow/cadence/contracts/AccountsPool.cdc @@ -0,0 +1,290 @@ +/** +> Author: Fixes Lab + +# Accounts Pool + +The Hybrid Custody Account Pool. +This contract is responsible for managing all the child accounts. + +*/ +import "EVM" +import "ViewResolver" +import "HybridCustody" + +access(all) contract AccountsPool { + + access(all) entitlement Admin + access(all) entitlement Child + + /* --- Events --- */ + /// Event emitted when a new child account is added, if tick is nil, it means the child account is not a shared account + access(all) event NewChildAccountAdded(type: String, address: Address, key: String?) + + /* --- Variable, Enums and Structs --- */ + + access(all) + let StoragePath: StoragePath + access(all) + let PublicPath: PublicPath + + /// The public interface can be accessed by anyone + /// + access(all) resource interface PoolPublic { + /// ---- Getters ---- + + /// Returns the addresses of the FRC20 with the given type + access(all) + view fun getAddresses(type: String): {String: Address} + /// Get Address + access(all) + view fun getAddress(type: String, _ key: String): Address? + /// Get Children Amount + access(all) + view fun getChildrenAmount(type: String): UInt64 + + /// ----- Access account methods ----- + /// Borrow child's AuthAccount + access(Child) + view fun borrowChildAccount(type: String, _ key: String?): auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account? + } + + /// The admin interface can only be accessed by the the account manager's owner + /// + access(all) resource interface PoolAdmin { + /// Sets up a new child account + access(Admin) + fun setupNewChildByKey( + type: String, + key: String, + _ acctCap: Capability, + ) + } + + access(all) resource Pool: PoolPublic, PoolAdmin { + access(self) + let hcManagerCap: Capability + // AccountType -> Key -> Address + access(self) + let addressMapping: {String: {String: Address}} + + init( + _ hcManagerCap: Capability + ) { + self.hcManagerCap = hcManagerCap + self.addressMapping = {} + } + + /** ---- Public Methods ---- */ + + /// Returns the addresses of the FRC20 with the given type + access(all) + view fun getAddresses(type: String): {String: Address} { + if let tickDict = self.addressMapping[type] { + return tickDict + } + return {} + } + + /// Get Address + /// + access(all) + view fun getAddress(type: String, _ key: String): Address? { + if let dict = self.borrowDict(type) { + return dict[key] + } + return nil + } + + /// Get Children Amount + access(all) + view fun getChildrenAmount(type: String): UInt64 { + if let dict = self.borrowDict(type) { + return UInt64(dict.keys.length) + } + return 0 + } + + /// ----- Access account methods ----- + /// Borrow child's AuthAccount + /// + access(Child) + view fun borrowChildAccount(type: String, _ key: String?): auth(Storage, Contracts, Keys, Inbox, Capabilities) &Account? { + let hcManagerRef = self.hcManagerCap.borrow() + ?? panic("Failed to borrow hcManager") + + let specifiedKey = key ?? "" + if let dict = self.borrowDict(type) { + if let childAddr = dict[specifiedKey] { + if let ownedChild = hcManagerRef.borrowOwnedAccount(addr: childAddr) { + return ownedChild.borrowAccount() + } + } + } + return nil + } + + /** ---- Admin Methods ---- */ + + /// Sets up a new child account + /// + access(Admin) + fun setupNewChildByKey( + type: String, + key: String, + _ childAcctCap: Capability, + ) { + pre { + childAcctCap.check(): "Child account capability is invalid" + } + self._ensureDictExists(type) + + let dict = self.borrowDict(type) ?? panic("Failed to borrow tick ") + // no need to setup if already exists + if dict[key] != nil { + return + } + + // record new child account address + dict[key] = childAcctCap.address + + // setup new child account + self._setupChildAccount(childAcctCap) + + // emit event + emit NewChildAccountAdded( + type: type, + address: childAcctCap.address, + key: key, + ) + } + + /** ---- Internal Methods ---- */ + + /// Sets up a new child account + /// + access(self) + fun _setupChildAccount( + _ childAcctCap: Capability, + ) { + + let hcManager = self.hcManagerCap.borrow() ?? panic("Failed to borrow hcManager") + let hcManagerAddr = self.hcManagerCap.address + + // >>> [0] Get child AuthAccount + var child = childAcctCap.borrow() + ?? panic("Failed to borrow child account") + + // >>> [1] Child: createOwnedAccount + if child.storage.borrow<&AnyResource>(from: HybridCustody.OwnedAccountStoragePath) == nil { + let ownedAccount <- HybridCustody.createOwnedAccount(acct: childAcctCap) + child.storage.save(<-ownedAccount, to: HybridCustody.OwnedAccountStoragePath) + } + + // ensure owned account exists + let childRef = child.storage + .borrow(from: HybridCustody.OwnedAccountStoragePath) + ?? panic("owned account not found") + + // check that paths are all configured properly + // public path + let _unpub1 = child.capabilities.unpublish(HybridCustody.OwnedAccountPublicPath) + child.capabilities.publish( + child.capabilities.storage.issue<&HybridCustody.OwnedAccount>(HybridCustody.OwnedAccountStoragePath), + at: HybridCustody.OwnedAccountPublicPath + ) + + let publishIdentifier = HybridCustody.getOwnerIdentifier(hcManagerAddr) + // give ownership to manager + childRef.giveOwnership(to: hcManagerAddr) + + // only childRef will be available after 'giveaway', so we need to re-borrow it + child = childRef.borrowAccount() + + // unpublish the priv capability + let _unpub2 = child.inbox.unpublish< + auth(HybridCustody.Owner) &{HybridCustody.OwnedAccountPrivate, HybridCustody.OwnedAccountPublic, ViewResolver.Resolver} + >(publishIdentifier) + + // >> [2] manager: add owned child account + + // Link a Capability for the new owner, retrieve & publish + let ownedPrivCap = child.capabilities.storage + .issue(HybridCustody.OwnedAccountStoragePath) + assert(ownedPrivCap.check(), message: "Failed to get owned account capability") + + // add owned account to manager + hcManager.addOwnedAccount(cap: ownedPrivCap) + + // >> [3] Child: Ensure the child account is initialized with COA + + let storagePath = StoragePath(identifier: "evm")! + let publicPath = PublicPath(identifier: "evm")! + if child.storage.borrow<&AnyResource>(from: storagePath) == nil { + let coa <- EVM.createCadenceOwnedAccount() + + // Save the COA to the new account + child.storage.save<@EVM.CadenceOwnedAccount>(<-coa, to: storagePath) + let addressableCap = child.capabilities.storage.issue<&EVM.CadenceOwnedAccount>(storagePath) + let _unpub3 = child.capabilities.unpublish(publicPath) + child.capabilities.publish(addressableCap, at: publicPath) + } + } + + /// Borrow dictioinary + /// + access(self) + view fun borrowDict(_ type: String): auth(Mutate) &{String: Address}? { + return &self.addressMapping[type] + } + + /// ensure type dict exists + /// + access(self) + fun _ensureDictExists(_ type: String) { + if self.addressMapping[type] == nil { + self.addressMapping[type] = {} + } + } + } + + /* --- Public Methods --- */ + + /// Returns the public account manager interface + /// + access(all) + view fun borrowAccountsPool( + _ from: Address + ): &Pool? { + return getAccount(from) + .capabilities.get<&Pool>(self.PublicPath) + .borrow() + } + + /// Creates a new Pool resource + /// + access(all) + fun createAccountsPool( + _ cap: Capability + ): @Pool { + return <- create Pool(cap) + } + + access(all) + fun isAddressOwnedBy( + _ mainAddr: Address, + checkAddress: Address + ): Bool { + if let childOwnedAcct = getAccount(checkAddress) + .capabilities.get<&HybridCustody.OwnedAccount>(HybridCustody.OwnedAccountPublicPath) + .borrow() { + return childOwnedAcct.isChildOf(mainAddr) + } + return false + } + + init() { + let identifier = "AccountsPool_".concat(self.account.address.toString()) + self.StoragePath = StoragePath(identifier: identifier)! + self.PublicPath = PublicPath(identifier: identifier)! + } +} diff --git a/clone-agent/eliza-on-flow/cadence/transacations/keys/add-more-keys.cdc b/clone-agent/eliza-on-flow/cadence/transacations/keys/add-more-keys.cdc new file mode 100644 index 00000000..ff330559 --- /dev/null +++ b/clone-agent/eliza-on-flow/cadence/transacations/keys/add-more-keys.cdc @@ -0,0 +1,14 @@ +transaction( + amount: Int +) { + prepare(service: auth(Keys) &Account) { + let keys = service.keys + let firstKey = keys.get(keyIndex: 0) ?? panic("No Key 0") + + var i: Int = 0 + while i < amount { + keys.add(publicKey: firstKey.publicKey, hashAlgorithm: firstKey.hashAlgorithm, weight: 1000.0) + i = i + 1 + } + } +} diff --git a/clone-agent/eliza-on-flow/cadence/transacations/keys/revoke-key.cdc b/clone-agent/eliza-on-flow/cadence/transacations/keys/revoke-key.cdc new file mode 100644 index 00000000..3e38269d --- /dev/null +++ b/clone-agent/eliza-on-flow/cadence/transacations/keys/revoke-key.cdc @@ -0,0 +1,8 @@ +transaction( + index: Int +) { + prepare(signer: auth(Keys) &Account) { + // revoke a key from an auth account. + signer.keys.revoke(keyIndex: index) + } +} diff --git a/clone-agent/eliza-on-flow/client b/clone-agent/eliza-on-flow/client new file mode 120000 index 00000000..fdccd38d --- /dev/null +++ b/clone-agent/eliza-on-flow/client @@ -0,0 +1 @@ +deps/eliza/client \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/codecov.yml b/clone-agent/eliza-on-flow/codecov.yml new file mode 120000 index 00000000..ca1ea730 --- /dev/null +++ b/clone-agent/eliza-on-flow/codecov.yml @@ -0,0 +1 @@ +deps/eliza/codecov.yml \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/commitlint.config.js b/clone-agent/eliza-on-flow/commitlint.config.js new file mode 120000 index 00000000..cef233c1 --- /dev/null +++ b/clone-agent/eliza-on-flow/commitlint.config.js @@ -0,0 +1 @@ +deps/eliza/commitlint.config.js \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/deps/eliza/.devcontainer/Dockerfile b/clone-agent/eliza-on-flow/deps/eliza/.devcontainer/Dockerfile new file mode 100644 index 00000000..e5deb93b --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.devcontainer/Dockerfile @@ -0,0 +1,24 @@ +ARG NODE_VER=23.5.0 +ARG BASE_IMAGE=node:${NODE_VER} +FROM $BASE_IMAGE + +ENV DEBIAN_FRONTEND=noninteractive + +# Install pnpm globally and install necessary build tools +RUN apt-get update \ + && apt-get install -y \ + git \ + python3 \ + make \ + g++ \ + nano \ + vim \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ARG PNPM_VER=9.15.2 +RUN npm install -g pnpm@${PNPM_VER} + +# Set Python 3 as the default python +RUN ln -s /usr/bin/python3 /usr/bin/python +ENV DEBIAN_FRONTEND=dialog diff --git a/clone-agent/eliza-on-flow/deps/eliza/.devcontainer/devcontainer.json b/clone-agent/eliza-on-flow/deps/eliza/.devcontainer/devcontainer.json new file mode 100644 index 00000000..23aca531 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.devcontainer/devcontainer.json @@ -0,0 +1,38 @@ +// See https://aka.ms/vscode-remote/devcontainer.json for format details. +{ + "name": "elizaos-dev", + "dockerFile": "Dockerfile", + "build": { + "args": { + "NODE_VER": "23.5.0", + "PNPM_VER": "9.15.2" + } + }, + "privileged": true, + "runArgs": [ + "-p=3000:3000", // Add port for server api + "-p=5173:5173", // Add port for client + //"--volume=/usr/lib/wsl:/usr/lib/wsl", // uncomment for WSL + //"--volume=/mnt/wslg:/mnt/wslg", // uncomment for WSL + "--gpus=all", // ! uncomment for vGPU + //"--device=/dev/dxg", // uncomment this for vGPU under WSL + "--device=/dev/dri" + ], + "containerEnv": { + //"MESA_D3D12_DEFAULT_ADAPTER_NAME": "NVIDIA", // uncomment for WSL + //"LD_LIBRARY_PATH": "/usr/lib/wsl/lib" // uncomment for WSL + }, + "customizations": { + "vscode": { + "extensions": [ + "vscode.json-language-features", + "vscode.css-language-features", + // "foxundermoon.shell-format", + // "dbaeumer.vscode-eslint", + // "esbenp.prettier-vscode" + "ms-python.python" + ] + } + }, + "features": {} +} \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/deps/eliza/.dockerignore b/clone-agent/eliza-on-flow/deps/eliza/.dockerignore new file mode 100644 index 00000000..e234e951 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.dockerignore @@ -0,0 +1,19 @@ +# Ignore node_modules from the build context +node_modules + +# Ignore logs and temporary files +*.log +*.tmp +.DS_Store + +# Ignore Git files and metadata +.gitignore + +# Ignore IDE and editor config files +.vscode +.idea +*.swp + +# Ignore build artifacts from the host +dist +build \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/deps/eliza/.editorconfig b/clone-agent/eliza-on-flow/deps/eliza/.editorconfig new file mode 100644 index 00000000..779f99a1 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/clone-agent/eliza-on-flow/deps/eliza/.env.example b/clone-agent/eliza-on-flow/deps/eliza/.env.example new file mode 100644 index 00000000..200d21bd --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.env.example @@ -0,0 +1,970 @@ +#################################### +#### Server & DB Configurations #### +#################################### + +# Cache Configs +CACHE_STORE=database # Defaults to database. Other available cache store: redis and filesystem +REDIS_URL= # Redis URL - could be a local redis instance or cloud hosted redis. Also support rediss:// URLs +PGLITE_DATA_DIR= #../pgLite/ if selecting a directory --- or memory:// if selecting in memory + +# Eliza Port Config +SERVER_PORT=3000 + +# Supabase Configuration +SUPABASE_URL= +SUPABASE_ANON_KEY= + +# MongoDB +MONGODB_CONNECTION_STRING= #mongodb connection string +MONGODB_DATABASE= #name of the database in mongoDB atlas #default: 'elizaAgent' + +# Comma separated list of remote character urls (optional) +REMOTE_CHARACTER_URLS= + +# Stores characters set by using the direct API in the data/character folder for further load when the app restarts +USE_CHARACTER_STORAGE=false + +# Logging +DEFAULT_LOG_LEVEL=info +LOG_JSON_FORMAT=false # Print everything in logger as json; false by default + +############################### +#### Client Configurations #### +############################### + +# BitMind Bittensor API +BITMIND=true +BITMIND_API_TOKEN= + +# Discord Configuration +DISCORD_APPLICATION_ID= +DISCORD_API_TOKEN= # Bot token +DISCORD_VOICE_CHANNEL_ID= # The ID of the voice channel the bot should join (optional) + +# Devin Configuration +DEVIN_API_TOKEN= # Get your API key from docs.devin.ai/tutorials/api-integration + +# Gelato Configuration +GELATO_RELAY_API_KEY= # Gelato API key + +# Farcaster Neynar Configuration +FARCASTER_FID= # The FID associated with the account your are sending casts from +FARCASTER_NEYNAR_API_KEY= # Neynar API key: https://neynar.com/ +FARCASTER_NEYNAR_SIGNER_UUID= # Signer for the account you are sending casts from. Create a signer here: https://dev.neynar.com/app +FARCASTER_DRY_RUN=false # Set to true if you want to run the bot without actually publishing casts +FARCASTER_POLL_INTERVAL=120 # How often (in seconds) the bot should check for farcaster interactions (replies and mentions) + +# Telegram Configuration +TELEGRAM_BOT_TOKEN= + +# Telegram account client Configuration +TELEGRAM_ACCOUNT_PHONE= # Account phone number for authorization +TELEGRAM_ACCOUNT_APP_ID= # Telegram app api_id (get it at me.telegram.org) +TELEGRAM_ACCOUNT_APP_HASH= # Telegram app api_hash (get it at me.telegram.org) +TELEGRAM_ACCOUNT_DEVICE_MODEL= # Device model. Example: Samsung Galaxy S28+ +TELEGRAM_ACCOUNT_SYSTEM_VERSION= # Device system version. Example: Android 12 S? (31) + +# Twitter/X Configuration +TWITTER_DRY_RUN=false +TWITTER_USERNAME= # Account username +TWITTER_PASSWORD= # Account password +TWITTER_EMAIL= # Account email +TWITTER_2FA_SECRET= + +# Authentication cookies for Twitter session (this is for login using cookies and is optional) +TWITTER_COOKIES_AUTH_TOKEN= +TWITTER_COOKIES_CT0= +TWITTER_COOKIES_GUEST_ID= + +TWITTER_POLL_INTERVAL=120 # How often (in seconds) the bot should check for interactions +TWITTER_SEARCH_ENABLE=FALSE # Enable timeline search, WARNING this greatly increases your chance of getting banned +TWITTER_TARGET_USERS= # Comma separated list of Twitter user names to interact with +TWITTER_RETRY_LIMIT= # Maximum retry attempts for Twitter login +TWITTER_SPACES_ENABLE=false # Enable or disable Twitter Spaces logic +ENABLE_TWITTER_POST_GENERATION=true # Set to true to enable automatic tweet generation. If false, the bot will not generate or post tweets. +# Post Interval Settings (in minutes) +POST_INTERVAL_MIN= # Default: 90 +POST_INTERVAL_MAX= # Default: 180 +POST_IMMEDIATELY= # Default: false +# Twitter action processing configuration +ACTION_INTERVAL= # Interval in minutes between action processing runs (default: 5 minutes) +ENABLE_ACTION_PROCESSING=false # Set to true to enable the action processing loop +MAX_ACTIONS_PROCESSING=1 # Maximum number of actions (e.g., retweets, likes) to process in a single cycle. Helps prevent excessive or uncontrolled actions. +ACTION_TIMELINE_TYPE=foryou # Type of timeline to interact with. Options: "foryou" or "following". Default: "foryou" +# CONFIGURATION FOR APPROVING TWEETS BEFORE IT GETS POSTED +TWITTER_APPROVAL_DISCORD_CHANNEL_ID= # Channel ID for the Discord bot to listen and send approval messages +TWITTER_APPROVAL_DISCORD_BOT_TOKEN= # Discord bot token (this could be a different bot token from DISCORD_API_TOKEN) +TWITTER_APPROVAL_ENABLED= # Enable or disable Twitter approval logic #Default is false +TWITTER_APPROVAL_CHECK_INTERVAL=60000 # Default: 60 seconds + +# WhatsApp Cloud API Configuration +WHATSAPP_ACCESS_TOKEN= # Permanent access token from Facebook Developer Console +WHATSAPP_PHONE_NUMBER_ID= # Phone number ID from WhatsApp Business API +WHATSAPP_BUSINESS_ACCOUNT_ID= # Business Account ID from Facebook Business Manager +WHATSAPP_WEBHOOK_VERIFY_TOKEN= # Custom string for webhook verification +WHATSAPP_API_VERSION=v17.0 # WhatsApp API version (default: v17.0) + +# Alexa Client Configuration +ALEXA_SKILL_ID= # Your Alexa skill ID from developer console (format: amzn1.ask.skill-...) +ALEXA_CLIENT_ID= # OAuth2 Client ID from Alexa developer console permissions tab +ALEXA_CLIENT_SECRET= # OAuth2 Client Secret from Alexa developer console permissions tab + + +# Simsai Specific Configuration +SIMSAI_API_KEY= # API key for SimsAI authentication +SIMSAI_AGENT_ID= # Unique identifier for the SimsAI agent +SIMSAI_USERNAME= # Username for SimsAI platform access +SIMSAI_DRY_RUN= # Set to true to test without making actual API calls + +# Direct Client Setting +EXPRESS_MAX_PAYLOAD= # Default: 100kb + +####################################### +#### Model Provider Configurations #### +####################################### + +# OpenAI Configuration +OPENAI_API_KEY= # OpenAI API key, starting with sk- +OPENAI_API_URL= # OpenAI API Endpoint (optional), Default: https://api.openai.com/v1 +SMALL_OPENAI_MODEL= # Default: gpt-4o-mini +MEDIUM_OPENAI_MODEL= # Default: gpt-4o +LARGE_OPENAI_MODEL= # Default: gpt-4o +EMBEDDING_OPENAI_MODEL= # Default: text-embedding-3-small +IMAGE_OPENAI_MODEL= # Default: dall-e-3 +USE_OPENAI_EMBEDDING= # Set to TRUE for OpenAI/1536, leave blank for local + +# Community Plugin for OpenAI Configuration +ENABLE_OPEN_AI_COMMUNITY_PLUGIN=false +OPENAI_DEFAULT_MODEL= +OPENAI_MAX_TOKENS= +OPENAI_TEMPERATURE= + + + + +# Atoma SDK Configuration +ATOMASDK_BEARER_AUTH= # Atoma SDK Bearer Auth token +ATOMA_API_URL= # Default: https://api.atoma.network/v1 +SMALL_ATOMA_MODEL= # Default: meta-llama/Llama-3.3-70B-Instruct +MEDIUM_ATOMA_MODEL= # Default: meta-llama/Llama-3.3-70B-Instruct +LARGE_ATOMA_MODEL= # Default: meta-llama/Llama-3.3-70B-Instruct + +# Eternal AI's Decentralized Inference API +ETERNALAI_URL= +ETERNALAI_MODEL= # Default: "NousResearch/Hermes-3-Llama-3.1-70B-FP8" +ETERNALAI_CHAIN_ID=8453 # Default: "8453" +ETERNALAI_RPC_URL= # Ex: https://mainnet.base.org/ +ETERNALAI_AGENT_CONTRACT_ADDRESS= # Ex: 0xAed016e060e2fFE3092916b1650Fc558D62e1CCC +ETERNALAI_AGENT_ID= # Ex: 1711 +ETERNALAI_API_KEY= +ETERNALAI_LOG=false #Default: false + +# Hyperbolic Provider Configuration +HYPERBOLIC_API_KEY= # Hyperbolic API Key +HYPERBOLIC_MODEL= + +IMAGE_HYPERBOLIC_MODEL= # Default: FLUX.1-dev +SMALL_HYPERBOLIC_MODEL= # Default: meta-llama/Llama-3.2-3B-Instruct +MEDIUM_HYPERBOLIC_MODEL= # Default: meta-llama/Meta-Llama-3.1-70B-Instruct +LARGE_HYPERBOLIC_MODEL= # Default: meta-llama/Meta-Llama-3.1-405-Instruct + + +# Hyperbolic Plugin Configuration +HYPERBOLIC_ENV=production +HYPERBOLIC_API_KEY= +HYPERBOLIC_GRANULAR_LOG=true +HYPERBOLIC_SPASH=true +HYPERBOLIC_LOG_LEVEL=debug + +# Infera Configuration +INFERA_API_KEY= # visit api.infera.org/docs to obtain an API key under /signup_user +INFERA_MODEL= # Default: llama3.2:latest +INFERA_SERVER_URL= # Default: https://api.infera.org/ +SMALL_INFERA_MODEL= #Recommended: llama3.2:latest +MEDIUM_INFERA_MODEL= #Recommended: mistral-nemo:latest +LARGE_INFERA_MODEL= #Recommended: mistral-small:latest + +# Venice Configuration +VENICE_API_KEY= # generate from venice settings +SMALL_VENICE_MODEL= # Default: llama-3.3-70b +MEDIUM_VENICE_MODEL= # Default: llama-3.3-70b +LARGE_VENICE_MODEL= # Default: llama-3.1-405b +IMAGE_VENICE_MODEL= # Default: fluently-xl + +# Nineteen.ai Configuration +NINETEEN_AI_API_KEY= # Get a free api key from https://nineteen.ai/app/api +SMALL_NINETEEN_AI_MODEL= # Default: unsloth/Llama-3.2-3B-Instruct +MEDIUM_NINETEEN_AI_MODEL= # Default: unsloth/Meta-Llama-3.1-8B-Instruct +LARGE_NINETEEN_AI_MODEL= # Default: hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4 +IMAGE_NINETEEN_AI_MODE= # Default: dataautogpt3/ProteusV0.4-Lightning + +# Akash Chat API Configuration docs: https://chatapi.akash.network/documentation +AKASH_CHAT_API_KEY= # Get from https://chatapi.akash.network/ +SMALL_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-2-3B-Instruct +MEDIUM_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-3-70B-Instruct +LARGE_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-1-405B-Instruct-FP8 + +# Livepeer configuration + +LIVEPEER_GATEWAY_URL=https://dream-gateway.livepeer.cloud # Free inference gateways and docs: https://livepeer-eliza.com/ +IMAGE_LIVEPEER_MODEL= # Default: ByteDance/SDXL-Lightning +SMALL_LIVEPEER_MODEL= # Default: meta-llama/Meta-Llama-3.1-8B-Instruct +MEDIUM_LIVEPEER_MODEL= # Default: meta-llama/Meta-Llama-3.1-8B-Instruct +LARGE_LIVEPEER_MODEL= # Default: meta-llama/Meta-Llama-3.1-8B-Instruct + +# Speech Synthesis +ELEVENLABS_XI_API_KEY= # API key from elevenlabs + +# Transcription Provider +TRANSCRIPTION_PROVIDER= # Default: local (possible values: openai, deepgram, local) + +# ElevenLabs Settings +ELEVENLABS_MODEL_ID=eleven_multilingual_v2 +ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM +ELEVENLABS_VOICE_STABILITY=0.5 +ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 +ELEVENLABS_VOICE_STYLE=0.66 +ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false +ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 +ELEVENLABS_OUTPUT_FORMAT=pcm_16000 + +# OpenRouter Configuration +OPENROUTER_API_KEY= # OpenRouter API Key +OPENROUTER_MODEL= # Default: uses hermes 70b/405b +SMALL_OPENROUTER_MODEL= +MEDIUM_OPENROUTER_MODEL= +LARGE_OPENROUTER_MODEL= + +# REDPILL Configuration (https://docs.red-pill.ai/get-started/supported-models) +REDPILL_API_KEY= # REDPILL API Key +REDPILL_MODEL= +SMALL_REDPILL_MODEL= # Default: gpt-4o-mini +MEDIUM_REDPILL_MODEL= # Default: gpt-4o +LARGE_REDPILL_MODEL= # Default: gpt-4o + +# Grok Configuration +GROK_API_KEY= # GROK/xAI API Key +SMALL_GROK_MODEL= # Default: grok-2-1212 +MEDIUM_GROK_MODEL= # Default: grok-2-1212 +LARGE_GROK_MODEL= # Default: grok-2-1212 +EMBEDDING_GROK_MODEL= # Default: grok-2-1212 + +# Ollama Configuration +OLLAMA_SERVER_URL= # Default: localhost:11434 +OLLAMA_MODEL= +USE_OLLAMA_EMBEDDING= # Set to TRUE for OLLAMA/1024, leave blank for local +OLLAMA_EMBEDDING_MODEL= # Default: mxbai-embed-large +SMALL_OLLAMA_MODEL= # Default: llama3.2 +MEDIUM_OLLAMA_MODEL= # Default: hermes3 +LARGE_OLLAMA_MODEL= # Default: hermes3:70b + +# Google Configuration +GOOGLE_MODEL= +SMALL_GOOGLE_MODEL= # Default: gemini-1.5-flash-latest +MEDIUM_GOOGLE_MODEL= # Default: gemini-1.5-flash-latest +LARGE_GOOGLE_MODEL= # Default: gemini-1.5-pro-latest +EMBEDDING_GOOGLE_MODEL= # Default: text-embedding-004 + +# Mistral Configuration +MISTRAL_MODEL= +SMALL_MISTRAL_MODEL= # Default: mistral-small-latest +MEDIUM_MISTRAL_MODEL= # Default: mistral-large-latest +LARGE_MISTRAL_MODEL= # Default: mistral-large-latest + +# Groq Configuration +GROQ_API_KEY= # Starts with gsk_ +SMALL_GROQ_MODEL= # Default: llama-3.1-8b-instant +MEDIUM_GROQ_MODEL= # Default: llama-3.3-70b-versatile +LARGE_GROQ_MODEL= # Default: llama-3.2-90b-vision-preview +EMBEDDING_GROQ_MODEL= # Default: llama-3.1-8b-instant + +# LlamaLocal Configuration +LLAMALOCAL_PATH= # Default: "" which is the current directory in plugin-node/dist/ which gets destroyed and recreated on every build + +# NanoGPT Configuration +SMALL_NANOGPT_MODEL= # Default: gpt-4o-mini +MEDIUM_NANOGPT_MODEL= # Default: gpt-4o +LARGE_NANOGPT_MODEL= # Default: gpt-4o + +# Anthropic Configuration +ANTHROPIC_API_KEY= # For Claude +SMALL_ANTHROPIC_MODEL= # Default: claude-3-haiku-20240307 +MEDIUM_ANTHROPIC_MODEL= # Default: claude-3-5-sonnet-20241022 +LARGE_ANTHROPIC_MODEL= # Default: claude-3-5-sonnet-20241022 + +# Heurist Configuration +HEURIST_API_KEY= # Get from https://heurist.ai/dev-access +SMALL_HEURIST_MODEL= # Default: meta-llama/llama-3-70b-instruct +MEDIUM_HEURIST_MODEL= # Default: meta-llama/llama-3-70b-instruct +LARGE_HEURIST_MODEL= # Default: meta-llama/llama-3.3-70b-instruct +HEURIST_IMAGE_MODEL= # Default: FLUX.1-dev +HEURIST_EMBEDDING_MODEL= # Default: BAAI/bge-large-en-v1.5 +USE_HEURIST_EMBEDDING= # Set to TRUE for HEURIST embedding, leave blank for local + +# Gaianet Configuration +GAIANET_MODEL= +GAIANET_SERVER_URL= +SMALL_GAIANET_MODEL= # Default: llama3b +SMALL_GAIANET_SERVER_URL= # Default: https://llama3b.gaia.domains/v1 +MEDIUM_GAIANET_MODEL= # Default: llama +MEDIUM_GAIANET_SERVER_URL= # Default: https://llama8b.gaia.domains/v1 +LARGE_GAIANET_MODEL= # Default: qwen72b +LARGE_GAIANET_SERVER_URL= # Default: https://qwen72b.gaia.domains/v1 +GAIANET_EMBEDDING_MODEL= +USE_GAIANET_EMBEDDING= # Set to TRUE for GAIANET/768, leave blank for local + +# Volcengine Configuration +VOLENGINE_API_URL= # Volcengine API Endpoint, Default: https://open.volcengineapi.com/api/v3/ +VOLENGINE_MODEL= +SMALL_VOLENGINE_MODEL= # Default: doubao-lite-128k +MEDIUM_VOLENGINE_MODEL= # Default: doubao-pro-128k +LARGE_VOLENGINE_MODEL= # Default: doubao-pro-256k +VOLENGINE_EMBEDDING_MODEL= # Default: doubao-embedding + +# DeepSeek Configuration +DEEPSEEK_API_KEY= #Your DeepSeek API key +DEEPSEEK_API_URL= # Default: https://api.deepseek.com +SMALL_DEEPSEEK_MODEL= # Default: deepseek-chat +MEDIUM_DEEPSEEK_MODEL= # Default: deepseek-chat +LARGE_DEEPSEEK_MODEL= # Default: deepseek-chat + +# fal.ai Configuration +FAL_API_KEY= +FAL_AI_LORA_PATH= + +# LetzAI Configuration +LETZAI_API_KEY= # LetzAI API Key +LETZAI_MODELS= # list of Letzai models to add to each prompt, e.g.: "@modelname1, @modelname2" + +# Galadriel Configuration +GALADRIEL_API_KEY=gal-* # Get from https://dashboard.galadriel.com/ +SMALL_GALADRIEL_MODEL= # Default: gpt-4o-mini +MEDIUM_GALADRIEL_MODEL= # Default: gpt-4o +LARGE_GALADRIEL_MODEL= # Default: gpt-4o +GALADRIEL_FINE_TUNE_API_KEY= # Use an OpenAI key to use a fine-tuned model with the verified inference endpoint + +# LM Studio Configuration +LMSTUDIO_SERVER_URL= # Default: http://localhost:1234/v1 +LMSTUDIO_MODEL= +SMALL_LMSTUDIO_MODEL= # Default: hermes-3-llama-3.1-8b +MEDIUM_LMSTUDIO_MODEL= # Default: hermes-3-llama-3.1-8b +LARGE_LMSTUDIO_MODEL= # Default: hermes-3-llama-3.1-8b + +# Remaining Provider Configurations +GOOGLE_GENERATIVE_AI_API_KEY= # Gemini API key +ALI_BAILIAN_API_KEY= # Ali Bailian API Key +NANOGPT_API_KEY= # NanoGPT API Key +TOGETHER_API_KEY= # Together API Key + +###################################### +#### Crypto Plugin Configurations #### +###################################### + +# CoinMarketCap / CMC +COINMARKETCAP_API_KEY= + +# Zerion +ZERION_API_KEY= + +# CoinGecko +COINGECKO_API_KEY= +COINGECKO_PRO_API_KEY= + +# Moralis +MORALIS_API_KEY= + +# EVM +EVM_PRIVATE_KEY= +EVM_PROVIDER_URL= + +# Zilliqa +ZILLIQA_PRIVATE_KEY= +ZILLIQA_PROVIDER_URL= + +# Avalanche +AVALANCHE_PRIVATE_KEY= +AVALANCHE_PUBLIC_KEY= + +# Arthera +ARTHERA_PRIVATE_KEY= + +# Solana +SOLANA_PRIVATE_KEY= +SOLANA_PUBLIC_KEY= +SOLANA_CLUSTER= # Default: devnet. Solana Cluster: 'devnet' | 'testnet' | 'mainnet-beta' +SOLANA_ADMIN_PRIVATE_KEY= # This wallet is used to verify NFTs +SOLANA_ADMIN_PUBLIC_KEY= # This wallet is used to verify NFTs +SOLANA_VERIFY_TOKEN= # Authentication token for calling the verification API + +# Injective +INJECTIVE_PRIVATE_KEY= # +INJECTIVE_PUBLIC_KEY= # +INJECTIVE_NETWORK= # +# Fallback Wallet Configuration (deprecated) +WALLET_PRIVATE_KEY= +WALLET_PUBLIC_KEY= + +BIRDEYE_API_KEY= + +# Solana Configuration +SOL_ADDRESS=So11111111111111111111111111111111111111112 +SLIPPAGE=1 +BASE_MINT=So11111111111111111111111111111111111111112 +SOLANA_RPC_URL=https://api.mainnet-beta.solana.com +HELIUS_API_KEY= + +# Abstract Configuration +ABSTRACT_ADDRESS= +ABSTRACT_PRIVATE_KEY= +ABSTRACT_RPC_URL=https://api.testnet.abs.xyz + +# Starknet Configuration +STARKNET_ADDRESS= +STARKNET_PRIVATE_KEY= +STARKNET_RPC_URL= + +# Lens Network Configuration +LENS_ADDRESS= +LENS_PRIVATE_KEY= + +# Form Chain +FORM_PRIVATE_KEY= # Form character account private key +FORM_TESTNET=true # A flag indicating if connection is made to Form Testnet. Set to false for Mainnet connection. + +# Coinbase +COINBASE_COMMERCE_KEY= # From Coinbase developer portal +COINBASE_API_KEY= # From Coinbase developer portal +COINBASE_PRIVATE_KEY= # From Coinbase developer portal +COINBASE_GENERATED_WALLET_ID= # Not your address but the wallet ID from generating a wallet through the plugin +COINBASE_GENERATED_WALLET_HEX_SEED= # Not your address but the wallet hex seed from generating a wallet through the plugin and calling export +COINBASE_NOTIFICATION_URI= # For webhook plugin the uri you want to send the webhook to for dummy ones use https://webhook.site + +# Coinbase AgentKit +CDP_API_KEY_NAME= +CDP_API_KEY_PRIVATE_KEY= +CDP_AGENT_KIT_NETWORK=base-sepolia # Optional: Defaults to base-sepolia + +# Coinbase Charity Configuration +IS_CHARITABLE=false # Set to true to enable charity donations +CHARITY_ADDRESS_BASE=0x1234567890123456789012345678901234567890 +CHARITY_ADDRESS_SOL=pWvDXKu6CpbKKvKQkZvDA66hgsTB6X2AgFxksYogHLV +CHARITY_ADDRESS_ETH=0x750EF1D7a0b4Ab1c97B7A623D7917CcEb5ea779C +CHARITY_ADDRESS_ARB=0x1234567890123456789012345678901234567890 +CHARITY_ADDRESS_POL=0x1234567890123456789012345678901234567890 + +# thirdweb +THIRDWEB_SECRET_KEY= # Create key on thirdweb developer dashboard: https://thirdweb.com/ + +# Conflux Configuration +CONFLUX_CORE_PRIVATE_KEY= +CONFLUX_CORE_SPACE_RPC_URL= +CONFLUX_ESPACE_PRIVATE_KEY= +CONFLUX_ESPACE_RPC_URL= +CONFLUX_MEME_CONTRACT_ADDRESS= + +# Mind Network Configuration +MIND_HOT_WALLET_PRIVATE_KEY= +MIND_COLD_WALLET_ADDRESS= + +# ZeroG +ZEROG_INDEXER_RPC= +ZEROG_EVM_RPC= +ZEROG_PRIVATE_KEY= +ZEROG_FLOW_ADDRESS= + +# IQ6900 +# Load json recorded on-chain through IQ +# Inscribe your json character file here: https://elizacodein.com/ + +IQ_WALLET_ADDRESS= # If you enter the wallet address used on the site, the most recently inscribed json will be loaded. +IQSOlRPC= + +# Squid Router +SQUID_SDK_URL=https://apiplus.squidrouter.com # Default: https://apiplus.squidrouter.com +SQUID_INTEGRATOR_ID= # get integrator id through https://docs.squidrouter.com/ +SQUID_EVM_ADDRESS= +SQUID_EVM_PRIVATE_KEY= +SQUID_API_THROTTLE_INTERVAL=1000 # Default: 1000; Used to throttle API calls to avoid rate limiting (in ms) + +# TEE Configuration +# TEE_MODE options: +# - LOCAL: Uses simulator at localhost:8090 (for local development) +# - DOCKER: Uses simulator at host.docker.internal:8090 (for docker development) +# - PRODUCTION: No simulator, uses production endpoints +# Defaults to OFF if not specified +TEE_MODE=OFF # LOCAL | DOCKER | PRODUCTION +WALLET_SECRET_SALT= # ONLY define if you want to use TEE Plugin, otherwise it will throw errors +TEE_LOG_DB_PATH= # Custom path for TEE Log database, default: ./data/tee_log.sqlite + +# TEE Verifiable Log Configuration +VLOG= # true/false; if you want to use TEE Verifiable Log, set this to "true" + +# Galadriel Configuration +GALADRIEL_API_KEY=gal-* # Get from https://dashboard.galadriel.com/ + + +# Akash Chat API Configuration docs: https://chatapi.akash.network/documentation +AKASH_CHAT_API_KEY= # Get from https://chatapi.akash.network/ +SMALL_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-2-3B-Instruct +MEDIUM_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-3-70B-Instruct +LARGE_AKASH_CHAT_API_MODEL= # Default: Meta-Llama-3-1-405B-Instruct-FP8 + +# fal.ai Configuration +FAL_API_KEY= +FAL_AI_LORA_PATH= + +# Web search API Configuration +TAVILY_API_KEY= + +# WhatsApp Cloud API Configuration +WHATSAPP_ACCESS_TOKEN= # Permanent access token from Facebook Developer Console +WHATSAPP_PHONE_NUMBER_ID= # Phone number ID from WhatsApp Business API +WHATSAPP_BUSINESS_ACCOUNT_ID= # Business Account ID from Facebook Business Manager +WHATSAPP_WEBHOOK_VERIFY_TOKEN= # Custom string for webhook verification +WHATSAPP_API_VERSION=v17.0 # WhatsApp API version (default: v17.0) +ENABLE_TEE_LOG=false # Set to true to enable TEE logging, only available when running eliza in TEE + +# Flow Blockchain Configuration +FLOW_ADDRESS= +FLOW_PRIVATE_KEY= # Private key for SHA3-256 + P256 ECDSA +FLOW_NETWORK= # Default: mainnet +FLOW_ENDPOINT_URL= # Default: https://mainnet.onflow.org + +# ICP +INTERNET_COMPUTER_PRIVATE_KEY= +INTERNET_COMPUTER_ADDRESS= + +#Cloudflare AI Gateway +CLOUDFLARE_GW_ENABLED= # Set to true to enable Cloudflare AI Gateway +CLOUDFLARE_AI_ACCOUNT_ID= # Cloudflare AI Account ID - found in the Cloudflare Dashboard under AI Gateway +CLOUDFLARE_AI_GATEWAY_ID= # Cloudflare AI Gateway ID - found in the Cloudflare Dashboard under AI Gateway + +# Aptos +APTOS_PRIVATE_KEY= # Aptos private key +APTOS_NETWORK= # Must be one of mainnet, testnet + +# MultiversX +MVX_PRIVATE_KEY= # Multiversx private key +MVX_NETWORK= # must be one of mainnet, devnet, testnet +ACCESS_TOKEN_MANAGEMENT_TO=everyone # you can put an userid to limit token managament to one user only (use same id as in the database) + +# NEAR +NEAR_WALLET_SECRET_KEY= # NEAR Wallet Secret Key +NEAR_WALLET_PUBLIC_KEY= # NEAR Wallet Public Key +NEAR_ADDRESS= +NEAR_SLIPPAGE=1 +NEAR_RPC_URL=https://rpc.testnet.near.org +NEAR_NETWORK=testnet # or mainnet + +# ZKsync Era Configuration +ZKSYNC_ADDRESS= +ZKSYNC_PRIVATE_KEY= + +# HoldStation Wallet Configuration +HOLDSTATION_PRIVATE_KEY= + +# Avail DA Configuration +AVAIL_ADDRESS= +AVAIL_SEED= +AVAIL_APP_ID=0 +AVAIL_RPC_URL=wss://avail-turing.public.blastapi.io/ # (Default) Testnet: wss://avail-turing.public.blastapi.io/ | Mainnet: wss://avail-mainnet.public.blastapi.io/ + +# Marlin +TEE_MARLIN= # Set "yes" to enable the plugin +TEE_MARLIN_ATTESTATION_ENDPOINT= # Optional, default "http://127.0.0.1:1350" + +# Ton +TON_PRIVATE_KEY= # Ton Mnemonic Seed Phrase Join With Empty String +TON_RPC_URL= # ton rpc +TON_RPC_API_KEY= # ton rpc api key +TON_NFT_IMAGES_FOLDER= # Path to the folder containing the NFT images +TON_NFT_METADATA_FOLDER= # Path to the folder containing the NFT metadata +PINATA_API_KEY= # Pinata API key +PINATA_API_SECRET= # Pinata API secret + +# Sui +SUI_PRIVATE_KEY= # Sui Mnemonic Seed Phrase (`sui keytool generate ed25519`) , Also support `suiprivatekeyxxxx` (sui keytool export --key-identity 0x63) +SUI_NETWORK= # must be one of mainnet, testnet, devnet, localnet + +# Mina Settings +MINA_PRIVATE_KEY= # Mina Mnemonic Seed Phrase: https://docs.minaprotocol.com/using-mina/install-a-wallet +MINA_NETWORK=devnet # must be one of mainnet, testnet, devnet, localnet + +# Story +STORY_PRIVATE_KEY= # Story private key +STORY_API_BASE_URL= # Story API base URL +STORY_API_KEY= # Story API key +PINATA_JWT= # Pinata JWT for uploading files to IPFS + +# Cosmos +COSMOS_RECOVERY_PHRASE= # 12 words recovery phrase (need to be in quotes, because of spaces) +COSMOS_AVAILABLE_CHAINS= # mantrachaintestnet2,cosmos # Array of chains +# Cronos zkEVM +CRONOSZKEVM_ADDRESS= +CRONOSZKEVM_PRIVATE_KEY= + + +# Fuel Ecosystem (FuelVM) +FUEL_WALLET_PRIVATE_KEY= + +# Tokenizer Settings +TOKENIZER_MODEL= # Specify the tokenizer model to be used. +TOKENIZER_TYPE= # Options: tiktoken (for OpenAI models) or auto (AutoTokenizer from Hugging Face for non-OpenAI models). Default: tiktoken. + +# Spheron +SPHERON_PRIVATE_KEY= +SPHERON_PROVIDER_PROXY_URL= +SPHERON_WALLET_ADDRESS= + +# Stargaze NFT marketplace from Cosmos (You can use https://graphql.mainnet.stargaze-apis.com/graphql) +STARGAZE_ENDPOINT= + +# GenLayer +GENLAYER_PRIVATE_KEY= # Private key of the GenLayer account to use for the agent in this format (0x0000000000000000000000000000000000000000000000000000000000000000) + +# BNB chain +BNB_PRIVATE_KEY= # BNB chain private key +BNB_PUBLIC_KEY= # BNB-smart-chain public key (address) +BSC_PROVIDER_URL= # BNB-smart-chain rpc url +OPBNB_PROVIDER_URL= # OPBNB rpc url + +#################################### +#### Misc Plugin Configurations #### +#################################### + +# Intiface Configuration +INTIFACE_WEBSOCKET_URL=ws://localhost:12345 + +# API key for giphy from https://developers.giphy.com/dashboard/ +GIPHY_API_KEY= + +# OpenWeather +OPEN_WEATHER_API_KEY= # OpenWeather API key + +#GITCOIN Passport +PASSPORT_API_KEY= #Gitcoin Passport key +PASSPORT_SCORER= #Scorer number + +# EchoChambers Configuration +ECHOCHAMBERS_API_URL=http://127.0.0.1:3333 +ECHOCHAMBERS_API_KEY=testingkey0011 +ECHOCHAMBERS_USERNAME=eliza +ECHOCHAMBERS_ROOMS=general #comma delimited list of rooms the agent watches +ECHOCHAMBERS_POLL_INTERVAL=60 +ECHOCHAMBERS_MAX_MESSAGES=10 +# How often the agent checks if it should start a conversation +ECHOCHAMBERS_CONVERSATION_STARTER_INTERVAL=300 # 5 minutes - checks rooms every 5 minutes + +# How long a room must be quiet before starting a new conversation +ECHOCHAMBERS_QUIET_PERIOD=900 # 15 minutes - waits for 15 minutes of silence + +# Allora +ALLORA_API_KEY= # Allora API key, format: UP-f8db7d6558ab432ca0d92716 +ALLORA_CHAIN_SLUG= # must be one of mainnet, testnet. If not specified, it will use testnet by default + + +# B2 Network +B2_PRIVATE_KEY= # Private key of the B2 Network account to use for the agent + +# Opacity zkTLS +OPACITY_TEAM_ID=f309ac8ae8a9a14a7e62cd1a521b1c5f +OPACITY_CLOUDFLARE_NAME=eigen-test +OPACITY_PROVER_URL=https://opacity-ai-zktls-demo.vercel.app + +# AWS Credentials for S3 File Upload and Amazon Bedrock +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_REGION= +AWS_S3_BUCKET= +AWS_S3_UPLOAD_PATH= +AWS_S3_ENDPOINT= +AWS_S3_SSL_ENABLED= +AWS_S3_FORCE_PATH_STYLE= + + +# Deva Configuration +DEVA_API_KEY= # You can get the API key from the created application in deva.me/settings/apps +DEVA_API_BASE_URL=https://api.deva.me # Default server url for production. Use https://api-staging.deva.me for staging. + +# Deepgram +DEEPGRAM_API_KEY= + +# Verifiable Inference Configuration +VERIFIABLE_INFERENCE_ENABLED=false # Set to false to disable verifiable inference +VERIFIABLE_INFERENCE_PROVIDER=opacity # Options: opacity + +# Qdrant +# URL of your Qdrant instance (e.g., https://your-instance.qdrant.tech) +QDRANT_URL= +# API key for authentication (optional for local instances) +QDRANT_KEY= +# Qdrant service port (default: 443 for cloud, typically 6333 for local) +QDRANT_PORT=443 +# Vector size matching your embedding model (default: 1536 for OpenAI embeddings) +QDRANT_VECTOR_SIZE=1536 + +# Autonome Configuration +AUTONOME_JWT_TOKEN= +AUTONOME_RPC=https://wizard-bff-rpc.alt.technology/v1/bff/aaa/apps + +#################################### +#### Akash Network Configuration #### +#################################### +AKASH_ENV=mainnet +AKASH_NET=https://raw.githubusercontent.com/ovrclk/net/master/mainnet +RPC_ENDPOINT=https://rpc.akashnet.net:443 +AKASH_GAS_PRICES=0.025uakt +AKASH_GAS_ADJUSTMENT=1.5 +AKASH_KEYRING_BACKEND=os +AKASH_FROM=default +AKASH_FEES=20000uakt +AKASH_DEPOSIT=500000uakt +AKASH_MNEMONIC= +AKASH_WALLET_ADDRESS= +# Akash Pricing API +AKASH_PRICING_API_URL=https://console-api.akash.network/v1/pricing +# Default values # 1 CPU = 1000 1GB = 1000000000 1GB = 1000000000 +AKASH_DEFAULT_CPU=1000 +AKASH_DEFAULT_MEMORY=1000000000 +AKASH_DEFAULT_STORAGE=1000000000 +AKASH_SDL=example.sdl.yml +# Close deployment +# Close all deployments = closeAll +# Close a single deployment = dseq and add the value in AKASH_CLOSE_DSEQ +AKASH_CLOSE_DEP=closeAll +AKASH_CLOSE_DSEQ=19729929 +# Provider Info we added one to check you will have to pass this into the action +AKASH_PROVIDER_INFO=akash1ccktptfkvdc67msasmesuy5m7gpc76z75kukpz +# Deployment Status +# AKASH_DEP_STATUS = dseq or param_passed when you are building you wil pass the dseq dinamically to test you +# you can pass the dseq using AKASH_DEP_DSEQ 19729929 is an example of a dseq we test while build. +AKASH_DEP_STATUS=dseq +AKASH_DEP_DSEQ=19729929 +# Gas Estimation Options: close, create, or update +# qseq is required when operation is "close" 19729929 is an example of a dseq we test while build. +AKASH_GAS_OPERATION=close +AKASH_GAS_DSEQ=19729929 +# Manifest +# Values: "auto" | "manual" | "validate_only" Default: "auto" +AKASH_MANIFEST_MODE=auto +# Default: Will use the SDL directory +AKASH_MANIFEST_PATH= +# Values: "strict" | "lenient" | "none" - Default: "strict" +AKASH_MANIFEST_VALIDATION_LEVEL=strict +# Quai Network Ecosystem +QUAI_PRIVATE_KEY= +QUAI_RPC_URL=https://rpc.quai.network + +# Chainbase +# demo is a free tier key +CHAINBASE_API_KEY= # demo is a free tier key + +# 0x +ZERO_EX_API_KEY= +ALCHEMY_HTTP_TRANSPORT_URL= + +# Instagram Configuration +INSTAGRAM_DRY_RUN=false +INSTAGRAM_USERNAME= # Account username +INSTAGRAM_PASSWORD= # Account password +INSTAGRAM_APP_ID= # Instagram App ID is required +INSTAGRAM_APP_SECRET= # Instagram App Secret is required +INSTAGRAM_BUSINESS_ACCOUNT_ID= # Optional Business Account ID for additional features +INSTAGRAM_POST_INTERVAL_MIN=60 # Default: 60 minutes +INSTAGRAM_POST_INTERVAL_MAX=120 # Default: 120 minutes +INSTAGRAM_ENABLE_ACTION_PROCESSING=false # Enable/disable action processing +INSTAGRAM_ACTION_INTERVAL=5 # Interval between actions in minutes +INSTAGRAM_MAX_ACTIONS=1 # Maximum number of actions to process at once + +#################################### +#### Pyth Plugin Configuration #### +#################################### +# Network Environment (mainnet or testnet)git +PYTH_NETWORK_ENV=mainnet + +# Mainnet Network Configuration +PYTH_MAINNET_HERMES_URL=https://hermes.pyth.network +PYTH_MAINNET_WSS_URL=wss://hermes.pyth.network/ws +PYTH_MAINNET_PYTHNET_URL=https://pythnet.rpcpool.com +PYTH_MAINNET_CONTRACT_REGISTRY=https://pyth.network/developers/price-feed-ids +PYTH_MAINNET_PROGRAM_KEY= + +# Testnet Network Configuration +PYTH_TESTNET_HERMES_URL=https://hermes.pyth.network +PYTH_TESTNET_WSS_URL=wss://hermes.pyth.network/ws +PYTH_TESTNET_PYTHNET_URL=https://pythnet.rpcpool.com +PYTH_TESTNET_CONTRACT_REGISTRY=https://pyth.network/developers/price-feed-ids#testnet +PYTH_TESTNET_PROGRAM_KEY= + +# Connection Settings +PYTH_MAX_RETRIES=3 +PYTH_RETRY_DELAY=1000 +PYTH_TIMEOUT=5000 +PYTH_GRANULAR_LOG=true +PYTH_LOG_LEVEL=debug +PYTH_LOG_LEVEL=info + +# Runtime Settings +RUNTIME_CHECK_MODE=false + +# Pyth Price Streaming and test ID +PYTH_ENABLE_PRICE_STREAMING=true +PYTH_MAX_PRICE_STREAMS=2 +PYTH_TEST_ID01=0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43 +PYTH_TEST_ID02=0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace + +# Router Nitro EVM Configuration +ROUTER_NITRO_EVM_ADDRESS= +ROUTER_NITRO_EVM_PRIVATE_KEY= + +# OriginTrail DKG +DKG_ENVIRONMENT="" +# Values: "development", "testnet", "mainnet" +DKG_HOSTNAME="" +DKG_PORT="8900" +DKG_PUBLIC_KEY="" +DKG_PRIVATE_KEY="" +DKG_BLOCKCHAIN_NAME="" +# Values: (mainnet) "base:8453", "gnosis:100", "otp:2043" (testnet) "base:84532", "gnosis:10200", "otp:20430" + +# Initia Plugin Configuration +INITIA_PRIVATE_KEY= # Your Initia wallet private key +INITIA_NODE_URL= # Initia node URL (default: testnet) +INITIA_CHAIN_ID=initia-test # Chain ID (default: testnet) + +# #################################### +# #### NVIDIA Configuration ########## +# #################################### +NVIDIA_NIM_ENV=production +NVIDIA_NIM_SPASH=false +# Api Keys +NVIDIA_NIM_API_KEY= +NVIDIA_NGC_API_KEY= +NVIDIA_NIM_MAX_RETRIES=3 +NVIDIA_NIM_RETRY_DELAY=1000 +NVIDIA_NIM_TIMEOUT=5000 +# Logging Configuration +NVIDIA_GRANULAR_LOG=true +NVIDIA_LOG_LEVEL=debug +# NVIDIA Off-topic system and user configuration +NVIDIA_OFFTOPIC_SYSTEM= +NVIDIA_OFFTOPIC_USER= +# NVIDIA Cosmos Model Configuration +NVIDIA_NIM_BASE_VISION_URL=https://ai.api.nvidia.com/v1/vlm +NVIDIA_COSMOS_MODEL=nvidia/cosmos-nemotron-34b +NVIDIA_COSMOS_INVOKE_URL=https://ai.api.nvidia.com/v1/vlm/nvidia/cosmos-nemotron-34b +NVIDIA_COSMOS_ASSET_URL=https://api.nvcf.nvidia.com/v2/nvcf/assets +NVIDIA_COSMOS_MAX_TOKENS=1000 + +# Email Plugin Configuration + +# Outgoing Email Settings (SMTP/Gmail) +EMAIL_OUTGOING_SERVICE=smtp # Use "smtp" or "gmail" +EMAIL_OUTGOING_HOST=smtp.example.com # Required for SMTP only +EMAIL_OUTGOING_PORT=465 # Default 465 for secure SMTP, 587 for TLS +EMAIL_OUTGOING_USER= +EMAIL_OUTGOING_PASS= # For Gmail, use App Password + +# Incoming Email Settings (IMAP) +EMAIL_INCOMING_SERVICE=imap +EMAIL_INCOMING_HOST=imap.example.com +EMAIL_INCOMING_PORT=993 # Default port for secure IMAP +EMAIL_INCOMING_USER= +EMAIL_INCOMING_PASS= + +# SEI Network Ecosystem +SEI_PRIVATE_KEY= +SEI_NETWORK= # Either "mainnet", "testnet", or "devnet" +SEI_RPC_URL= # Only set if using a different RPC URL from the default + +# Omniflix +OMNIFLIX_API_URL= # https://rest.omniflix.network +OMNIFLIX_MNEMONIC= # your mnemonic 12 words or 24 words +OMNIFLIX_RPC_ENDPOINT= # https://rpc.omniflix.network +OMNIFLIX_PRIVATE_KEY= # your private key + +# Suno AI Music Generation +SUNO_API_KEY= + +# Udio AI Music Generation +UDIO_AUTH_TOKEN= + +# Football Plugin Configuration +FOOTBALL_API_KEY= # API key from Football-Data.org (https://www.football-data.org/) + +# Imgflip +IMGFLIP_USERNAME= +IMGFLIP_PASSWORD= + +# Hyperliquid Api +HYPERLIQUID_PRIVATE_KEY= # Required for trading and cancelling orders, your_private_key +HYPERLIQUID_TESTNET= # Optional, defaults to false; true or false + +# Lit Protocol +FUNDING_PRIVATE_KEY= # Private key for funding transactions in Lit Protocol +EVM_RPC_URL= # RPC endpoint URL for blockchain interactions + +# EthStorage DA Configuration +ETHSTORAGE_PRIVATE_KEY= +ETHSTORAGE_ADDRESS=0x64003adbdf3014f7E38FC6BE752EB047b95da89A +ETHSTORAGE_RPC_URL=https://rpc.beta.testnet.l2.quarkchain.io:8545 + + +# Email Automation Plugin Configuration +RESEND_API_KEY= # Your Resend API key +DEFAULT_TO_EMAIL= # Default recipient +DEFAULT_FROM_EMAIL= # Default sender + +# Optional Settings +EMAIL_AUTOMATION_ENABLED=false # Enable AI detection. If this is enabled, the plugin will automatically detect email-worthy conversations and handle generation/delivery and only that. +EMAIL_EVALUATION_PROMPT= # Custom detection criteria for shouldEmail# #################################### + + +# #### ANKR Configuration #### +# #################################### +ANKR_ENV=production +ANKR_WALLET= +ANKR_MAX_RETRIES=3 +ANKR_RETRY_DELAY=1000 +ANKR_TIMEOUT=5000 +ANKR_GRANULAR_LOG=true +ANKR_LOG_LEVEL=debug +ANKR_RUNTIME_CHECK_MODE=false +ANKR_SPASH=true + +# DCAP Plugin Configuration +DCAP_EVM_PRIVATE_KEY= +DCAP_MODE= # Options: OFF, PLUGIN-SGX, PLUGIN-TEE, MOCK + +# QuickIntel Token Security API +QUICKINTEL_API_KEY= # Your QuickIntel API key for token security analysis + +# News API Key +NEWS_API_KEY= # News API KEY from https://newsapi.org/ + +# BTCFUN Plugin Configuration +BTCFUN_API_URL= # Default: https://api-testnet-new.btc.fun +BTC_PRIVATE_KEY_WIF= # Your BTC private key in WIF format +BTC_ADDRESS= # Your BTC address +BTC_MINT_CAP=10000 # Maximum amount that can be minted +BTC_MINT_DEADLINE=864000 # Deadline for minting in seconds +BTC_FUNDRAISING_CAP=100 # Maximum amount for fundraising + +# Trikon Plugin Configuration +TRIKON_WALLET_ADDRESS= # Your Trikon wallet address (must be a valid 64-character hex string starting with '0x') +TRIKON_INITIAL_BALANCE= # (Optional) The initial balance for the wallet. Defaults to "0" if not provided. + +#################################### +#### Arbitrage Plugin Configuration #### +#################################### + +ARBITRAGE_ETHEREUM_WS_URL= # WebSocket URL for Ethereum node connection +ARBITRAGE_EVM_PROVIDER_URL= # RPC URL for Ethereum node connection (if WS not available) +ARBITRAGE_EVM_PRIVATE_KEY= # Private key for the wallet executing arbitrage transactions +FLASHBOTS_RELAY_SIGNING_KEY= # Signing key for Flashbots relay interactions +BUNDLE_EXECUTOR_ADDRESS= # Address of the bundle executor contract + +# DESK Exchange Plugin Configration +DESK_EXCHANGE_PRIVATE_KEY= # Required for trading and cancelling orders +DESK_EXCHANGE_NETWORK= # "mainnet" or "testnet + diff --git a/clone-agent/eliza-on-flow/deps/eliza/.gitignore b/clone-agent/eliza-on-flow/deps/eliza/.gitignore new file mode 100644 index 00000000..e26ea648 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.gitignore @@ -0,0 +1,102 @@ +node_modules +/out + +.github/* + +.env +.env.production +.env.local +.env_main +concatenated-output.ts +embedding-cache.json +packages/plugin-buttplug/intiface-engine + +node-compile-cache + +.idea +.vscode +.zed +.DS_Store + +dist/ +# Allow models directory but ignore model files +models/*.gguf +pgLite/ + +cookies.json + +db.sqlite +searches/ +tweets/ + +*.gguf +*.onnx +*.wav +*.mp3 + +logs/ + +test-report.json +content_cache/ +test_data/ +tokencache/ +tweetcache/ +twitter_cookies.json +timeline_cache.json + +*.sqlite + +# Character configurations +characters/**/secrets.json +characters/**/*.env +characters/**/*.key +characters/**/private/ + +packages/core/src/providers/cache +packages/core/src/providers/cache/* +cache/* +packages/plugin-coinbase/src/plugins/transactions.csv + +tsup.config.bundled_*.mjs + +.turbo +.cursorrules +.pnpm-store +instructions.md +wallet_data.txt + +coverage +.eslintcache + +agent/content + +eliza.manifest +eliza.manifest.sgx +eliza.sig + +packages/plugin-nvidia-nim/extra +packages/plugin-nvidia-nim/old_code +packages/plugin-nvidia-nim/docs + +# Edriziai specific ignores +characters/edriziai-info/secrets.json + +# Bug Hunter logs and checkpoints +scripts/bug_hunt/logs/ +scripts/bug_hunt/logs/*.log +scripts/bug_hunt/checkpoints/ +scripts/bug_hunt/checkpoints/*.json +scripts/bug_hunt/reports/ +scripts/bug_hunt/reports/*.md + +lit-config.json + +# Configuration to exclude the extra and local_docs directories +extra +**/dist/** + +ton_nft_metadata/ +ton_nft_metadata/* + +ton_nft_images/ +ton_nft_images/* \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/deps/eliza/.gitpod.yml b/clone-agent/eliza-on-flow/deps/eliza/.gitpod.yml new file mode 100644 index 00000000..549220e9 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.gitpod.yml @@ -0,0 +1,7 @@ +tasks: + - name: "init eliza env" + init: | + nvm install v23.3.0 + git fetch --tags + git checkout $(git describe --tags --abbrev=0) + command: pnpm install && pnpm run build diff --git a/clone-agent/eliza-on-flow/deps/eliza/.npmrc b/clone-agent/eliza-on-flow/deps/eliza/.npmrc new file mode 100644 index 00000000..0f6a4a76 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.npmrc @@ -0,0 +1,2 @@ +node-linker=hoisted +frozen-lockfile=true \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/deps/eliza/.nvmrc b/clone-agent/eliza-on-flow/deps/eliza/.nvmrc new file mode 100644 index 00000000..fa12cf29 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.nvmrc @@ -0,0 +1 @@ +v23.3.0 \ No newline at end of file diff --git a/clone-agent/eliza-on-flow/deps/eliza/.prettierignore b/clone-agent/eliza-on-flow/deps/eliza/.prettierignore new file mode 100644 index 00000000..172df038 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/.prettierignore @@ -0,0 +1,9 @@ +**/*/target +**/*/dist + +# ignore lock files +**/*-lock.yaml +package-lock.json +dev-dist + +**/CHANGELOG.md diff --git a/clone-agent/eliza-on-flow/deps/eliza/CHANGELOG.md b/clone-agent/eliza-on-flow/deps/eliza/CHANGELOG.md new file mode 100644 index 00000000..8ec2756c --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/CHANGELOG.md @@ -0,0 +1,1521 @@ +# Changelog + +## [v0.1.7](https://github.com/elizaOS/eliza/tree/v0.1.7) (2025-01-04) + +[Full Changelog](https://github.com/elizaOS/eliza/compare/v0.1.7-alpha.2...v0.1.7) + +**Implemented enhancements:** + +- Implement Caching for API Responses [\#1794](https://github.com/elizaOS/eliza/issues/1794) +- Implement Caching for API Responses [\#1792](https://github.com/elizaOS/eliza/issues/1792) +- Implement Caching for API Responses [\#1791](https://github.com/elizaOS/eliza/issues/1791) +- Implement Caching for API Responses [\#1789](https://github.com/elizaOS/eliza/issues/1789) +- Feature Request: Implement Enhanced Error Logging for API Calls [\#1736](https://github.com/elizaOS/eliza/issues/1736) +- Implement feature for issue \#1725 on repository elizaOS/eliza branch develop [\#1734](https://github.com/elizaOS/eliza/issues/1734) +- Enhance API Documentation [\#1732](https://github.com/elizaOS/eliza/issues/1732) +- Implement feature for issue \#1725 [\#1731](https://github.com/elizaOS/eliza/issues/1731) +- Implement feature for issue \#1725 [\#1730](https://github.com/elizaOS/eliza/issues/1730) +- Enhance API Documentation [\#1729](https://github.com/elizaOS/eliza/issues/1729) +- Implement a Caching Mechanism for API Responses [\#1726](https://github.com/elizaOS/eliza/issues/1726) +- Implement a Structured Logging Framework [\#1724](https://github.com/elizaOS/eliza/issues/1724) +- Add support for Coinbase Commerce integration [\#1723](https://github.com/elizaOS/eliza/issues/1723) +- Serve docusaurus docs from a docker container for quick docs verification [\#1720](https://github.com/elizaOS/eliza/issues/1720) +- Use Caret \(^\) for Dependency Versions in package.json [\#1662](https://github.com/elizaOS/eliza/issues/1662) +- Deduplicate dependencies across plugins and move shared dependencies to the root package.json [\#1658](https://github.com/elizaOS/eliza/issues/1658) +- Deduplicate Dependencies Across Plugins [\#1656](https://github.com/elizaOS/eliza/issues/1656) +- Deduplicate Dependencies Across Plugins [\#1652](https://github.com/elizaOS/eliza/issues/1652) +- Deduplicate Dependencies Across Plugins [\#1650](https://github.com/elizaOS/eliza/issues/1650) +- Viem version too old to include Arthera EVM chain [\#1635](https://github.com/elizaOS/eliza/issues/1635) +- Add Spanish Translation for Documentation README \(docs/README\_es.md\) [\#1592](https://github.com/elizaOS/eliza/issues/1592) +- Expand Support for Non-OpenAI Models in Token Trimming [\#1565](https://github.com/elizaOS/eliza/issues/1565) +- spades [\#1563](https://github.com/elizaOS/eliza/issues/1563) +- Support better in-monorepo navigation with custom conditions [\#1363](https://github.com/elizaOS/eliza/issues/1363) +- Add Livepeer as an Image Generation Provider [\#1271](https://github.com/elizaOS/eliza/issues/1271) +- Arbitrum Integration [\#851](https://github.com/elizaOS/eliza/issues/851) +- Twitter Spaces Voice Client [\#301](https://github.com/elizaOS/eliza/issues/301) +- 🐛 fix plugins.md formatting for docs with dockerized docs validation [\#1722](https://github.com/elizaOS/eliza/pull/1722) ([marcellodesales](https://github.com/marcellodesales)) + +**Fixed bugs:** + +- Fix: Standardize ACTION\_INTERVAL unit to minutes in Twitter client [\#1788](https://github.com/elizaOS/eliza/issues/1788) +- pdf js crashes the agent [\#1751](https://github.com/elizaOS/eliza/issues/1751) +- Failed to run on Macbook M1 [\#1742](https://github.com/elizaOS/eliza/issues/1742) +- Issue Created: http proxy error: /e0e10e6f-ff2b-0d4c-8011-1fc1eee7cb32/message [\#1733](https://github.com/elizaOS/eliza/issues/1733) +- can't build framework - followed quick start - pnpm build error [\#1714](https://github.com/elizaOS/eliza/issues/1714) +- Google Model Not Working [\#1709](https://github.com/elizaOS/eliza/issues/1709) +- failed: @elizaos/plugin-echochambers\#build [\#1691](https://github.com/elizaOS/eliza/issues/1691) +- initial setup not working. help needed please. [\#1666](https://github.com/elizaOS/eliza/issues/1666) +- ImageDescriptionService [\#1643](https://github.com/elizaOS/eliza/issues/1643) +- Dockerfile errors when building image [\#1623](https://github.com/elizaOS/eliza/issues/1623) +- Initial setup based on docs not working [\#1622](https://github.com/elizaOS/eliza/issues/1622) +- Running Eliza with LLAMALOCAL fails after first query [\#1575](https://github.com/elizaOS/eliza/issues/1575) +- Quick start guide bug - pnpm start [\#1552](https://github.com/elizaOS/eliza/issues/1552) +- callback throws - \["⛔ TypeError: callback is not a function"\] - when action is called from the Twitter Client [\#1544](https://github.com/elizaOS/eliza/issues/1544) +- Bug: generateText is ignoring dynamic parameters due to a hard-coded model class [\#1439](https://github.com/elizaOS/eliza/issues/1439) +- fix: Slack client Media type implementation missing required properties in message attachments [\#1384](https://github.com/elizaOS/eliza/issues/1384) +- Error when trying deploy using dockerfile [\#1168](https://github.com/elizaOS/eliza/issues/1168) + +**Closed issues:** + +- Pull Request Created: Simulate discord typing while generating a response [\#1786](https://github.com/elizaOS/eliza/issues/1786) +- Fix Public Solana Wallet Not Found! [\#1781](https://github.com/elizaOS/eliza/issues/1781) +- \ + + diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/package.json b/clone-agent/eliza-on-flow/deps/eliza/client/package.json new file mode 100644 index 00000000..7cd8d43a --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/package.json @@ -0,0 +1,66 @@ +{ + "name": "client", + "private": true, + "sideEffects": false, + "type": "module", + "scripts": { + "extract-version": "bash ./version.sh", + "dev": "pnpm run extract-version && vite", + "build": "pnpm run extract-version && tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@elizaos/core": "workspace:*", + "@radix-ui/react-avatar": "^1.1.2", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-separator": "^1.1.1", + "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-tabs": "^1.1.2", + "@radix-ui/react-toast": "^1.2.4", + "@radix-ui/react-tooltip": "^1.1.6", + "@react-spring/web": "^9.7.5", + "@tanstack/react-query": "^5.63.0", + "@uidotdev/usehooks": "^2.4.1", + "class-variance-authority": "^0.7.1", + "clsx": "2.1.1", + "dayjs": "^1.11.13", + "lucide-react": "^0.469.0", + "react": "^19.0.0", + "react-aiwriter": "^1.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.1.1", + "react-router-dom": "^7.1.1", + "semver": "^7.6.3", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7", + "vite-plugin-compression": "^0.5.1" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@types/node": "^22.10.5", + "@types/react": "^19.0.3", + "@types/react-dom": "^19.0.2", + "@types/semver": "^7.5.8", + "@typescript-eslint/eslint-plugin": "^8.19.1", + "@typescript-eslint/parser": "^8.19.1", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", + "eslint": "^9.17.0", + "eslint-import-resolver-typescript": "^3.6.1", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "postcss": "^8.4.38", + "rollup-plugin-visualizer": "^5.14.0", + "tailwindcss": "^3.4.4", + "typescript": "~5.6.3", + "typescript-eslint": "^8.18.2", + "vite": "^6.0.5", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/pnpm-lock.yaml b/clone-agent/eliza-on-flow/deps/eliza/client/pnpm-lock.yaml new file mode 100644 index 00000000..0dc113d3 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/pnpm-lock.yaml @@ -0,0 +1,12140 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + "@assistant-ui/react": + specifier: ^0.7.33 + version: 0.7.33(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.17) + "@radix-ui/react-avatar": + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-collapsible": + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-dialog": + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-label": + specifier: ^2.1.1 + version: 2.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-separator": + specifier: ^1.1.1 + version: 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": + specifier: ^1.1.1 + version: 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-tabs": + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-toast": + specifier: ^1.2.4 + version: 1.2.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-tooltip": + specifier: ^1.1.6 + version: 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@remix-run/node": + specifier: ^2.15.2 + version: 2.15.2(typescript@5.6.3) + "@remix-run/react": + specifier: ^2.15.2 + version: 2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + "@remix-run/serve": + specifier: ^2.15.2 + version: 2.15.2(typescript@5.6.3) + "@tanstack/react-query": + specifier: ^5.62.15 + version: 5.62.16(react@18.3.1) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: 2.1.1 + version: 2.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + framer-motion: + specifier: ^11.16.0 + version: 11.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + isbot: + specifier: ^4.1.0 + version: 4.4.0 + lucide-react: + specifier: ^0.469.0 + version: 0.469.0(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-aiwriter: + specifier: ^1.0.0 + version: 1.0.0 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + tailwind-merge: + specifier: ^2.6.0 + version: 2.6.0 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.17) + use-sound: + specifier: ^4.0.3 + version: 4.0.3(react@18.3.1) + devDependencies: + "@eslint/js": + specifier: ^9.17.0 + version: 9.17.0 + "@remix-run/dev": + specifier: ^2.15.2 + version: 2.15.2(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.15.2(typescript@5.6.3))(@types/node@22.10.5)(typescript@5.6.3)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)) + "@types/react": + specifier: ^18.3.18 + version: 18.3.18 + "@types/react-dom": + specifier: ^18.3.5 + version: 18.3.5(@types/react@18.3.18) + "@typescript-eslint/eslint-plugin": + specifier: ^6.7.4 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/parser": + specifier: ^6.7.4 + version: 6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@vitejs/plugin-react-swc": + specifier: ^3.5.0 + version: 3.7.2(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.20(postcss@8.4.49) + eslint: + specifier: ^9.17.0 + version: 9.17.0(jiti@1.21.7) + eslint-import-resolver-typescript: + specifier: ^3.6.1 + version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.7)) + eslint-plugin-import: + specifier: ^2.28.1 + version: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: + specifier: ^6.7.1 + version: 6.10.2(eslint@9.17.0(jiti@1.21.7)) + eslint-plugin-react: + specifier: ^7.33.2 + version: 7.37.3(eslint@9.17.0(jiti@1.21.7)) + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.1.0(eslint@9.17.0(jiti@1.21.7)) + eslint-plugin-react-refresh: + specifier: ^0.4.16 + version: 0.4.16(eslint@9.17.0(jiti@1.21.7)) + globals: + specifier: ^15.14.0 + version: 15.14.0 + postcss: + specifier: ^8.4.38 + version: 8.4.49 + tailwindcss: + specifier: ^3.4.4 + version: 3.4.17 + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.18.2 + version: 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + vite: + specifier: ^6.0.5 + version: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0) + vite-tsconfig-paths: + specifier: ^4.2.1 + version: 4.3.2(typescript@5.6.3)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)) + +packages: + "@ai-sdk/provider@1.0.6": + resolution: + { + integrity: sha512-lJi5zwDosvvZER3e/pB8lj1MN3o3S7zJliQq56BRr4e9V3fcRyFtwP0JRxaRS5vHYX3OJ154VezVoQNrk0eaKw==, + } + engines: { node: ">=18" } + + "@alloc/quick-lru@5.2.0": + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: ">=10" } + + "@ampproject/remapping@2.3.0": + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: ">=6.0.0" } + + "@assistant-ui/react@0.7.33": + resolution: + { + integrity: sha512-vFE8dU8lM/BQ7oeQ00eb0JsA/AC1Xl3WpSm38zRSBRKRlcnoZQUhpT/9WurCFx6BnzKk90fxVZmPs6J+3EOQRg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^18 || ^19 || ^19.0.0-rc + react-dom: ^18 || ^19 || ^19.0.0-rc + tailwindcss: ^3.4.4 + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + tailwindcss: + optional: true + + "@babel/code-frame@7.26.2": + resolution: + { + integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.26.3": + resolution: + { + integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.26.0": + resolution: + { + integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.26.3": + resolution: + { + integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.25.9": + resolution: + { + integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.25.9": + resolution: + { + integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-create-class-features-plugin@7.25.9": + resolution: + { + integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-member-expression-to-functions@7.25.9": + resolution: + { + integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.25.9": + resolution: + { + integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.26.0": + resolution: + { + integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-optimise-call-expression@7.25.9": + resolution: + { + integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-plugin-utils@7.25.9": + resolution: + { + integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-replace-supers@7.25.9": + resolution: + { + integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-skip-transparent-expression-wrappers@7.25.9": + resolution: + { + integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.25.9": + resolution: + { + integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.25.9": + resolution: + { + integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.25.9": + resolution: + { + integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.26.0": + resolution: + { + integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.26.3": + resolution: + { + integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==, + } + engines: { node: ">=6.0.0" } + hasBin: true + + "@babel/plugin-syntax-decorators@7.25.9": + resolution: + { + integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-jsx@7.25.9": + resolution: + { + integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-typescript@7.25.9": + resolution: + { + integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-modules-commonjs@7.26.3": + resolution: + { + integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-typescript@7.26.3": + resolution: + { + integrity: sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/preset-typescript@7.26.0": + resolution: + { + integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/runtime@7.26.0": + resolution: + { + integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==, + } + engines: { node: ">=6.9.0" } + + "@babel/template@7.25.9": + resolution: + { + integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.26.4": + resolution: + { + integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.26.3": + resolution: + { + integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==, + } + engines: { node: ">=6.9.0" } + + "@emotion/hash@0.9.2": + resolution: + { + integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==, + } + + "@esbuild/aix-ppc64@0.21.5": + resolution: + { + integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + + "@esbuild/aix-ppc64@0.24.2": + resolution: + { + integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [aix] + + "@esbuild/android-arm64@0.17.6": + resolution: + { + integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm64@0.21.5": + resolution: + { + integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm64@0.24.2": + resolution: + { + integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm@0.17.6": + resolution: + { + integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + + "@esbuild/android-arm@0.21.5": + resolution: + { + integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + + "@esbuild/android-arm@0.24.2": + resolution: + { + integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [android] + + "@esbuild/android-x64@0.17.6": + resolution: + { + integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + + "@esbuild/android-x64@0.21.5": + resolution: + { + integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + + "@esbuild/android-x64@0.24.2": + resolution: + { + integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [android] + + "@esbuild/darwin-arm64@0.17.6": + resolution: + { + integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-arm64@0.21.5": + resolution: + { + integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-arm64@0.24.2": + resolution: + { + integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-x64@0.17.6": + resolution: + { + integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + + "@esbuild/darwin-x64@0.21.5": + resolution: + { + integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + + "@esbuild/darwin-x64@0.24.2": + resolution: + { + integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [darwin] + + "@esbuild/freebsd-arm64@0.17.6": + resolution: + { + integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-arm64@0.21.5": + resolution: + { + integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-arm64@0.24.2": + resolution: + { + integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.17.6": + resolution: + { + integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.21.5": + resolution: + { + integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.24.2": + resolution: + { + integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [freebsd] + + "@esbuild/linux-arm64@0.17.6": + resolution: + { + integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm64@0.21.5": + resolution: + { + integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm64@0.24.2": + resolution: + { + integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm@0.17.6": + resolution: + { + integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-arm@0.21.5": + resolution: + { + integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-arm@0.24.2": + resolution: + { + integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==, + } + engines: { node: ">=18" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-ia32@0.17.6": + resolution: + { + integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-ia32@0.21.5": + resolution: + { + integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-ia32@0.24.2": + resolution: + { + integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-loong64@0.17.6": + resolution: + { + integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-loong64@0.21.5": + resolution: + { + integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-loong64@0.24.2": + resolution: + { + integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==, + } + engines: { node: ">=18" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-mips64el@0.17.6": + resolution: + { + integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-mips64el@0.21.5": + resolution: + { + integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-mips64el@0.24.2": + resolution: + { + integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==, + } + engines: { node: ">=18" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-ppc64@0.17.6": + resolution: + { + integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-ppc64@0.21.5": + resolution: + { + integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-ppc64@0.24.2": + resolution: + { + integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==, + } + engines: { node: ">=18" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-riscv64@0.17.6": + resolution: + { + integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-riscv64@0.21.5": + resolution: + { + integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-riscv64@0.24.2": + resolution: + { + integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==, + } + engines: { node: ">=18" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-s390x@0.17.6": + resolution: + { + integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-s390x@0.21.5": + resolution: + { + integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-s390x@0.24.2": + resolution: + { + integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==, + } + engines: { node: ">=18" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-x64@0.17.6": + resolution: + { + integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + + "@esbuild/linux-x64@0.21.5": + resolution: + { + integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + + "@esbuild/linux-x64@0.24.2": + resolution: + { + integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [linux] + + "@esbuild/netbsd-arm64@0.24.2": + resolution: + { + integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.17.6": + resolution: + { + integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.21.5": + resolution: + { + integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.24.2": + resolution: + { + integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [netbsd] + + "@esbuild/openbsd-arm64@0.24.2": + resolution: + { + integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.17.6": + resolution: + { + integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.21.5": + resolution: + { + integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.24.2": + resolution: + { + integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [openbsd] + + "@esbuild/sunos-x64@0.17.6": + resolution: + { + integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + + "@esbuild/sunos-x64@0.21.5": + resolution: + { + integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + + "@esbuild/sunos-x64@0.24.2": + resolution: + { + integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.17.6": + resolution: + { + integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-arm64@0.21.5": + resolution: + { + integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-arm64@0.24.2": + resolution: + { + integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==, + } + engines: { node: ">=18" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.17.6": + resolution: + { + integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-ia32@0.21.5": + resolution: + { + integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-ia32@0.24.2": + resolution: + { + integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==, + } + engines: { node: ">=18" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.17.6": + resolution: + { + integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + + "@esbuild/win32-x64@0.21.5": + resolution: + { + integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + + "@esbuild/win32-x64@0.24.2": + resolution: + { + integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==, + } + engines: { node: ">=18" } + cpu: [x64] + os: [win32] + + "@eslint-community/eslint-utils@4.4.1": + resolution: + { + integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + "@eslint-community/regexpp@4.12.1": + resolution: + { + integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==, + } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/config-array@0.19.1": + resolution: + { + integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/core@0.9.1": + resolution: + { + integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/eslintrc@3.2.0": + resolution: + { + integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.17.0": + resolution: + { + integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/object-schema@2.1.5": + resolution: + { + integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/plugin-kit@0.2.4": + resolution: + { + integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@floating-ui/core@1.6.9": + resolution: + { + integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==, + } + + "@floating-ui/dom@1.6.13": + resolution: + { + integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==, + } + + "@floating-ui/react-dom@2.1.2": + resolution: + { + integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==, + } + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + + "@floating-ui/utils@0.2.9": + resolution: + { + integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==, + } + + "@humanfs/core@0.19.1": + resolution: + { + integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, + } + engines: { node: ">=18.18.0" } + + "@humanfs/node@0.16.6": + resolution: + { + integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==, + } + engines: { node: ">=18.18.0" } + + "@humanwhocodes/module-importer@1.0.1": + resolution: + { + integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, + } + engines: { node: ">=12.22" } + + "@humanwhocodes/retry@0.3.1": + resolution: + { + integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==, + } + engines: { node: ">=18.18" } + + "@humanwhocodes/retry@0.4.1": + resolution: + { + integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==, + } + engines: { node: ">=18.18" } + + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + + "@jridgewell/gen-mapping@0.3.8": + resolution: + { + integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.2.1": + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.5.0": + resolution: + { + integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==, + } + + "@jridgewell/trace-mapping@0.3.25": + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } + + "@jspm/core@2.0.1": + resolution: + { + integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==, + } + + "@mdx-js/mdx@2.3.0": + resolution: + { + integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==, + } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@nolyfill/is-core-module@1.0.39": + resolution: + { + integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==, + } + engines: { node: ">=12.4.0" } + + "@npmcli/fs@3.1.1": + resolution: + { + integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + "@npmcli/git@4.1.0": + resolution: + { + integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + "@npmcli/package-json@4.0.1": + resolution: + { + integrity: sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + "@npmcli/promise-spawn@6.0.2": + resolution: + { + integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + + "@radix-ui/primitive@1.1.1": + resolution: + { + integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==, + } + + "@radix-ui/react-arrow@1.1.1": + resolution: + { + integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-avatar@1.1.2": + resolution: + { + integrity: sha512-GaC7bXQZ5VgZvVvsJ5mu/AEbjYLnhhkoidOboC50Z6FFlLA03wG2ianUoH+zgDQ31/9gCF59bE4+2bBgTyMiig==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-collapsible@1.1.2": + resolution: + { + integrity: sha512-PliMB63vxz7vggcyq0IxNYk8vGDrLXVWw4+W4B8YnwI1s18x7YZYqlG9PLX7XxAJUi0g2DxP4XKJMFHh/iVh9A==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-collection@1.1.1": + resolution: + { + integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-compose-refs@1.1.1": + resolution: + { + integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-context@1.1.1": + resolution: + { + integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-dialog@1.1.4": + resolution: + { + integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-direction@1.1.0": + resolution: + { + integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-dismissable-layer@1.1.3": + resolution: + { + integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-focus-guards@1.1.1": + resolution: + { + integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-focus-scope@1.1.1": + resolution: + { + integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-id@1.1.0": + resolution: + { + integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-label@2.1.1": + resolution: + { + integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-popover@1.1.4": + resolution: + { + integrity: sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-popper@1.2.1": + resolution: + { + integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-portal@1.1.3": + resolution: + { + integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-presence@1.1.2": + resolution: + { + integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-primitive@2.0.1": + resolution: + { + integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-roving-focus@1.1.1": + resolution: + { + integrity: sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-separator@1.1.1": + resolution: + { + integrity: sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-slot@1.1.1": + resolution: + { + integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-tabs@1.1.2": + resolution: + { + integrity: sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-toast@1.2.4": + resolution: + { + integrity: sha512-Sch9idFJHJTMH9YNpxxESqABcAFweJG4tKv+0zo0m5XBvUSL8FM5xKcJLFLXononpePs8IclyX1KieL5SDUNgA==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-tooltip@1.1.6": + resolution: + { + integrity: sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/react-use-callback-ref@1.1.0": + resolution: + { + integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-controllable-state@1.1.0": + resolution: + { + integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-escape-keydown@1.1.0": + resolution: + { + integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-layout-effect@1.1.0": + resolution: + { + integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-rect@1.1.0": + resolution: + { + integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-use-size@1.1.0": + resolution: + { + integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + "@radix-ui/react-visually-hidden@1.1.1": + resolution: + { + integrity: sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==, + } + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + + "@radix-ui/rect@1.1.0": + resolution: + { + integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==, + } + + "@remix-run/dev@2.15.2": + resolution: + { + integrity: sha512-o8lix8t4GBhtXjo/G1IzwtHVW5GRMs7amtFtBHiR1bhSyK7VyX5qGtTDmJyny5QDv83pxaLOCiE0dUng2BCoyQ==, + } + engines: { node: ">=18.0.0" } + hasBin: true + peerDependencies: + "@remix-run/react": ^2.15.2 + "@remix-run/serve": ^2.15.2 + typescript: ^5.1.0 + vite: ^5.1.0 + wrangler: ^3.28.2 + peerDependenciesMeta: + "@remix-run/serve": + optional: true + typescript: + optional: true + vite: + optional: true + wrangler: + optional: true + + "@remix-run/express@2.15.2": + resolution: + { + integrity: sha512-54FKQ6/Zj2DCxc4/9tWKUJLPkFakCUf1m7j7a5zp4JGDr436lkZEpS9btfoBZAVq14SIMp5Uc4yt5rUJ1PMORw==, + } + engines: { node: ">=18.0.0" } + peerDependencies: + express: ^4.20.0 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + "@remix-run/node@2.15.2": + resolution: + { + integrity: sha512-NS/h5uxje7DYCNgcKqKAiUhf0r2HVnoYUBWLyIIMmCUP1ddWurBP6xTPcWzGhEvV/EvguniYi1wJZ5+X8sonWw==, + } + engines: { node: ">=18.0.0" } + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + "@remix-run/react@2.15.2": + resolution: + { + integrity: sha512-NAAMsSgoC/sdOgovUewwRCE/RUm3F+MBxxZKfwu3POCNeHaplY5qGkH/y8PUXvdN1EBG7Z0Ko43dyzCfcEy5PA==, + } + engines: { node: ">=18.0.0" } + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + "@remix-run/router@1.21.0": + resolution: + { + integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==, + } + engines: { node: ">=14.0.0" } + + "@remix-run/serve@2.15.2": + resolution: + { + integrity: sha512-m/nZtAUzzGcixNgNc3RNjA1ocFlWAuZFALpZ5fJdPXmITwqRwfjo/1gI+jx7AL7haoo+4j/sAljuAQw2CiswXA==, + } + engines: { node: ">=18.0.0" } + hasBin: true + + "@remix-run/server-runtime@2.15.2": + resolution: + { + integrity: sha512-OqiPcvEnnU88B8b1LIWHHkQ3Tz2GDAmQ1RihFNQsbrFKpDsQLkw0lJlnfgKA/uHd0CEEacpfV7C9qqJT3V6Z2g==, + } + engines: { node: ">=18.0.0" } + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + "@remix-run/web-blob@3.1.0": + resolution: + { + integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==, + } + + "@remix-run/web-fetch@4.4.2": + resolution: + { + integrity: sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==, + } + engines: { node: ^10.17 || >=12.3 } + + "@remix-run/web-file@3.1.0": + resolution: + { + integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==, + } + + "@remix-run/web-form-data@3.1.0": + resolution: + { + integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==, + } + + "@remix-run/web-stream@1.1.0": + resolution: + { + integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==, + } + + "@rollup/rollup-android-arm-eabi@4.30.1": + resolution: + { + integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.30.1": + resolution: + { + integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.30.1": + resolution: + { + integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.30.1": + resolution: + { + integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-freebsd-arm64@4.30.1": + resolution: + { + integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==, + } + cpu: [arm64] + os: [freebsd] + + "@rollup/rollup-freebsd-x64@4.30.1": + resolution: + { + integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==, + } + cpu: [x64] + os: [freebsd] + + "@rollup/rollup-linux-arm-gnueabihf@4.30.1": + resolution: + { + integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm-musleabihf@4.30.1": + resolution: + { + integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm64-gnu@4.30.1": + resolution: + { + integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-arm64-musl@4.30.1": + resolution: + { + integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-loongarch64-gnu@4.30.1": + resolution: + { + integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==, + } + cpu: [loong64] + os: [linux] + + "@rollup/rollup-linux-powerpc64le-gnu@4.30.1": + resolution: + { + integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==, + } + cpu: [ppc64] + os: [linux] + + "@rollup/rollup-linux-riscv64-gnu@4.30.1": + resolution: + { + integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-s390x-gnu@4.30.1": + resolution: + { + integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==, + } + cpu: [s390x] + os: [linux] + + "@rollup/rollup-linux-x64-gnu@4.30.1": + resolution: + { + integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-linux-x64-musl@4.30.1": + resolution: + { + integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-win32-arm64-msvc@4.30.1": + resolution: + { + integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.30.1": + resolution: + { + integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.30.1": + resolution: + { + integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==, + } + cpu: [x64] + os: [win32] + + "@rtsao/scc@1.1.0": + resolution: + { + integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, + } + + "@swc/core-darwin-arm64@1.10.6": + resolution: + { + integrity: sha512-USbMvT8Rw5PvIfF6HyTm+yW84J9c45emzmHBDIWY76vZHkFsS5MepNi+JLQyBzBBgE7ScwBRBNhRx6VNhkSoww==, + } + engines: { node: ">=10" } + cpu: [arm64] + os: [darwin] + + "@swc/core-darwin-x64@1.10.6": + resolution: + { + integrity: sha512-7t2IozcZN4r1p27ei+Kb8IjN4aLoBDn107fPi+aPLcVp2uFgJEUzhCDuZXBNW2057Mx1OHcjzrkaleRpECz3Xg==, + } + engines: { node: ">=10" } + cpu: [x64] + os: [darwin] + + "@swc/core-linux-arm-gnueabihf@1.10.6": + resolution: + { + integrity: sha512-CPgWT+D0bDp/qhXsLkIJ54LmKU1/zvyGaf/yz8A4iR+YoF6R5CSXENXhNJY8cIrb6+uNWJZzHJ+gefB5V51bpA==, + } + engines: { node: ">=10" } + cpu: [arm] + os: [linux] + + "@swc/core-linux-arm64-gnu@1.10.6": + resolution: + { + integrity: sha512-5qZ6hVnqO/ShETXdGSzvdGUVx372qydlj1YWSYiaxQzTAepEBc8TC1NVUgYtOHOKVRkky1d7p6GQ9lymsd4bHw==, + } + engines: { node: ">=10" } + cpu: [arm64] + os: [linux] + + "@swc/core-linux-arm64-musl@1.10.6": + resolution: + { + integrity: sha512-hB2xZFmXCKf2iJF5y2z01PSuLqEoUP3jIX/XlIHN+/AIP7PkSKsValE63LnjlnWPnSEI0IxUyRE3T3FzWE/fQQ==, + } + engines: { node: ">=10" } + cpu: [arm64] + os: [linux] + + "@swc/core-linux-x64-gnu@1.10.6": + resolution: + { + integrity: sha512-PRGPp0I22+oJ8RMGg8M4hXYxEffH3ayu0WoSDPOjfol1F51Wj1tfTWN4wVa2RibzJjkBwMOT0KGLGb/hSEDDXQ==, + } + engines: { node: ">=10" } + cpu: [x64] + os: [linux] + + "@swc/core-linux-x64-musl@1.10.6": + resolution: + { + integrity: sha512-SoNBxlA86lnoV9vIz/TCyakLkdRhFSHx6tFMKNH8wAhz1kKYbZfDmpYoIzeQqdTh0tpx8e/Zu1zdK4smovsZqQ==, + } + engines: { node: ">=10" } + cpu: [x64] + os: [linux] + + "@swc/core-win32-arm64-msvc@1.10.6": + resolution: + { + integrity: sha512-6L5Y2E+FVvM+BtoA+mJFjf/SjpFr73w2kHBxINxwH8/PkjAjkePDr5m0ibQhPXV61bTwX49+1otzTY85EsUW9Q==, + } + engines: { node: ">=10" } + cpu: [arm64] + os: [win32] + + "@swc/core-win32-ia32-msvc@1.10.6": + resolution: + { + integrity: sha512-kxK3tW8DJwEkAkwy0vhwoBAShRebH1QTe0mvH9tlBQ21rToVZQn+GCV/I44dind80hYPw0Tw2JKFVfoEJyBszg==, + } + engines: { node: ">=10" } + cpu: [ia32] + os: [win32] + + "@swc/core-win32-x64-msvc@1.10.6": + resolution: + { + integrity: sha512-4pJka/+t8XcHee12G/R5VWcilkp5poT2EJhrybpuREkpQ7iC/4WOlOVrohbWQ4AhDQmojYQI/iS+gdF2JFLzTQ==, + } + engines: { node: ">=10" } + cpu: [x64] + os: [win32] + + "@swc/core@1.10.6": + resolution: + { + integrity: sha512-zgXXsI6SAVwr6XsXyMnqlyLoa1lT+r09bAWI1xT3679ejWqI1Vnl14eJG0GjWYXCEMKHCNytfMq3OOQ62C39QQ==, + } + engines: { node: ">=10" } + peerDependencies: + "@swc/helpers": "*" + peerDependenciesMeta: + "@swc/helpers": + optional: true + + "@swc/counter@0.1.3": + resolution: + { + integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, + } + + "@swc/types@0.1.17": + resolution: + { + integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==, + } + + "@tanstack/query-core@5.62.16": + resolution: + { + integrity: sha512-9Sgft7Qavcd+sN0V25xVyo0nfmcZXBuODy3FVG7BMWTg1HMLm8wwG5tNlLlmSic1u7l1v786oavn+STiFaPH2g==, + } + + "@tanstack/react-query@5.62.16": + resolution: + { + integrity: sha512-XJIZNj65d2IdvU8VBESmrPakfIm6FSdHDzrS1dPrAwmq3ZX+9riMh/ZfbNQHAWnhrgmq7KoXpgZSRyXnqMYT9A==, + } + peerDependencies: + react: ^18 || ^19 + + "@types/acorn@4.0.6": + resolution: + { + integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==, + } + + "@types/cookie@0.6.0": + resolution: + { + integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==, + } + + "@types/debug@4.1.12": + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + + "@types/estree-jsx@1.0.5": + resolution: + { + integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, + } + + "@types/estree@1.0.6": + resolution: + { + integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==, + } + + "@types/hast@2.3.10": + resolution: + { + integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==, + } + + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + "@types/json5@0.0.29": + resolution: + { + integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, + } + + "@types/mdast@3.0.15": + resolution: + { + integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==, + } + + "@types/mdx@2.0.13": + resolution: + { + integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==, + } + + "@types/ms@0.7.34": + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + + "@types/node@22.10.5": + resolution: + { + integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==, + } + + "@types/prop-types@15.7.14": + resolution: + { + integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==, + } + + "@types/react-dom@18.3.5": + resolution: + { + integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==, + } + peerDependencies: + "@types/react": ^18.0.0 + + "@types/react@18.3.18": + resolution: + { + integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==, + } + + "@types/semver@7.5.8": + resolution: + { + integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==, + } + + "@types/unist@2.0.11": + resolution: + { + integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, + } + + "@typescript-eslint/eslint-plugin@6.21.0": + resolution: + { + integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/eslint-plugin@8.19.1": + resolution: + { + integrity: sha512-tJzcVyvvb9h/PB96g30MpxACd9IrunT7GF9wfA9/0TJ1LxGOJx1TdPzSbBBnNED7K9Ka8ybJsnEpiXPktolTLg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/parser@6.21.0": + resolution: + { + integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/parser@8.19.1": + resolution: + { + integrity: sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/scope-manager@6.21.0": + resolution: + { + integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + + "@typescript-eslint/scope-manager@8.19.1": + resolution: + { + integrity: sha512-60L9KIuN/xgmsINzonOcMDSB8p82h95hoBfSBtXuO4jlR1R9L1xSkmVZKgCPVfavDlXihh4ARNjXhh1gGnLC7Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/type-utils@6.21.0": + resolution: + { + integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/type-utils@8.19.1": + resolution: + { + integrity: sha512-Rp7k9lhDKBMRJB/nM9Ksp1zs4796wVNyihG9/TU9R6KCJDNkQbc2EOKjrBtLYh3396ZdpXLtr/MkaSEmNMtykw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/types@6.21.0": + resolution: + { + integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + + "@typescript-eslint/types@8.19.1": + resolution: + { + integrity: sha512-JBVHMLj7B1K1v1051ZaMMgLW4Q/jre5qGK0Ew6UgXz1Rqh+/xPzV1aW581OM00X6iOfyr1be+QyW8LOUf19BbA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/typescript-estree@6.21.0": + resolution: + { + integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + "@typescript-eslint/typescript-estree@8.19.1": + resolution: + { + integrity: sha512-jk/TZwSMJlxlNnqhy0Eod1PNEvCkpY6MXOXE/WLlblZ6ibb32i2We4uByoKPv1d0OD2xebDv4hbs3fm11SMw8Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/utils@6.21.0": + resolution: + { + integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + "@typescript-eslint/utils@8.19.1": + resolution: + { + integrity: sha512-IxG5gLO0Ne+KaUc8iW1A+XuKLd63o4wlbI1Zp692n1xojCl/THvgIKXJXBZixTh5dd5+yTJ/VXH7GJaaw21qXA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + "@typescript-eslint/visitor-keys@6.21.0": + resolution: + { + integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==, + } + engines: { node: ^16.0.0 || >=18.0.0 } + + "@typescript-eslint/visitor-keys@8.19.1": + resolution: + { + integrity: sha512-fzmjU8CHK853V/avYZAvuVut3ZTfwN5YtMaoi+X9Y9MA9keaWNHC3zEQ9zvyX/7Hj+5JkNyK1l7TOR2hevHB6Q==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@vanilla-extract/babel-plugin-debug-ids@1.2.0": + resolution: + { + integrity: sha512-z5nx2QBnOhvmlmBKeRX5sPVLz437wV30u+GJL+Hzj1rGiJYVNvgIIlzUpRNjVQ0MgAgiQIqIUbqPnmMc6HmDlQ==, + } + + "@vanilla-extract/css@1.17.0": + resolution: + { + integrity: sha512-W6FqVFDD+C71ZlKsuj0MxOXSvHb1tvQ9h/+79aYfi097wLsALrnnBzd0by8C///iurrpQ3S+SH74lXd7Lr9MvA==, + } + + "@vanilla-extract/integration@6.5.0": + resolution: + { + integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==, + } + + "@vanilla-extract/private@1.0.6": + resolution: + { + integrity: sha512-ytsG/JLweEjw7DBuZ/0JCN4WAQgM9erfSTdS1NQY778hFQSZ6cfCDEZZ0sgVm4k54uNz6ImKB33AYvSR//fjxw==, + } + + "@vitejs/plugin-react-swc@3.7.2": + resolution: + { + integrity: sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==, + } + peerDependencies: + vite: ^4 || ^5 || ^6 + + "@web3-storage/multipart-parser@1.0.0": + resolution: + { + integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==, + } + + "@zxing/text-encoding@0.9.0": + resolution: + { + integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==, + } + + abort-controller@3.0.0: + resolution: + { + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==, + } + engines: { node: ">=6.5" } + + accepts@1.3.8: + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: ">= 0.6" } + + acorn-jsx@5.3.2: + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.0: + resolution: + { + integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + aggregate-error@3.1.0: + resolution: + { + integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, + } + engines: { node: ">=8" } + + ajv@6.12.6: + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.1.0: + resolution: + { + integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==, + } + engines: { node: ">=12" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + + any-promise@1.3.0: + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } + + anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + + arg@5.0.2: + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + aria-hidden@1.2.4: + resolution: + { + integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==, + } + engines: { node: ">=10" } + + aria-query@5.3.2: + resolution: + { + integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, + } + engines: { node: ">= 0.4" } + + array-buffer-byte-length@1.0.2: + resolution: + { + integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, + } + engines: { node: ">= 0.4" } + + array-flatten@1.1.1: + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } + + array-includes@3.1.8: + resolution: + { + integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==, + } + engines: { node: ">= 0.4" } + + array-union@2.1.0: + resolution: + { + integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, + } + engines: { node: ">=8" } + + array.prototype.findlast@1.2.5: + resolution: + { + integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, + } + engines: { node: ">= 0.4" } + + array.prototype.findlastindex@1.2.5: + resolution: + { + integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==, + } + engines: { node: ">= 0.4" } + + array.prototype.flat@1.3.3: + resolution: + { + integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, + } + engines: { node: ">= 0.4" } + + array.prototype.flatmap@1.3.3: + resolution: + { + integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, + } + engines: { node: ">= 0.4" } + + array.prototype.tosorted@1.1.4: + resolution: + { + integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, + } + engines: { node: ">= 0.4" } + + arraybuffer.prototype.slice@1.0.4: + resolution: + { + integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, + } + engines: { node: ">= 0.4" } + + ast-types-flow@0.0.8: + resolution: + { + integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, + } + + astring@1.9.0: + resolution: + { + integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==, + } + hasBin: true + + autoprefixer@10.4.20: + resolution: + { + integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==, + } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: + { + integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, + } + engines: { node: ">= 0.4" } + + axe-core@4.10.2: + resolution: + { + integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==, + } + engines: { node: ">=4" } + + axobject-query@4.1.0: + resolution: + { + integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, + } + engines: { node: ">= 0.4" } + + bail@2.0.2: + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } + + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + base64-js@1.5.1: + resolution: + { + integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, + } + + basic-auth@2.0.1: + resolution: + { + integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==, + } + engines: { node: ">= 0.8" } + + binary-extensions@2.3.0: + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: ">=8" } + + bl@4.1.0: + resolution: + { + integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, + } + + body-parser@1.20.3: + resolution: + { + integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + + brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + + brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + + braces@3.0.3: + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: ">=8" } + + browserify-zlib@0.1.4: + resolution: + { + integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==, + } + + browserslist@4.24.3: + resolution: + { + integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + buffer-from@1.1.2: + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } + + buffer@5.7.1: + resolution: + { + integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, + } + + bytes@3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } + + cac@6.7.14: + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: ">=8" } + + cacache@17.1.4: + resolution: + { + integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + call-bind-apply-helpers@1.0.1: + resolution: + { + integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==, + } + engines: { node: ">= 0.4" } + + call-bind@1.0.8: + resolution: + { + integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, + } + engines: { node: ">= 0.4" } + + call-bound@1.0.3: + resolution: + { + integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==, + } + engines: { node: ">= 0.4" } + + callsites@3.1.0: + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } + + camelcase-css@2.0.1: + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: ">= 6" } + + caniuse-lite@1.0.30001690: + resolution: + { + integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==, + } + + ccount@2.0.1: + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } + + chalk@4.1.2: + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } + + character-entities-html4@2.1.0: + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } + + character-entities-legacy@3.0.0: + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } + + character-entities@2.0.2: + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } + + character-reference-invalid@2.0.1: + resolution: + { + integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, + } + + chokidar@3.6.0: + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } + + chownr@1.1.4: + resolution: + { + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, + } + + chownr@2.0.0: + resolution: + { + integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, + } + engines: { node: ">=10" } + + class-variance-authority@0.7.1: + resolution: + { + integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==, + } + + classnames@2.5.1: + resolution: + { + integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==, + } + + clean-stack@2.2.0: + resolution: + { + integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, + } + engines: { node: ">=6" } + + cli-cursor@3.1.0: + resolution: + { + integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, + } + engines: { node: ">=8" } + + cli-spinners@2.9.2: + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: ">=6" } + + clone@1.0.4: + resolution: + { + integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, + } + engines: { node: ">=0.8" } + + clsx@2.1.1: + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: ">=6" } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + comma-separated-tokens@2.0.3: + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } + + commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } + + compressible@2.0.18: + resolution: + { + integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, + } + engines: { node: ">= 0.6" } + + compression@1.7.5: + resolution: + { + integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==, + } + engines: { node: ">= 0.8.0" } + + concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + confbox@0.1.8: + resolution: + { + integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, + } + + content-disposition@0.5.4: + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: ">= 0.6" } + + content-type@1.0.5: + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } + + convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + + cookie-signature@1.0.6: + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } + + cookie-signature@1.2.2: + resolution: + { + integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, + } + engines: { node: ">=6.6.0" } + + cookie@0.6.0: + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + } + engines: { node: ">= 0.6" } + + cookie@0.7.1: + resolution: + { + integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==, + } + engines: { node: ">= 0.6" } + + core-util-is@1.0.3: + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } + + cross-spawn@7.0.6: + resolution: + { + integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, + } + engines: { node: ">= 8" } + + css-what@6.1.0: + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: ">= 6" } + + cssesc@3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + + csstype@3.1.3: + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } + + damerau-levenshtein@1.0.8: + resolution: + { + integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, + } + + data-uri-to-buffer@3.0.1: + resolution: + { + integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==, + } + engines: { node: ">= 6" } + + data-view-buffer@1.0.2: + resolution: + { + integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, + } + engines: { node: ">= 0.4" } + + data-view-byte-length@1.0.2: + resolution: + { + integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, + } + engines: { node: ">= 0.4" } + + data-view-byte-offset@1.0.1: + resolution: + { + integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, + } + engines: { node: ">= 0.4" } + + dayjs@1.11.13: + resolution: + { + integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==, + } + + debug@2.6.9: + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: + { + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, + } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: + { + integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: + { + integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, + } + + dedent@1.5.3: + resolution: + { + integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==, + } + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: + { + integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, + } + + deep-object-diff@1.1.9: + resolution: + { + integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==, + } + + deepmerge@4.3.1: + resolution: + { + integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, + } + engines: { node: ">=0.10.0" } + + defaults@1.0.4: + resolution: + { + integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, + } + + define-data-property@1.1.4: + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } + + define-properties@1.2.1: + resolution: + { + integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, + } + engines: { node: ">= 0.4" } + + depd@2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } + + dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } + + destroy@1.2.0: + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } + + detect-node-es@1.1.0: + resolution: + { + integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==, + } + + didyoumean@1.2.2: + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } + + diff@5.2.0: + resolution: + { + integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, + } + engines: { node: ">=0.3.1" } + + dir-glob@3.0.1: + resolution: + { + integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, + } + engines: { node: ">=8" } + + dlv@1.1.3: + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } + + doctrine@2.1.0: + resolution: + { + integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, + } + engines: { node: ">=0.10.0" } + + dotenv@16.4.7: + resolution: + { + integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==, + } + engines: { node: ">=12" } + + dunder-proto@1.0.1: + resolution: + { + integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, + } + engines: { node: ">= 0.4" } + + duplexify@3.7.1: + resolution: + { + integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==, + } + + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + ee-first@1.1.1: + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } + + electron-to-chromium@1.5.78: + resolution: + { + integrity: sha512-UmwIt7HRKN1rsJfddG5UG7rCTCTAKoS9JeOy/R0zSenAyaZ8SU3RuXlwcratxhdxGRNpk03iq8O7BA3W7ibLVw==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + encodeurl@1.0.2: + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: ">= 0.8" } + + encodeurl@2.0.0: + resolution: + { + integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, + } + engines: { node: ">= 0.8" } + + end-of-stream@1.4.4: + resolution: + { + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, + } + + enhanced-resolve@5.18.0: + resolution: + { + integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==, + } + engines: { node: ">=10.13.0" } + + err-code@2.0.3: + resolution: + { + integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, + } + + es-abstract@1.23.9: + resolution: + { + integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==, + } + engines: { node: ">= 0.4" } + + es-define-property@1.0.1: + resolution: + { + integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, + } + engines: { node: ">= 0.4" } + + es-errors@1.3.0: + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } + + es-iterator-helpers@1.2.1: + resolution: + { + integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==, + } + engines: { node: ">= 0.4" } + + es-module-lexer@1.6.0: + resolution: + { + integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==, + } + + es-object-atoms@1.0.0: + resolution: + { + integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==, + } + engines: { node: ">= 0.4" } + + es-set-tostringtag@2.1.0: + resolution: + { + integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, + } + engines: { node: ">= 0.4" } + + es-shim-unscopables@1.0.2: + resolution: + { + integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==, + } + + es-to-primitive@1.3.0: + resolution: + { + integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, + } + engines: { node: ">= 0.4" } + + esbuild-plugins-node-modules-polyfill@1.6.8: + resolution: + { + integrity: sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + esbuild: ">=0.14.0 <=0.24.x" + + esbuild@0.17.6: + resolution: + { + integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==, + } + engines: { node: ">=12" } + hasBin: true + + esbuild@0.21.5: + resolution: + { + integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, + } + engines: { node: ">=12" } + hasBin: true + + esbuild@0.24.2: + resolution: + { + integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==, + } + engines: { node: ">=18" } + hasBin: true + + escalade@3.2.0: + resolution: + { + integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, + } + engines: { node: ">=6" } + + escape-html@1.0.3: + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } + + escape-string-regexp@4.0.0: + resolution: + { + integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, + } + engines: { node: ">=10" } + + eslint-import-resolver-node@0.3.9: + resolution: + { + integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, + } + + eslint-import-resolver-typescript@3.7.0: + resolution: + { + integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.12.0: + resolution: + { + integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==, + } + engines: { node: ">=4" } + peerDependencies: + "@typescript-eslint/parser": "*" + eslint: "*" + eslint-import-resolver-node: "*" + eslint-import-resolver-typescript: "*" + eslint-import-resolver-webpack: "*" + peerDependenciesMeta: + "@typescript-eslint/parser": + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.31.0: + resolution: + { + integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==, + } + engines: { node: ">=4" } + peerDependencies: + "@typescript-eslint/parser": "*" + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + "@typescript-eslint/parser": + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: + { + integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, + } + engines: { node: ">=4.0" } + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@5.1.0: + resolution: + { + integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==, + } + engines: { node: ">=10" } + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.16: + resolution: + { + integrity: sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==, + } + peerDependencies: + eslint: ">=8.40" + + eslint-plugin-react@7.37.3: + resolution: + { + integrity: sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==, + } + engines: { node: ">=4" } + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.2.0: + resolution: + { + integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint-visitor-keys@3.4.3: + resolution: + { + integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, + } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + eslint-visitor-keys@4.2.0: + resolution: + { + integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint@9.17.0: + resolution: + { + integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + hasBin: true + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: + { + integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + esquery@1.6.0: + resolution: + { + integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, + } + engines: { node: ">=0.10" } + + esrecurse@4.3.0: + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } + + estraverse@5.3.0: + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } + + estree-util-attach-comments@2.1.1: + resolution: + { + integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==, + } + + estree-util-build-jsx@2.2.2: + resolution: + { + integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==, + } + + estree-util-is-identifier-name@1.1.0: + resolution: + { + integrity: sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ==, + } + + estree-util-is-identifier-name@2.1.0: + resolution: + { + integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==, + } + + estree-util-to-js@1.2.0: + resolution: + { + integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==, + } + + estree-util-value-to-estree@1.3.0: + resolution: + { + integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==, + } + engines: { node: ">=12.0.0" } + + estree-util-visit@1.2.1: + resolution: + { + integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==, + } + + estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + + esutils@2.0.3: + resolution: + { + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, + } + engines: { node: ">=0.10.0" } + + etag@1.8.1: + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } + + eval@0.1.8: + resolution: + { + integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==, + } + engines: { node: ">= 0.8" } + + event-target-shim@5.0.1: + resolution: + { + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==, + } + engines: { node: ">=6" } + + execa@5.1.1: + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } + + exit-hook@2.2.1: + resolution: + { + integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==, + } + engines: { node: ">=6" } + + express@4.21.2: + resolution: + { + integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==, + } + engines: { node: ">= 0.10.0" } + + extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + + fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-glob@3.3.3: + resolution: + { + integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, + } + engines: { node: ">=8.6.0" } + + fast-json-stable-stringify@2.1.0: + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } + + fast-levenshtein@2.0.6: + resolution: + { + integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, + } + + fastq@1.18.0: + resolution: + { + integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==, + } + + fault@2.0.1: + resolution: + { + integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==, + } + + file-entry-cache@8.0.0: + resolution: + { + integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, + } + engines: { node: ">=16.0.0" } + + fill-range@7.1.1: + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: ">=8" } + + finalhandler@1.3.1: + resolution: + { + integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==, + } + engines: { node: ">= 0.8" } + + find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + + flat-cache@4.0.1: + resolution: + { + integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, + } + engines: { node: ">=16" } + + flatted@3.3.2: + resolution: + { + integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==, + } + + for-each@0.3.3: + resolution: + { + integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==, + } + + foreground-child@3.3.0: + resolution: + { + integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==, + } + engines: { node: ">=14" } + + format@0.2.2: + resolution: + { + integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==, + } + engines: { node: ">=0.4.x" } + + forwarded@0.2.0: + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: ">= 0.6" } + + fraction.js@4.3.7: + resolution: + { + integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, + } + + framer-motion@11.16.0: + resolution: + { + integrity: sha512-oL2AWqLQuw0+CNEUa0sz3mWC/n3i147CckvpQn8bLRs30b+HxTxlRi0YR2FpHHhAbWV7DKjNdHU42KHLfBWh/g==, + } + peerDependencies: + "@emotion/is-prop-valid": "*" + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@emotion/is-prop-valid": + optional: true + react: + optional: true + react-dom: + optional: true + + fresh@0.5.2: + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: ">= 0.6" } + + fs-constants@1.0.0: + resolution: + { + integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, + } + + fs-extra@10.1.0: + resolution: + { + integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==, + } + engines: { node: ">=12" } + + fs-minipass@2.1.0: + resolution: + { + integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, + } + engines: { node: ">= 8" } + + fs-minipass@3.0.3: + resolution: + { + integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + function.prototype.name@1.1.8: + resolution: + { + integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, + } + engines: { node: ">= 0.4" } + + functions-have-names@1.2.3: + resolution: + { + integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, + } + + generic-names@4.0.0: + resolution: + { + integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==, + } + + gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } + + get-intrinsic@1.2.7: + resolution: + { + integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==, + } + engines: { node: ">= 0.4" } + + get-nonce@1.0.1: + resolution: + { + integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==, + } + engines: { node: ">=6" } + + get-port@5.1.1: + resolution: + { + integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==, + } + engines: { node: ">=8" } + + get-proto@1.0.1: + resolution: + { + integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, + } + engines: { node: ">= 0.4" } + + get-stream@6.0.1: + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } + + get-symbol-description@1.1.0: + resolution: + { + integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, + } + engines: { node: ">= 0.4" } + + get-tsconfig@4.8.1: + resolution: + { + integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==, + } + + glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + + glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + + glob@10.4.5: + resolution: + { + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, + } + hasBin: true + + globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + + globals@14.0.0: + resolution: + { + integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, + } + engines: { node: ">=18" } + + globals@15.14.0: + resolution: + { + integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==, + } + engines: { node: ">=18" } + + globalthis@1.0.4: + resolution: + { + integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, + } + engines: { node: ">= 0.4" } + + globby@11.1.0: + resolution: + { + integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, + } + engines: { node: ">=10" } + + globrex@0.1.2: + resolution: + { + integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==, + } + + gopd@1.2.0: + resolution: + { + integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, + } + engines: { node: ">= 0.4" } + + graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + graphemer@1.4.0: + resolution: + { + integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==, + } + + gunzip-maybe@1.4.2: + resolution: + { + integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==, + } + hasBin: true + + has-bigints@1.1.0: + resolution: + { + integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, + } + engines: { node: ">= 0.4" } + + has-flag@4.0.0: + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } + + has-property-descriptors@1.0.2: + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } + + has-proto@1.2.0: + resolution: + { + integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, + } + engines: { node: ">= 0.4" } + + has-symbols@1.1.0: + resolution: + { + integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, + } + engines: { node: ">= 0.4" } + + has-tostringtag@1.0.2: + resolution: + { + integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, + } + engines: { node: ">= 0.4" } + + hasown@2.0.2: + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } + + hast-util-to-estree@2.3.3: + resolution: + { + integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==, + } + + hast-util-whitespace@2.0.1: + resolution: + { + integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==, + } + + hosted-git-info@6.1.3: + resolution: + { + integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + howler@2.2.4: + resolution: + { + integrity: sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==, + } + + http-errors@2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } + + human-signals@2.1.0: + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } + + iconv-lite@0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } + + icss-utils@5.1.0: + resolution: + { + integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, + } + engines: { node: ^10 || ^12 || >= 14 } + peerDependencies: + postcss: ^8.1.0 + + ieee754@1.2.1: + resolution: + { + integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, + } + + ignore@5.3.2: + resolution: + { + integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, + } + engines: { node: ">= 4" } + + import-fresh@3.3.0: + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } + + imurmurhash@0.1.4: + resolution: + { + integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, + } + engines: { node: ">=0.8.19" } + + indent-string@4.0.0: + resolution: + { + integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, + } + engines: { node: ">=8" } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + inline-style-parser@0.1.1: + resolution: + { + integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==, + } + + internal-slot@1.1.0: + resolution: + { + integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, + } + engines: { node: ">= 0.4" } + + ipaddr.js@1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } + + is-alphabetical@2.0.1: + resolution: + { + integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, + } + + is-alphanumerical@2.0.1: + resolution: + { + integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, + } + + is-arguments@1.2.0: + resolution: + { + integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==, + } + engines: { node: ">= 0.4" } + + is-array-buffer@3.0.5: + resolution: + { + integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, + } + engines: { node: ">= 0.4" } + + is-async-function@2.1.0: + resolution: + { + integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==, + } + engines: { node: ">= 0.4" } + + is-bigint@1.1.0: + resolution: + { + integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, + } + engines: { node: ">= 0.4" } + + is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + + is-boolean-object@1.2.1: + resolution: + { + integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==, + } + engines: { node: ">= 0.4" } + + is-buffer@2.0.5: + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: ">=4" } + + is-bun-module@1.3.0: + resolution: + { + integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==, + } + + is-callable@1.2.7: + resolution: + { + integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, + } + engines: { node: ">= 0.4" } + + is-core-module@2.16.1: + resolution: + { + integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + } + engines: { node: ">= 0.4" } + + is-data-view@1.0.2: + resolution: + { + integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, + } + engines: { node: ">= 0.4" } + + is-date-object@1.1.0: + resolution: + { + integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, + } + engines: { node: ">= 0.4" } + + is-decimal@2.0.1: + resolution: + { + integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, + } + + is-deflate@1.0.0: + resolution: + { + integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==, + } + + is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + is-finalizationregistry@1.1.1: + resolution: + { + integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, + } + engines: { node: ">= 0.4" } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-generator-function@1.1.0: + resolution: + { + integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==, + } + engines: { node: ">= 0.4" } + + is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + + is-gzip@1.0.0: + resolution: + { + integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==, + } + engines: { node: ">=0.10.0" } + + is-hexadecimal@2.0.1: + resolution: + { + integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, + } + + is-interactive@1.0.0: + resolution: + { + integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, + } + engines: { node: ">=8" } + + is-map@2.0.3: + resolution: + { + integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, + } + engines: { node: ">= 0.4" } + + is-number-object@1.1.1: + resolution: + { + integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, + } + engines: { node: ">= 0.4" } + + is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + is-plain-obj@3.0.0: + resolution: + { + integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==, + } + engines: { node: ">=10" } + + is-plain-obj@4.1.0: + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } + + is-reference@3.0.3: + resolution: + { + integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==, + } + + is-regex@1.2.1: + resolution: + { + integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, + } + engines: { node: ">= 0.4" } + + is-set@2.0.3: + resolution: + { + integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, + } + engines: { node: ">= 0.4" } + + is-shared-array-buffer@1.0.4: + resolution: + { + integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, + } + engines: { node: ">= 0.4" } + + is-stream@2.0.1: + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } + + is-string@1.1.1: + resolution: + { + integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, + } + engines: { node: ">= 0.4" } + + is-symbol@1.1.1: + resolution: + { + integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, + } + engines: { node: ">= 0.4" } + + is-typed-array@1.1.15: + resolution: + { + integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, + } + engines: { node: ">= 0.4" } + + is-unicode-supported@0.1.0: + resolution: + { + integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, + } + engines: { node: ">=10" } + + is-weakmap@2.0.2: + resolution: + { + integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, + } + engines: { node: ">= 0.4" } + + is-weakref@1.1.0: + resolution: + { + integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==, + } + engines: { node: ">= 0.4" } + + is-weakset@2.0.4: + resolution: + { + integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, + } + engines: { node: ">= 0.4" } + + isarray@1.0.0: + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } + + isarray@2.0.5: + resolution: + { + integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, + } + + isbot@4.4.0: + resolution: + { + integrity: sha512-8ZvOWUA68kyJO4hHJdWjyreq7TYNWTS9y15IzeqVdKxR9pPr3P/3r9AHcoIv9M0Rllkao5qWz2v1lmcyKIVCzQ==, + } + engines: { node: ">=18" } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + iterator.prototype@1.1.5: + resolution: + { + integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, + } + engines: { node: ">= 0.4" } + + jackspeak@3.4.3: + resolution: + { + integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, + } + + javascript-stringify@2.1.0: + resolution: + { + integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==, + } + + jiti@1.21.7: + resolution: + { + integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==, + } + hasBin: true + + js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + + js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + + jsesc@3.0.2: + resolution: + { + integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==, + } + engines: { node: ">=6" } + hasBin: true + + json-buffer@3.0.1: + resolution: + { + integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, + } + + json-parse-even-better-errors@3.0.2: + resolution: + { + integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + json-schema-traverse@0.4.1: + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } + + json-schema@0.4.0: + resolution: + { + integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, + } + + json-stable-stringify-without-jsonify@1.0.1: + resolution: + { + integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, + } + + json5@1.0.2: + resolution: + { + integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, + } + hasBin: true + + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + + jsonfile@6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + + jsx-ast-utils@3.3.5: + resolution: + { + integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, + } + engines: { node: ">=4.0" } + + keyv@4.5.4: + resolution: + { + integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, + } + + kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } + + language-subtag-registry@0.3.23: + resolution: + { + integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, + } + + language-tags@1.0.9: + resolution: + { + integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, + } + engines: { node: ">=0.10" } + + levn@0.4.1: + resolution: + { + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, + } + engines: { node: ">= 0.8.0" } + + lilconfig@3.1.3: + resolution: + { + integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, + } + engines: { node: ">=14" } + + lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + loader-utils@3.3.1: + resolution: + { + integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==, + } + engines: { node: ">= 12.13.0" } + + local-pkg@0.5.1: + resolution: + { + integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==, + } + engines: { node: ">=14" } + + locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + + lodash.camelcase@4.3.0: + resolution: + { + integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==, + } + + lodash.debounce@4.0.8: + resolution: + { + integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, + } + + lodash.merge@4.6.2: + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } + + lodash@4.17.21: + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } + + log-symbols@4.1.0: + resolution: + { + integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, + } + engines: { node: ">=10" } + + longest-streak@3.1.0: + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } + + loose-envify@1.4.0: + resolution: + { + integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, + } + hasBin: true + + lru-cache@10.4.3: + resolution: + { + integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, + } + + lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + + lru-cache@7.18.3: + resolution: + { + integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==, + } + engines: { node: ">=12" } + + lucide-react@0.469.0: + resolution: + { + integrity: sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==, + } + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + markdown-extensions@1.1.1: + resolution: + { + integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==, + } + engines: { node: ">=0.10.0" } + + math-intrinsics@1.1.0: + resolution: + { + integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, + } + engines: { node: ">= 0.4" } + + mdast-util-definitions@5.1.2: + resolution: + { + integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==, + } + + mdast-util-from-markdown@1.3.1: + resolution: + { + integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==, + } + + mdast-util-frontmatter@1.0.1: + resolution: + { + integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==, + } + + mdast-util-mdx-expression@1.3.2: + resolution: + { + integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==, + } + + mdast-util-mdx-jsx@2.1.4: + resolution: + { + integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==, + } + + mdast-util-mdx@2.0.1: + resolution: + { + integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==, + } + + mdast-util-mdxjs-esm@1.3.1: + resolution: + { + integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==, + } + + mdast-util-phrasing@3.0.1: + resolution: + { + integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==, + } + + mdast-util-to-hast@12.3.0: + resolution: + { + integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==, + } + + mdast-util-to-markdown@1.5.0: + resolution: + { + integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==, + } + + mdast-util-to-string@3.2.0: + resolution: + { + integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==, + } + + media-query-parser@2.0.2: + resolution: + { + integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==, + } + + media-typer@0.3.0: + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: ">= 0.6" } + + merge-descriptors@1.0.3: + resolution: + { + integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==, + } + + merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + + methods@1.1.2: + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: ">= 0.6" } + + micromark-core-commonmark@1.1.0: + resolution: + { + integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==, + } + + micromark-extension-frontmatter@1.1.1: + resolution: + { + integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==, + } + + micromark-extension-mdx-expression@1.0.8: + resolution: + { + integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==, + } + + micromark-extension-mdx-jsx@1.0.5: + resolution: + { + integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==, + } + + micromark-extension-mdx-md@1.0.1: + resolution: + { + integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==, + } + + micromark-extension-mdxjs-esm@1.0.5: + resolution: + { + integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==, + } + + micromark-extension-mdxjs@1.0.1: + resolution: + { + integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==, + } + + micromark-factory-destination@1.1.0: + resolution: + { + integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==, + } + + micromark-factory-label@1.1.0: + resolution: + { + integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==, + } + + micromark-factory-mdx-expression@1.0.9: + resolution: + { + integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==, + } + + micromark-factory-space@1.1.0: + resolution: + { + integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==, + } + + micromark-factory-title@1.1.0: + resolution: + { + integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==, + } + + micromark-factory-whitespace@1.1.0: + resolution: + { + integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==, + } + + micromark-util-character@1.2.0: + resolution: + { + integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==, + } + + micromark-util-chunked@1.1.0: + resolution: + { + integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==, + } + + micromark-util-classify-character@1.1.0: + resolution: + { + integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==, + } + + micromark-util-combine-extensions@1.1.0: + resolution: + { + integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==, + } + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: + { + integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==, + } + + micromark-util-decode-string@1.1.0: + resolution: + { + integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==, + } + + micromark-util-encode@1.1.0: + resolution: + { + integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==, + } + + micromark-util-events-to-acorn@1.2.3: + resolution: + { + integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==, + } + + micromark-util-html-tag-name@1.2.0: + resolution: + { + integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==, + } + + micromark-util-normalize-identifier@1.1.0: + resolution: + { + integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==, + } + + micromark-util-resolve-all@1.1.0: + resolution: + { + integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==, + } + + micromark-util-sanitize-uri@1.2.0: + resolution: + { + integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==, + } + + micromark-util-subtokenize@1.1.0: + resolution: + { + integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==, + } + + micromark-util-symbol@1.1.0: + resolution: + { + integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==, + } + + micromark-util-types@1.1.0: + resolution: + { + integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==, + } + + micromark@3.2.0: + resolution: + { + integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==, + } + + micromatch@4.0.8: + resolution: + { + integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, + } + engines: { node: ">=8.6" } + + mime-db@1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } + + mime-db@1.53.0: + resolution: + { + integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==, + } + engines: { node: ">= 0.6" } + + mime-types@2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } + + mime@1.6.0: + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: ">=4" } + hasBin: true + + mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + + minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + + minimatch@9.0.3: + resolution: + { + integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, + } + engines: { node: ">=16 || 14 >=14.17" } + + minimatch@9.0.5: + resolution: + { + integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, + } + engines: { node: ">=16 || 14 >=14.17" } + + minimist@1.2.8: + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } + + minipass-collect@1.0.2: + resolution: + { + integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==, + } + engines: { node: ">= 8" } + + minipass-flush@1.0.5: + resolution: + { + integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, + } + engines: { node: ">= 8" } + + minipass-pipeline@1.2.4: + resolution: + { + integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, + } + engines: { node: ">=8" } + + minipass@3.3.6: + resolution: + { + integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, + } + engines: { node: ">=8" } + + minipass@5.0.0: + resolution: + { + integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, + } + engines: { node: ">=8" } + + minipass@7.1.2: + resolution: + { + integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, + } + engines: { node: ">=16 || 14 >=14.17" } + + minizlib@2.1.2: + resolution: + { + integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, + } + engines: { node: ">= 8" } + + mkdirp-classic@0.5.3: + resolution: + { + integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, + } + + mkdirp@1.0.4: + resolution: + { + integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, + } + engines: { node: ">=10" } + hasBin: true + + mlly@1.7.3: + resolution: + { + integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==, + } + + modern-ahocorasick@1.1.0: + resolution: + { + integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==, + } + + morgan@1.10.0: + resolution: + { + integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==, + } + engines: { node: ">= 0.8.0" } + + motion-dom@11.16.0: + resolution: + { + integrity: sha512-4bmEwajSdrljzDAYpu6ceEdtI4J5PH25fmN8YSx7Qxk6OMrC10CXM0D5y+VO/pFZjhmCvm2bGf7Rus482kwhzA==, + } + + motion-utils@11.16.0: + resolution: + { + integrity: sha512-ngdWPjg31rD4WGXFi0eZ00DQQqKKu04QExyv/ymlC+3k+WIgYVFbt6gS5JsFPbJODTF/r8XiE/X+SsoT9c0ocw==, + } + + mri@1.2.0: + resolution: + { + integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, + } + engines: { node: ">=4" } + + mrmime@1.0.1: + resolution: + { + integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==, + } + engines: { node: ">=10" } + + ms@2.0.0: + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } + + ms@2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } + + mz@2.7.0: + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } + + nanoid@3.3.8: + resolution: + { + integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + nanoid@5.0.9: + resolution: + { + integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==, + } + engines: { node: ^18 || >=20 } + hasBin: true + + natural-compare@1.4.0: + resolution: + { + integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, + } + + negotiator@0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: ">= 0.6" } + + negotiator@0.6.4: + resolution: + { + integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, + } + engines: { node: ">= 0.6" } + + node-releases@2.0.19: + resolution: + { + integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==, + } + + normalize-package-data@5.0.0: + resolution: + { + integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + normalize-range@0.1.2: + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: ">=0.10.0" } + + npm-install-checks@6.3.0: + resolution: + { + integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + npm-normalize-package-bin@3.0.1: + resolution: + { + integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + npm-package-arg@10.1.0: + resolution: + { + integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + npm-pick-manifest@8.0.2: + resolution: + { + integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + npm-run-path@4.0.1: + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } + + object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } + + object-hash@3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + + object-inspect@1.13.3: + resolution: + { + integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==, + } + engines: { node: ">= 0.4" } + + object-keys@1.1.1: + resolution: + { + integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, + } + engines: { node: ">= 0.4" } + + object.assign@4.1.7: + resolution: + { + integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, + } + engines: { node: ">= 0.4" } + + object.entries@1.1.8: + resolution: + { + integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==, + } + engines: { node: ">= 0.4" } + + object.fromentries@2.0.8: + resolution: + { + integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, + } + engines: { node: ">= 0.4" } + + object.groupby@1.0.3: + resolution: + { + integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, + } + engines: { node: ">= 0.4" } + + object.values@1.2.1: + resolution: + { + integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, + } + engines: { node: ">= 0.4" } + + on-finished@2.3.0: + resolution: + { + integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, + } + engines: { node: ">= 0.8" } + + on-finished@2.4.1: + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: ">= 0.8" } + + on-headers@1.0.2: + resolution: + { + integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, + } + engines: { node: ">= 0.8" } + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + + optionator@0.9.4: + resolution: + { + integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, + } + engines: { node: ">= 0.8.0" } + + ora@5.4.1: + resolution: + { + integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, + } + engines: { node: ">=10" } + + outdent@0.8.0: + resolution: + { + integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==, + } + + own-keys@1.0.1: + resolution: + { + integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, + } + engines: { node: ">= 0.4" } + + p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + + p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + + p-map@4.0.0: + resolution: + { + integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, + } + engines: { node: ">=10" } + + package-json-from-dist@1.0.1: + resolution: + { + integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, + } + + pako@0.2.9: + resolution: + { + integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==, + } + + parent-module@1.0.1: + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } + + parse-entities@4.0.2: + resolution: + { + integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, + } + + parse-ms@2.1.0: + resolution: + { + integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==, + } + engines: { node: ">=6" } + + parseurl@1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } + + path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-scurry@1.11.1: + resolution: + { + integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, + } + engines: { node: ">=16 || 14 >=14.18" } + + path-to-regexp@0.1.12: + resolution: + { + integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==, + } + + path-type@4.0.0: + resolution: + { + integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, + } + engines: { node: ">=8" } + + pathe@1.1.2: + resolution: + { + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, + } + + peek-stream@1.1.3: + resolution: + { + integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==, + } + + periscopic@3.1.0: + resolution: + { + integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==, + } + + picocolors@1.1.1: + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + pidtree@0.6.0: + resolution: + { + integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==, + } + engines: { node: ">=0.10" } + hasBin: true + + pify@2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: ">=0.10.0" } + + pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: ">= 6" } + + pkg-types@1.3.0: + resolution: + { + integrity: sha512-kS7yWjVFCkIw9hqdJBoMxDdzEngmkr5FXeWZZfQ6GoYacjVnsW6l2CcYW/0ThD0vF4LPJgVYnrg4d0uuhwYQbg==, + } + + possible-typed-array-names@1.0.0: + resolution: + { + integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==, + } + engines: { node: ">= 0.4" } + + postcss-discard-duplicates@5.1.0: + resolution: + { + integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==, + } + engines: { node: ^10 || ^12 || >=14.0 } + peerDependencies: + postcss: ^8.2.15 + + postcss-import@15.1.0: + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: + { + integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, + } + engines: { node: ">= 14" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-modules-extract-imports@3.1.0: + resolution: + { + integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==, + } + engines: { node: ^10 || ^12 || >= 14 } + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: + { + integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==, + } + engines: { node: ^10 || ^12 || >= 14 } + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: + { + integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==, + } + engines: { node: ^10 || ^12 || >= 14 } + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: + { + integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, + } + engines: { node: ^10 || ^12 || >= 14 } + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@6.0.1: + resolution: + { + integrity: sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==, + } + peerDependencies: + postcss: ^8.0.0 + + postcss-nested@6.2.0: + resolution: + { + integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: + { + integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, + } + engines: { node: ">=4" } + + postcss-selector-parser@7.0.0: + resolution: + { + integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==, + } + engines: { node: ">=4" } + + postcss-value-parser@4.2.0: + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } + + postcss@8.4.49: + resolution: + { + integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==, + } + engines: { node: ^10 || ^12 || >=14 } + + prelude-ls@1.2.1: + resolution: + { + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, + } + engines: { node: ">= 0.8.0" } + + prettier@2.8.8: + resolution: + { + integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, + } + engines: { node: ">=10.13.0" } + hasBin: true + + pretty-ms@7.0.1: + resolution: + { + integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==, + } + engines: { node: ">=10" } + + proc-log@3.0.0: + resolution: + { + integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + process-nextick-args@2.0.1: + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } + + promise-inflight@1.0.1: + resolution: + { + integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, + } + peerDependencies: + bluebird: "*" + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: + { + integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, + } + engines: { node: ">=10" } + + prop-types@15.8.1: + resolution: + { + integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, + } + + property-information@6.5.0: + resolution: + { + integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==, + } + + proxy-addr@2.0.7: + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: ">= 0.10" } + + pump@2.0.1: + resolution: + { + integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==, + } + + pump@3.0.2: + resolution: + { + integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==, + } + + pumpify@1.5.1: + resolution: + { + integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==, + } + + punycode@2.3.1: + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } + + qs@6.13.0: + resolution: + { + integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==, + } + engines: { node: ">=0.6" } + + queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + range-parser@1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } + + raw-body@2.5.2: + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: ">= 0.8" } + + react-aiwriter@1.0.0: + resolution: + { + integrity: sha512-MxNAN3FUMNeHlbuPIiWFtXJlHBJx1+o5wKGtkmbmEywc7DjdjK6Xq1XVK3w+vBsuRARTACza3uxwsae1SqrAAw==, + } + + react-dom@18.3.1: + resolution: + { + integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==, + } + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: + { + integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, + } + + react-refresh@0.14.2: + resolution: + { + integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==, + } + engines: { node: ">=0.10.0" } + + react-remove-scroll-bar@2.3.8: + resolution: + { + integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==, + } + engines: { node: ">=10" } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + + react-remove-scroll@2.6.2: + resolution: + { + integrity: sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==, + } + engines: { node: ">=10" } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + react-router-dom@6.28.1: + resolution: + { + integrity: sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + + react-router@6.28.1: + resolution: + { + integrity: sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + react: ">=16.8" + + react-style-singleton@2.2.3: + resolution: + { + integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==, + } + engines: { node: ">=10" } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + react-textarea-autosize@8.5.6: + resolution: + { + integrity: sha512-aT3ioKXMa8f6zHYGebhbdMD2L00tKeRX1zuVuDx9YQK/JLLRSaSxq3ugECEmUB9z2kvk6bFSIoRHLkkUv0RJiw==, + } + engines: { node: ">=10" } + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react@18.3.1: + resolution: + { + integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==, + } + engines: { node: ">=0.10.0" } + + read-cache@1.0.0: + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } + + readable-stream@2.3.8: + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } + + readable-stream@3.6.2: + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } + + readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + + reflect.getprototypeof@1.0.10: + resolution: + { + integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, + } + engines: { node: ">= 0.4" } + + regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + + regexp.prototype.flags@1.5.4: + resolution: + { + integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, + } + engines: { node: ">= 0.4" } + + remark-frontmatter@4.0.1: + resolution: + { + integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==, + } + + remark-mdx-frontmatter@1.1.1: + resolution: + { + integrity: sha512-7teX9DW4tI2WZkXS4DBxneYSY7NHiXl4AKdWDO9LXVweULlCT8OPWsOjLEnMIXViN1j+QcY8mfbq3k0EK6x3uA==, + } + engines: { node: ">=12.2.0" } + + remark-mdx@2.3.0: + resolution: + { + integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==, + } + + remark-parse@10.0.2: + resolution: + { + integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==, + } + + remark-rehype@10.1.0: + resolution: + { + integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==, + } + + require-like@0.1.2: + resolution: + { + integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==, + } + + resolve-from@4.0.0: + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } + + resolve-pkg-maps@1.0.0: + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } + + resolve.exports@2.0.3: + resolution: + { + integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==, + } + engines: { node: ">=10" } + + resolve@1.22.10: + resolution: + { + integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==, + } + engines: { node: ">= 0.4" } + hasBin: true + + resolve@2.0.0-next.5: + resolution: + { + integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, + } + hasBin: true + + restore-cursor@3.1.0: + resolution: + { + integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, + } + engines: { node: ">=8" } + + retry@0.12.0: + resolution: + { + integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, + } + engines: { node: ">= 4" } + + reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + rollup@4.30.1: + resolution: + { + integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + + run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + + sade@1.8.1: + resolution: + { + integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, + } + engines: { node: ">=6" } + + safe-array-concat@1.1.3: + resolution: + { + integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, + } + engines: { node: ">=0.4" } + + safe-buffer@5.1.2: + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } + + safe-buffer@5.2.1: + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } + + safe-push-apply@1.0.0: + resolution: + { + integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, + } + engines: { node: ">= 0.4" } + + safe-regex-test@1.1.0: + resolution: + { + integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, + } + engines: { node: ">= 0.4" } + + safer-buffer@2.1.2: + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } + + scheduler@0.23.2: + resolution: + { + integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==, + } + + secure-json-parse@3.0.2: + resolution: + { + integrity: sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==, + } + + semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + + semver@7.6.3: + resolution: + { + integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==, + } + engines: { node: ">=10" } + hasBin: true + + send@0.19.0: + resolution: + { + integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==, + } + engines: { node: ">= 0.8.0" } + + serve-static@1.16.2: + resolution: + { + integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==, + } + engines: { node: ">= 0.8.0" } + + set-cookie-parser@2.7.1: + resolution: + { + integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==, + } + + set-function-length@1.2.2: + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } + + set-function-name@2.0.2: + resolution: + { + integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, + } + engines: { node: ">= 0.4" } + + set-proto@1.0.0: + resolution: + { + integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, + } + engines: { node: ">= 0.4" } + + setprototypeof@1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } + + shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + + shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + side-channel-list@1.0.0: + resolution: + { + integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + } + engines: { node: ">= 0.4" } + + side-channel-map@1.0.1: + resolution: + { + integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, + } + engines: { node: ">= 0.4" } + + side-channel-weakmap@1.0.2: + resolution: + { + integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, + } + engines: { node: ">= 0.4" } + + side-channel@1.1.0: + resolution: + { + integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + } + engines: { node: ">= 0.4" } + + signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + + slash@3.0.0: + resolution: + { + integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, + } + engines: { node: ">=8" } + + source-map-js@1.2.1: + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } + + source-map-support@0.5.21: + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } + + source-map@0.6.1: + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } + + source-map@0.7.4: + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: ">= 8" } + + space-separated-tokens@2.0.2: + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } + + spdx-correct@3.2.0: + resolution: + { + integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, + } + + spdx-exceptions@2.5.0: + resolution: + { + integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, + } + + spdx-expression-parse@3.0.1: + resolution: + { + integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, + } + + spdx-license-ids@3.0.20: + resolution: + { + integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==, + } + + ssri@10.0.6: + resolution: + { + integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + stable-hash@0.0.4: + resolution: + { + integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==, + } + + statuses@2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } + + stream-shift@1.0.3: + resolution: + { + integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==, + } + + stream-slice@0.1.2: + resolution: + { + integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==, + } + + string-hash@1.1.3: + resolution: + { + integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==, + } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + + string.prototype.includes@2.0.1: + resolution: + { + integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, + } + engines: { node: ">= 0.4" } + + string.prototype.matchall@4.0.12: + resolution: + { + integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, + } + engines: { node: ">= 0.4" } + + string.prototype.repeat@1.0.0: + resolution: + { + integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, + } + + string.prototype.trim@1.2.10: + resolution: + { + integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, + } + engines: { node: ">= 0.4" } + + string.prototype.trimend@1.0.9: + resolution: + { + integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, + } + engines: { node: ">= 0.4" } + + string.prototype.trimstart@1.0.8: + resolution: + { + integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, + } + engines: { node: ">= 0.4" } + + string_decoder@1.1.1: + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } + + string_decoder@1.3.0: + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } + + stringify-entities@4.0.4: + resolution: + { + integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, + } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + + strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + + strip-final-newline@2.0.0: + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } + + strip-json-comments@3.1.1: + resolution: + { + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, + } + engines: { node: ">=8" } + + style-to-object@0.4.4: + resolution: + { + integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==, + } + + sucrase@3.35.0: + resolution: + { + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, + } + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true + + supports-color@7.2.0: + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } + + supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + + tailwind-merge@2.6.0: + resolution: + { + integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==, + } + + tailwindcss-animate@1.0.7: + resolution: + { + integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==, + } + peerDependencies: + tailwindcss: ">=3.0.0 || insiders" + + tailwindcss@3.4.17: + resolution: + { + integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==, + } + engines: { node: ">=14.0.0" } + hasBin: true + + tapable@2.2.1: + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: ">=6" } + + tar-fs@2.1.1: + resolution: + { + integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, + } + + tar-stream@2.2.0: + resolution: + { + integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, + } + engines: { node: ">=6" } + + tar@6.2.1: + resolution: + { + integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==, + } + engines: { node: ">=10" } + + thenify-all@1.6.0: + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } + + thenify@3.3.1: + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + + through2@2.0.5: + resolution: + { + integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, + } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + + toidentifier@1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } + + toml@3.0.0: + resolution: + { + integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==, + } + + trim-lines@3.0.1: + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } + + trough@2.2.0: + resolution: + { + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, + } + + ts-api-utils@1.4.3: + resolution: + { + integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==, + } + engines: { node: ">=16" } + peerDependencies: + typescript: ">=4.2.0" + + ts-api-utils@2.0.0: + resolution: + { + integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==, + } + engines: { node: ">=18.12" } + peerDependencies: + typescript: ">=4.8.4" + + ts-interface-checker@0.1.13: + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } + + tsconfck@3.1.4: + resolution: + { + integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==, + } + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@3.15.0: + resolution: + { + integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, + } + + tsconfig-paths@4.2.0: + resolution: + { + integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, + } + engines: { node: ">=6" } + + tslib@2.8.1: + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } + + turbo-stream@2.4.0: + resolution: + { + integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==, + } + + type-check@0.4.0: + resolution: + { + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, + } + engines: { node: ">= 0.8.0" } + + type-is@1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: ">= 0.6" } + + typed-array-buffer@1.0.3: + resolution: + { + integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, + } + engines: { node: ">= 0.4" } + + typed-array-byte-length@1.0.3: + resolution: + { + integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, + } + engines: { node: ">= 0.4" } + + typed-array-byte-offset@1.0.4: + resolution: + { + integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, + } + engines: { node: ">= 0.4" } + + typed-array-length@1.0.7: + resolution: + { + integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, + } + engines: { node: ">= 0.4" } + + typescript-eslint@8.19.1: + resolution: + { + integrity: sha512-LKPUQpdEMVOeKluHi8md7rwLcoXHhwvWp3x+sJkMuq3gGm9yaYJtPo8sRZSblMFJ5pcOGCAak/scKf1mvZDlQw==, + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.8.0" + + typescript@5.6.3: + resolution: + { + integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==, + } + engines: { node: ">=14.17" } + hasBin: true + + ufo@1.5.4: + resolution: + { + integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==, + } + + unbox-primitive@1.1.0: + resolution: + { + integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, + } + engines: { node: ">= 0.4" } + + undici-types@6.20.0: + resolution: + { + integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, + } + + undici@6.21.0: + resolution: + { + integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==, + } + engines: { node: ">=18.17" } + + unified@10.1.2: + resolution: + { + integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==, + } + + unique-filename@3.0.0: + resolution: + { + integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + unique-slug@4.0.0: + resolution: + { + integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + unist-util-generated@2.0.1: + resolution: + { + integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==, + } + + unist-util-is@5.2.1: + resolution: + { + integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==, + } + + unist-util-position-from-estree@1.1.2: + resolution: + { + integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==, + } + + unist-util-position@4.0.4: + resolution: + { + integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==, + } + + unist-util-remove-position@4.0.2: + resolution: + { + integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==, + } + + unist-util-stringify-position@3.0.3: + resolution: + { + integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==, + } + + unist-util-visit-parents@5.1.3: + resolution: + { + integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==, + } + + unist-util-visit@4.1.2: + resolution: + { + integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==, + } + + universalify@2.0.1: + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: ">= 10.0.0" } + + unpipe@1.0.0: + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } + + update-browserslist-db@1.1.1: + resolution: + { + integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + + uri-js@4.4.1: + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } + + use-callback-ref@1.3.3: + resolution: + { + integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==, + } + engines: { node: ">=10" } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + use-composed-ref@1.4.0: + resolution: + { + integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + + use-isomorphic-layout-effect@1.2.0: + resolution: + { + integrity: sha512-q6ayo8DWoPZT0VdG4u3D3uxcgONP3Mevx2i2b0434cwWBoL+aelL1DzkXI6w3PhTZzUeR2kaVlZn70iCiseP6w==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + + use-latest@1.3.0: + resolution: + { + integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==, + } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + "@types/react": + optional: true + + use-sidecar@1.1.3: + resolution: + { + integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==, + } + engines: { node: ">=10" } + peerDependencies: + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + + use-sound@4.0.3: + resolution: + { + integrity: sha512-L205pEUFIrLsGYsCUKHQVCt0ajs//YQOFbEQeNwaWaqQj3y3st4SuR+rvpMHLmv8hgTcfUFlvMQawZNI3OE18w==, + } + peerDependencies: + react: ">=16.8" + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + util@0.12.5: + resolution: + { + integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==, + } + + utils-merge@1.0.1: + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: ">= 0.4.0" } + + uvu@0.5.6: + resolution: + { + integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==, + } + engines: { node: ">=8" } + hasBin: true + + valibot@0.41.0: + resolution: + { + integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==, + } + peerDependencies: + typescript: ">=5" + peerDependenciesMeta: + typescript: + optional: true + + validate-npm-package-license@3.0.4: + resolution: + { + integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, + } + + validate-npm-package-name@5.0.1: + resolution: + { + integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + vary@1.1.2: + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: ">= 0.8" } + + vfile-message@3.1.4: + resolution: + { + integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, + } + + vfile@5.3.7: + resolution: + { + integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==, + } + + vite-node@1.6.0: + resolution: + { + integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + + vite-tsconfig-paths@4.3.2: + resolution: + { + integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==, + } + peerDependencies: + vite: "*" + peerDependenciesMeta: + vite: + optional: true + + vite@5.4.11: + resolution: + { + integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@6.0.7: + resolution: + { + integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==, + } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + "@types/node": + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + wcwidth@1.0.1: + resolution: + { + integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, + } + + web-encoding@1.1.5: + resolution: + { + integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==, + } + + web-streams-polyfill@3.3.3: + resolution: + { + integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==, + } + engines: { node: ">= 8" } + + which-boxed-primitive@1.1.1: + resolution: + { + integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, + } + engines: { node: ">= 0.4" } + + which-builtin-type@1.2.1: + resolution: + { + integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, + } + engines: { node: ">= 0.4" } + + which-collection@1.0.2: + resolution: + { + integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, + } + engines: { node: ">= 0.4" } + + which-typed-array@1.1.18: + resolution: + { + integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==, + } + engines: { node: ">= 0.4" } + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + + which@3.0.1: + resolution: + { + integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==, + } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + hasBin: true + + word-wrap@1.2.5: + resolution: + { + integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, + } + engines: { node: ">=0.10.0" } + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + + wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + ws@7.5.10: + resolution: + { + integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, + } + engines: { node: ">=8.3.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xtend@4.0.2: + resolution: + { + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, + } + engines: { node: ">=0.4" } + + yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + + yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + yaml@2.7.0: + resolution: + { + integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==, + } + engines: { node: ">= 14" } + hasBin: true + + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + zod-to-json-schema@3.24.1: + resolution: + { + integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==, + } + peerDependencies: + zod: ^3.24.1 + + zod@3.24.1: + resolution: + { + integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==, + } + + zustand@5.0.3: + resolution: + { + integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==, + } + engines: { node: ">=12.20.0" } + peerDependencies: + "@types/react": ">=18.0.0" + immer: ">=9.0.6" + react: ">=18.0.0" + use-sync-external-store: ">=1.2.0" + peerDependenciesMeta: + "@types/react": + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + + zwitch@2.0.4: + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } + +snapshots: + "@ai-sdk/provider@1.0.6": + dependencies: + json-schema: 0.4.0 + + "@alloc/quick-lru@5.2.0": {} + + "@ampproject/remapping@2.3.0": + dependencies: + "@jridgewell/gen-mapping": 0.3.8 + "@jridgewell/trace-mapping": 0.3.25 + + "@assistant-ui/react@0.7.33(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.17)": + dependencies: + "@ai-sdk/provider": 1.0.6 + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-avatar": 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-dialog": 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-popover": 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-tooltip": 1.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-escape-keydown": 1.1.0(@types/react@18.3.18)(react@18.3.1) + class-variance-authority: 0.7.1 + classnames: 2.5.1 + json-schema: 0.4.0 + lucide-react: 0.469.0(react@18.3.1) + nanoid: 5.0.9 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-textarea-autosize: 8.5.6(@types/react@18.3.18)(react@18.3.1) + secure-json-parse: 3.0.2 + zod: 3.24.1 + zod-to-json-schema: 3.24.1(zod@3.24.1) + zustand: 5.0.3(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + tailwindcss: 3.4.17 + transitivePeerDependencies: + - immer + - use-sync-external-store + + "@babel/code-frame@7.26.2": + dependencies: + "@babel/helper-validator-identifier": 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + "@babel/compat-data@7.26.3": {} + + "@babel/core@7.26.0": + dependencies: + "@ampproject/remapping": 2.3.0 + "@babel/code-frame": 7.26.2 + "@babel/generator": 7.26.3 + "@babel/helper-compilation-targets": 7.25.9 + "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) + "@babel/helpers": 7.26.0 + "@babel/parser": 7.26.3 + "@babel/template": 7.25.9 + "@babel/traverse": 7.26.4 + "@babel/types": 7.26.3 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + "@babel/generator@7.26.3": + dependencies: + "@babel/parser": 7.26.3 + "@babel/types": 7.26.3 + "@jridgewell/gen-mapping": 0.3.8 + "@jridgewell/trace-mapping": 0.3.25 + jsesc: 3.0.2 + + "@babel/helper-annotate-as-pure@7.25.9": + dependencies: + "@babel/types": 7.26.3 + + "@babel/helper-compilation-targets@7.25.9": + dependencies: + "@babel/compat-data": 7.26.3 + "@babel/helper-validator-option": 7.25.9 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + "@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-annotate-as-pure": 7.25.9 + "@babel/helper-member-expression-to-functions": 7.25.9 + "@babel/helper-optimise-call-expression": 7.25.9 + "@babel/helper-replace-supers": 7.25.9(@babel/core@7.26.0) + "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 + "@babel/traverse": 7.26.4 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + "@babel/helper-member-expression-to-functions@7.25.9": + dependencies: + "@babel/traverse": 7.26.4 + "@babel/types": 7.26.3 + transitivePeerDependencies: + - supports-color + + "@babel/helper-module-imports@7.25.9": + dependencies: + "@babel/traverse": 7.26.4 + "@babel/types": 7.26.3 + transitivePeerDependencies: + - supports-color + + "@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-module-imports": 7.25.9 + "@babel/helper-validator-identifier": 7.25.9 + "@babel/traverse": 7.26.4 + transitivePeerDependencies: + - supports-color + + "@babel/helper-optimise-call-expression@7.25.9": + dependencies: + "@babel/types": 7.26.3 + + "@babel/helper-plugin-utils@7.25.9": {} + + "@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-member-expression-to-functions": 7.25.9 + "@babel/helper-optimise-call-expression": 7.25.9 + "@babel/traverse": 7.26.4 + transitivePeerDependencies: + - supports-color + + "@babel/helper-skip-transparent-expression-wrappers@7.25.9": + dependencies: + "@babel/traverse": 7.26.4 + "@babel/types": 7.26.3 + transitivePeerDependencies: + - supports-color + + "@babel/helper-string-parser@7.25.9": {} + + "@babel/helper-validator-identifier@7.25.9": {} + + "@babel/helper-validator-option@7.25.9": {} + + "@babel/helpers@7.26.0": + dependencies: + "@babel/template": 7.25.9 + "@babel/types": 7.26.3 + + "@babel/parser@7.26.3": + dependencies: + "@babel/types": 7.26.3 + + "@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + + "@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-module-transforms": 7.26.0(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + transitivePeerDependencies: + - supports-color + + "@babel/plugin-transform-typescript@7.26.3(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-annotate-as-pure": 7.25.9 + "@babel/helper-create-class-features-plugin": 7.25.9(@babel/core@7.26.0) + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-skip-transparent-expression-wrappers": 7.25.9 + "@babel/plugin-syntax-typescript": 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + "@babel/preset-typescript@7.26.0(@babel/core@7.26.0)": + dependencies: + "@babel/core": 7.26.0 + "@babel/helper-plugin-utils": 7.25.9 + "@babel/helper-validator-option": 7.25.9 + "@babel/plugin-syntax-jsx": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-transform-modules-commonjs": 7.26.3(@babel/core@7.26.0) + "@babel/plugin-transform-typescript": 7.26.3(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + "@babel/runtime@7.26.0": + dependencies: + regenerator-runtime: 0.14.1 + + "@babel/template@7.25.9": + dependencies: + "@babel/code-frame": 7.26.2 + "@babel/parser": 7.26.3 + "@babel/types": 7.26.3 + + "@babel/traverse@7.26.4": + dependencies: + "@babel/code-frame": 7.26.2 + "@babel/generator": 7.26.3 + "@babel/parser": 7.26.3 + "@babel/template": 7.25.9 + "@babel/types": 7.26.3 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + "@babel/types@7.26.3": + dependencies: + "@babel/helper-string-parser": 7.25.9 + "@babel/helper-validator-identifier": 7.25.9 + + "@emotion/hash@0.9.2": {} + + "@esbuild/aix-ppc64@0.21.5": + optional: true + + "@esbuild/aix-ppc64@0.24.2": + optional: true + + "@esbuild/android-arm64@0.17.6": + optional: true + + "@esbuild/android-arm64@0.21.5": + optional: true + + "@esbuild/android-arm64@0.24.2": + optional: true + + "@esbuild/android-arm@0.17.6": + optional: true + + "@esbuild/android-arm@0.21.5": + optional: true + + "@esbuild/android-arm@0.24.2": + optional: true + + "@esbuild/android-x64@0.17.6": + optional: true + + "@esbuild/android-x64@0.21.5": + optional: true + + "@esbuild/android-x64@0.24.2": + optional: true + + "@esbuild/darwin-arm64@0.17.6": + optional: true + + "@esbuild/darwin-arm64@0.21.5": + optional: true + + "@esbuild/darwin-arm64@0.24.2": + optional: true + + "@esbuild/darwin-x64@0.17.6": + optional: true + + "@esbuild/darwin-x64@0.21.5": + optional: true + + "@esbuild/darwin-x64@0.24.2": + optional: true + + "@esbuild/freebsd-arm64@0.17.6": + optional: true + + "@esbuild/freebsd-arm64@0.21.5": + optional: true + + "@esbuild/freebsd-arm64@0.24.2": + optional: true + + "@esbuild/freebsd-x64@0.17.6": + optional: true + + "@esbuild/freebsd-x64@0.21.5": + optional: true + + "@esbuild/freebsd-x64@0.24.2": + optional: true + + "@esbuild/linux-arm64@0.17.6": + optional: true + + "@esbuild/linux-arm64@0.21.5": + optional: true + + "@esbuild/linux-arm64@0.24.2": + optional: true + + "@esbuild/linux-arm@0.17.6": + optional: true + + "@esbuild/linux-arm@0.21.5": + optional: true + + "@esbuild/linux-arm@0.24.2": + optional: true + + "@esbuild/linux-ia32@0.17.6": + optional: true + + "@esbuild/linux-ia32@0.21.5": + optional: true + + "@esbuild/linux-ia32@0.24.2": + optional: true + + "@esbuild/linux-loong64@0.17.6": + optional: true + + "@esbuild/linux-loong64@0.21.5": + optional: true + + "@esbuild/linux-loong64@0.24.2": + optional: true + + "@esbuild/linux-mips64el@0.17.6": + optional: true + + "@esbuild/linux-mips64el@0.21.5": + optional: true + + "@esbuild/linux-mips64el@0.24.2": + optional: true + + "@esbuild/linux-ppc64@0.17.6": + optional: true + + "@esbuild/linux-ppc64@0.21.5": + optional: true + + "@esbuild/linux-ppc64@0.24.2": + optional: true + + "@esbuild/linux-riscv64@0.17.6": + optional: true + + "@esbuild/linux-riscv64@0.21.5": + optional: true + + "@esbuild/linux-riscv64@0.24.2": + optional: true + + "@esbuild/linux-s390x@0.17.6": + optional: true + + "@esbuild/linux-s390x@0.21.5": + optional: true + + "@esbuild/linux-s390x@0.24.2": + optional: true + + "@esbuild/linux-x64@0.17.6": + optional: true + + "@esbuild/linux-x64@0.21.5": + optional: true + + "@esbuild/linux-x64@0.24.2": + optional: true + + "@esbuild/netbsd-arm64@0.24.2": + optional: true + + "@esbuild/netbsd-x64@0.17.6": + optional: true + + "@esbuild/netbsd-x64@0.21.5": + optional: true + + "@esbuild/netbsd-x64@0.24.2": + optional: true + + "@esbuild/openbsd-arm64@0.24.2": + optional: true + + "@esbuild/openbsd-x64@0.17.6": + optional: true + + "@esbuild/openbsd-x64@0.21.5": + optional: true + + "@esbuild/openbsd-x64@0.24.2": + optional: true + + "@esbuild/sunos-x64@0.17.6": + optional: true + + "@esbuild/sunos-x64@0.21.5": + optional: true + + "@esbuild/sunos-x64@0.24.2": + optional: true + + "@esbuild/win32-arm64@0.17.6": + optional: true + + "@esbuild/win32-arm64@0.21.5": + optional: true + + "@esbuild/win32-arm64@0.24.2": + optional: true + + "@esbuild/win32-ia32@0.17.6": + optional: true + + "@esbuild/win32-ia32@0.21.5": + optional: true + + "@esbuild/win32-ia32@0.24.2": + optional: true + + "@esbuild/win32-x64@0.17.6": + optional: true + + "@esbuild/win32-x64@0.21.5": + optional: true + + "@esbuild/win32-x64@0.24.2": + optional: true + + "@eslint-community/eslint-utils@4.4.1(eslint@9.17.0(jiti@1.21.7))": + dependencies: + eslint: 9.17.0(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + "@eslint-community/regexpp@4.12.1": {} + + "@eslint/config-array@0.19.1": + dependencies: + "@eslint/object-schema": 2.1.5 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + "@eslint/core@0.9.1": + dependencies: + "@types/json-schema": 7.0.15 + + "@eslint/eslintrc@3.2.0": + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + "@eslint/js@9.17.0": {} + + "@eslint/object-schema@2.1.5": {} + + "@eslint/plugin-kit@0.2.4": + dependencies: + levn: 0.4.1 + + "@floating-ui/core@1.6.9": + dependencies: + "@floating-ui/utils": 0.2.9 + + "@floating-ui/dom@1.6.13": + dependencies: + "@floating-ui/core": 1.6.9 + "@floating-ui/utils": 0.2.9 + + "@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@floating-ui/dom": 1.6.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + "@floating-ui/utils@0.2.9": {} + + "@humanfs/core@0.19.1": {} + + "@humanfs/node@0.16.6": + dependencies: + "@humanfs/core": 0.19.1 + "@humanwhocodes/retry": 0.3.1 + + "@humanwhocodes/module-importer@1.0.1": {} + + "@humanwhocodes/retry@0.3.1": {} + + "@humanwhocodes/retry@0.4.1": {} + + "@isaacs/cliui@8.0.2": + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + "@jridgewell/gen-mapping@0.3.8": + dependencies: + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/trace-mapping": 0.3.25 + + "@jridgewell/resolve-uri@3.1.2": {} + + "@jridgewell/set-array@1.2.1": {} + + "@jridgewell/sourcemap-codec@1.5.0": {} + + "@jridgewell/trace-mapping@0.3.25": + dependencies: + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.5.0 + + "@jspm/core@2.0.1": {} + + "@mdx-js/mdx@2.3.0": + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/mdx": 2.0.13 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + + "@nodelib/fs.scandir@2.1.5": + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + "@nodelib/fs.stat@2.0.5": {} + + "@nodelib/fs.walk@1.2.8": + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.18.0 + + "@nolyfill/is-core-module@1.0.39": {} + + "@npmcli/fs@3.1.1": + dependencies: + semver: 7.6.3 + + "@npmcli/git@4.1.0": + dependencies: + "@npmcli/promise-spawn": 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.3 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + + "@npmcli/package-json@4.0.1": + dependencies: + "@npmcli/git": 4.1.0 + glob: 10.4.5 + hosted-git-info: 6.1.3 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 5.0.0 + proc-log: 3.0.0 + semver: 7.6.3 + transitivePeerDependencies: + - bluebird + + "@npmcli/promise-spawn@6.0.2": + dependencies: + which: 3.0.1 + + "@pkgjs/parseargs@0.11.0": + optional: true + + "@radix-ui/primitive@1.1.1": {} + + "@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-avatar@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-collapsible@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-id": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-presence": 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-collection@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-dialog@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-portal": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.1.0(@types/react@18.3.18)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-direction@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-escape-keydown": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-label@2.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-popover@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-focus-guards": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-focus-scope": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-popper": 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.1.0(@types/react@18.3.18)(react@18.3.1) + aria-hidden: 1.2.4 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-remove-scroll: 2.6.2(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@floating-ui/react-dom": 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-arrow": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-rect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-size": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/rect": 1.1.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-slot": 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-roving-focus@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-collection": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-direction": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-id": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-separator@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-slot@1.1.1(@types/react@18.3.18)(react@18.3.1)": + dependencies: + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-tabs@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-direction": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-id": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-presence": 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-roving-focus": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-toast@1.2.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-collection": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-tooltip@1.1.6(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/primitive": 1.1.1 + "@radix-ui/react-compose-refs": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-context": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-dismissable-layer": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-id": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-popper": 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-portal": 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-presence": 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + "@radix-ui/react-slot": 1.1.1(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-use-controllable-state": 1.1.0(@types/react@18.3.18)(react@18.3.1) + "@radix-ui/react-visually-hidden": 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-callback-ref": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + "@radix-ui/rect": 1.1.0 + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.3.1)": + dependencies: + "@radix-ui/react-use-layout-effect": 1.1.0(@types/react@18.3.18)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + "@radix-ui/react-visually-hidden@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)": + dependencies: + "@radix-ui/react-primitive": 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + "@types/react-dom": 18.3.5(@types/react@18.3.18) + + "@radix-ui/rect@1.1.0": {} + + "@remix-run/dev@2.15.2(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@remix-run/serve@2.15.2(typescript@5.6.3))(@types/node@22.10.5)(typescript@5.6.3)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))": + dependencies: + "@babel/core": 7.26.0 + "@babel/generator": 7.26.3 + "@babel/parser": 7.26.3 + "@babel/plugin-syntax-decorators": 7.25.9(@babel/core@7.26.0) + "@babel/plugin-syntax-jsx": 7.25.9(@babel/core@7.26.0) + "@babel/preset-typescript": 7.26.0(@babel/core@7.26.0) + "@babel/traverse": 7.26.4 + "@babel/types": 7.26.3 + "@mdx-js/mdx": 2.3.0 + "@npmcli/package-json": 4.0.1 + "@remix-run/node": 2.15.2(typescript@5.6.3) + "@remix-run/react": 2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + "@remix-run/router": 1.21.0 + "@remix-run/server-runtime": 2.15.2(typescript@5.6.3) + "@types/mdx": 2.0.13 + "@vanilla-extract/integration": 6.5.0(@types/node@22.10.5) + arg: 5.0.2 + cacache: 17.1.4 + chalk: 4.1.2 + chokidar: 3.6.0 + cross-spawn: 7.0.6 + dotenv: 16.4.7 + es-module-lexer: 1.6.0 + esbuild: 0.17.6 + esbuild-plugins-node-modules-polyfill: 1.6.8(esbuild@0.17.6) + execa: 5.1.1 + exit-hook: 2.2.1 + express: 4.21.2 + fs-extra: 10.1.0 + get-port: 5.1.1 + gunzip-maybe: 1.4.2 + jsesc: 3.0.2 + json5: 2.2.3 + lodash: 4.17.21 + lodash.debounce: 4.0.8 + minimatch: 9.0.5 + ora: 5.4.1 + picocolors: 1.1.1 + picomatch: 2.3.1 + pidtree: 0.6.0 + postcss: 8.4.49 + postcss-discard-duplicates: 5.1.0(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-modules: 6.0.1(postcss@8.4.49) + prettier: 2.8.8 + pretty-ms: 7.0.1 + react-refresh: 0.14.2 + remark-frontmatter: 4.0.1 + remark-mdx-frontmatter: 1.1.1 + semver: 7.6.3 + set-cookie-parser: 2.7.1 + tar-fs: 2.1.1 + tsconfig-paths: 4.2.0 + valibot: 0.41.0(typescript@5.6.3) + vite-node: 1.6.0(@types/node@22.10.5) + ws: 7.5.10 + optionalDependencies: + "@remix-run/serve": 2.15.2(typescript@5.6.3) + typescript: 5.6.3 + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - bluebird + - bufferutil + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - ts-node + - utf-8-validate + + "@remix-run/express@2.15.2(express@4.21.2)(typescript@5.6.3)": + dependencies: + "@remix-run/node": 2.15.2(typescript@5.6.3) + express: 4.21.2 + optionalDependencies: + typescript: 5.6.3 + + "@remix-run/node@2.15.2(typescript@5.6.3)": + dependencies: + "@remix-run/server-runtime": 2.15.2(typescript@5.6.3) + "@remix-run/web-fetch": 4.4.2 + "@web3-storage/multipart-parser": 1.0.0 + cookie-signature: 1.2.2 + source-map-support: 0.5.21 + stream-slice: 0.1.2 + undici: 6.21.0 + optionalDependencies: + typescript: 5.6.3 + + "@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)": + dependencies: + "@remix-run/router": 1.21.0 + "@remix-run/server-runtime": 2.15.2(typescript@5.6.3) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.28.1(react@18.3.1) + react-router-dom: 6.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + turbo-stream: 2.4.0 + optionalDependencies: + typescript: 5.6.3 + + "@remix-run/router@1.21.0": {} + + "@remix-run/serve@2.15.2(typescript@5.6.3)": + dependencies: + "@remix-run/express": 2.15.2(express@4.21.2)(typescript@5.6.3) + "@remix-run/node": 2.15.2(typescript@5.6.3) + chokidar: 3.6.0 + compression: 1.7.5 + express: 4.21.2 + get-port: 5.1.1 + morgan: 1.10.0 + source-map-support: 0.5.21 + transitivePeerDependencies: + - supports-color + - typescript + + "@remix-run/server-runtime@2.15.2(typescript@5.6.3)": + dependencies: + "@remix-run/router": 1.21.0 + "@types/cookie": 0.6.0 + "@web3-storage/multipart-parser": 1.0.0 + cookie: 0.6.0 + set-cookie-parser: 2.7.1 + source-map: 0.7.4 + turbo-stream: 2.4.0 + optionalDependencies: + typescript: 5.6.3 + + "@remix-run/web-blob@3.1.0": + dependencies: + "@remix-run/web-stream": 1.1.0 + web-encoding: 1.1.5 + + "@remix-run/web-fetch@4.4.2": + dependencies: + "@remix-run/web-blob": 3.1.0 + "@remix-run/web-file": 3.1.0 + "@remix-run/web-form-data": 3.1.0 + "@remix-run/web-stream": 1.1.0 + "@web3-storage/multipart-parser": 1.0.0 + abort-controller: 3.0.0 + data-uri-to-buffer: 3.0.1 + mrmime: 1.0.1 + + "@remix-run/web-file@3.1.0": + dependencies: + "@remix-run/web-blob": 3.1.0 + + "@remix-run/web-form-data@3.1.0": + dependencies: + web-encoding: 1.1.5 + + "@remix-run/web-stream@1.1.0": + dependencies: + web-streams-polyfill: 3.3.3 + + "@rollup/rollup-android-arm-eabi@4.30.1": + optional: true + + "@rollup/rollup-android-arm64@4.30.1": + optional: true + + "@rollup/rollup-darwin-arm64@4.30.1": + optional: true + + "@rollup/rollup-darwin-x64@4.30.1": + optional: true + + "@rollup/rollup-freebsd-arm64@4.30.1": + optional: true + + "@rollup/rollup-freebsd-x64@4.30.1": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.30.1": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.30.1": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.30.1": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.30.1": + optional: true + + "@rollup/rollup-linux-loongarch64-gnu@4.30.1": + optional: true + + "@rollup/rollup-linux-powerpc64le-gnu@4.30.1": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.30.1": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.30.1": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.30.1": + optional: true + + "@rollup/rollup-linux-x64-musl@4.30.1": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.30.1": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.30.1": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.30.1": + optional: true + + "@rtsao/scc@1.1.0": {} + + "@swc/core-darwin-arm64@1.10.6": + optional: true + + "@swc/core-darwin-x64@1.10.6": + optional: true + + "@swc/core-linux-arm-gnueabihf@1.10.6": + optional: true + + "@swc/core-linux-arm64-gnu@1.10.6": + optional: true + + "@swc/core-linux-arm64-musl@1.10.6": + optional: true + + "@swc/core-linux-x64-gnu@1.10.6": + optional: true + + "@swc/core-linux-x64-musl@1.10.6": + optional: true + + "@swc/core-win32-arm64-msvc@1.10.6": + optional: true + + "@swc/core-win32-ia32-msvc@1.10.6": + optional: true + + "@swc/core-win32-x64-msvc@1.10.6": + optional: true + + "@swc/core@1.10.6": + dependencies: + "@swc/counter": 0.1.3 + "@swc/types": 0.1.17 + optionalDependencies: + "@swc/core-darwin-arm64": 1.10.6 + "@swc/core-darwin-x64": 1.10.6 + "@swc/core-linux-arm-gnueabihf": 1.10.6 + "@swc/core-linux-arm64-gnu": 1.10.6 + "@swc/core-linux-arm64-musl": 1.10.6 + "@swc/core-linux-x64-gnu": 1.10.6 + "@swc/core-linux-x64-musl": 1.10.6 + "@swc/core-win32-arm64-msvc": 1.10.6 + "@swc/core-win32-ia32-msvc": 1.10.6 + "@swc/core-win32-x64-msvc": 1.10.6 + + "@swc/counter@0.1.3": {} + + "@swc/types@0.1.17": + dependencies: + "@swc/counter": 0.1.3 + + "@tanstack/query-core@5.62.16": {} + + "@tanstack/react-query@5.62.16(react@18.3.1)": + dependencies: + "@tanstack/query-core": 5.62.16 + react: 18.3.1 + + "@types/acorn@4.0.6": + dependencies: + "@types/estree": 1.0.6 + + "@types/cookie@0.6.0": {} + + "@types/debug@4.1.12": + dependencies: + "@types/ms": 0.7.34 + + "@types/estree-jsx@1.0.5": + dependencies: + "@types/estree": 1.0.6 + + "@types/estree@1.0.6": {} + + "@types/hast@2.3.10": + dependencies: + "@types/unist": 2.0.11 + + "@types/json-schema@7.0.15": {} + + "@types/json5@0.0.29": {} + + "@types/mdast@3.0.15": + dependencies: + "@types/unist": 2.0.11 + + "@types/mdx@2.0.13": {} + + "@types/ms@0.7.34": {} + + "@types/node@22.10.5": + dependencies: + undici-types: 6.20.0 + + "@types/prop-types@15.7.14": {} + + "@types/react-dom@18.3.5(@types/react@18.3.18)": + dependencies: + "@types/react": 18.3.18 + + "@types/react@18.3.18": + dependencies: + "@types/prop-types": 15.7.14 + csstype: 3.1.3 + + "@types/semver@7.5.8": {} + + "@types/unist@2.0.11": {} + + "@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@eslint-community/regexpp": 4.12.1 + "@typescript-eslint/parser": 6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/utils": 6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/visitor-keys": 6.21.0 + debug: 4.4.0 + eslint: 9.17.0(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/eslint-plugin@8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@eslint-community/regexpp": 4.12.1 + "@typescript-eslint/parser": 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/scope-manager": 8.19.1 + "@typescript-eslint/type-utils": 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/utils": 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/visitor-keys": 8.19.1 + eslint: 9.17.0(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.6.3) + "@typescript-eslint/visitor-keys": 6.21.0 + debug: 4.4.0 + eslint: 9.17.0(jiti@1.21.7) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@typescript-eslint/scope-manager": 8.19.1 + "@typescript-eslint/types": 8.19.1 + "@typescript-eslint/typescript-estree": 8.19.1(typescript@5.6.3) + "@typescript-eslint/visitor-keys": 8.19.1 + debug: 4.4.0 + eslint: 9.17.0(jiti@1.21.7) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/scope-manager@6.21.0": + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + + "@typescript-eslint/scope-manager@8.19.1": + dependencies: + "@typescript-eslint/types": 8.19.1 + "@typescript-eslint/visitor-keys": 8.19.1 + + "@typescript-eslint/type-utils@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.6.3) + "@typescript-eslint/utils": 6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + debug: 4.4.0 + eslint: 9.17.0(jiti@1.21.7) + ts-api-utils: 1.4.3(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/type-utils@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@typescript-eslint/typescript-estree": 8.19.1(typescript@5.6.3) + "@typescript-eslint/utils": 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + debug: 4.4.0 + eslint: 9.17.0(jiti@1.21.7) + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/types@6.21.0": {} + + "@typescript-eslint/types@8.19.1": {} + + "@typescript-eslint/typescript-estree@6.21.0(typescript@5.6.3)": + dependencies: + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/typescript-estree@8.19.1(typescript@5.6.3)": + dependencies: + "@typescript-eslint/types": 8.19.1 + "@typescript-eslint/visitor-keys": 8.19.1 + debug: 4.4.0 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/utils@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@eslint-community/eslint-utils": 4.4.1(eslint@9.17.0(jiti@1.21.7)) + "@types/json-schema": 7.0.15 + "@types/semver": 7.5.8 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0(typescript@5.6.3) + eslint: 9.17.0(jiti@1.21.7) + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + "@typescript-eslint/utils@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3)": + dependencies: + "@eslint-community/eslint-utils": 4.4.1(eslint@9.17.0(jiti@1.21.7)) + "@typescript-eslint/scope-manager": 8.19.1 + "@typescript-eslint/types": 8.19.1 + "@typescript-eslint/typescript-estree": 8.19.1(typescript@5.6.3) + eslint: 9.17.0(jiti@1.21.7) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + "@typescript-eslint/visitor-keys@6.21.0": + dependencies: + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: 3.4.3 + + "@typescript-eslint/visitor-keys@8.19.1": + dependencies: + "@typescript-eslint/types": 8.19.1 + eslint-visitor-keys: 4.2.0 + + "@vanilla-extract/babel-plugin-debug-ids@1.2.0": + dependencies: + "@babel/core": 7.26.0 + transitivePeerDependencies: + - supports-color + + "@vanilla-extract/css@1.17.0": + dependencies: + "@emotion/hash": 0.9.2 + "@vanilla-extract/private": 1.0.6 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + dedent: 1.5.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + lru-cache: 10.4.3 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.1.0 + picocolors: 1.1.1 + transitivePeerDependencies: + - babel-plugin-macros + + "@vanilla-extract/integration@6.5.0(@types/node@22.10.5)": + dependencies: + "@babel/core": 7.26.0 + "@babel/plugin-syntax-typescript": 7.25.9(@babel/core@7.26.0) + "@vanilla-extract/babel-plugin-debug-ids": 1.2.0 + "@vanilla-extract/css": 1.17.0 + esbuild: 0.17.6 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + lodash: 4.17.21 + mlly: 1.7.3 + outdent: 0.8.0 + vite: 5.4.11(@types/node@22.10.5) + vite-node: 1.6.0(@types/node@22.10.5) + transitivePeerDependencies: + - "@types/node" + - babel-plugin-macros + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + "@vanilla-extract/private@1.0.6": {} + + "@vitejs/plugin-react-swc@3.7.2(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0))": + dependencies: + "@swc/core": 1.10.6 + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0) + transitivePeerDependencies: + - "@swc/helpers" + + "@web3-storage/multipart-parser@1.0.0": {} + + "@zxing/text-encoding@0.9.0": + optional: true + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@8.14.0: {} + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + is-array-buffer: 3.0.5 + + array-flatten@1.1.1: {} + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.7 + is-string: 1.1.1 + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 + + ast-types-flow@0.0.8: {} + + astring@1.9.0: {} + + autoprefixer@10.4.20(postcss@8.4.49): + dependencies: + browserslist: 4.24.3 + caniuse-lite: 1.0.30001690 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.10.2: {} + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.78 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + cac@6.7.14: {} + + cacache@17.1.4: + dependencies: + "@npmcli/fs": 3.1.1 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 7.18.3 + minipass: 7.1.2 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001690: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + + classnames@2.5.1: {} + + clean-stack@2.2.0: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + clone@1.0.4: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.7.5: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie-signature@1.2.2: {} + + cookie@0.6.0: {} + + cookie@0.7.1: {} + + core-util-is@1.0.3: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + damerau-levenshtein@1.0.8: {} + + data-uri-to-buffer@3.0.1: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.13: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + dedent@1.5.3: {} + + deep-is@0.1.4: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-node-es@1.1.0: {} + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.78: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.18.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + err-code@2.0.3: {} + + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + esbuild-plugins-node-modules-polyfill@1.6.8(esbuild@0.17.6): + dependencies: + "@jspm/core": 2.0.1 + esbuild: 0.17.6 + local-pkg: 0.5.1 + resolve.exports: 2.0.3 + + esbuild@0.17.6: + optionalDependencies: + "@esbuild/android-arm": 0.17.6 + "@esbuild/android-arm64": 0.17.6 + "@esbuild/android-x64": 0.17.6 + "@esbuild/darwin-arm64": 0.17.6 + "@esbuild/darwin-x64": 0.17.6 + "@esbuild/freebsd-arm64": 0.17.6 + "@esbuild/freebsd-x64": 0.17.6 + "@esbuild/linux-arm": 0.17.6 + "@esbuild/linux-arm64": 0.17.6 + "@esbuild/linux-ia32": 0.17.6 + "@esbuild/linux-loong64": 0.17.6 + "@esbuild/linux-mips64el": 0.17.6 + "@esbuild/linux-ppc64": 0.17.6 + "@esbuild/linux-riscv64": 0.17.6 + "@esbuild/linux-s390x": 0.17.6 + "@esbuild/linux-x64": 0.17.6 + "@esbuild/netbsd-x64": 0.17.6 + "@esbuild/openbsd-x64": 0.17.6 + "@esbuild/sunos-x64": 0.17.6 + "@esbuild/win32-arm64": 0.17.6 + "@esbuild/win32-ia32": 0.17.6 + "@esbuild/win32-x64": 0.17.6 + + esbuild@0.21.5: + optionalDependencies: + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 + + esbuild@0.24.2: + optionalDependencies: + "@esbuild/aix-ppc64": 0.24.2 + "@esbuild/android-arm": 0.24.2 + "@esbuild/android-arm64": 0.24.2 + "@esbuild/android-x64": 0.24.2 + "@esbuild/darwin-arm64": 0.24.2 + "@esbuild/darwin-x64": 0.24.2 + "@esbuild/freebsd-arm64": 0.24.2 + "@esbuild/freebsd-x64": 0.24.2 + "@esbuild/linux-arm": 0.24.2 + "@esbuild/linux-arm64": 0.24.2 + "@esbuild/linux-ia32": 0.24.2 + "@esbuild/linux-loong64": 0.24.2 + "@esbuild/linux-mips64el": 0.24.2 + "@esbuild/linux-ppc64": 0.24.2 + "@esbuild/linux-riscv64": 0.24.2 + "@esbuild/linux-s390x": 0.24.2 + "@esbuild/linux-x64": 0.24.2 + "@esbuild/netbsd-arm64": 0.24.2 + "@esbuild/netbsd-x64": 0.24.2 + "@esbuild/openbsd-arm64": 0.24.2 + "@esbuild/openbsd-x64": 0.24.2 + "@esbuild/sunos-x64": 0.24.2 + "@esbuild/win32-arm64": 0.24.2 + "@esbuild/win32-ia32": 0.24.2 + "@esbuild/win32-x64": 0.24.2 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.7)): + dependencies: + "@nolyfill/is-core-module": 1.0.39 + debug: 4.4.0 + enhanced-resolve: 5.18.0 + eslint: 9.17.0(jiti@1.21.7) + fast-glob: 3.3.3 + get-tsconfig: 4.8.1 + is-bun-module: 1.3.0 + is-glob: 4.0.3 + stable-hash: 0.0.4 + optionalDependencies: + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.7)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.7)): + dependencies: + debug: 3.2.7 + optionalDependencies: + "@typescript-eslint/parser": 6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + eslint: 9.17.0(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.17.0(jiti@1.21.7)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.7)): + dependencies: + "@rtsao/scc": 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.17.0(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@9.17.0(jiti@1.21.7)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + "@typescript-eslint/parser": 6.21.0(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.17.0(jiti@1.21.7)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.10.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.17.0(jiti@1.21.7) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@5.1.0(eslint@9.17.0(jiti@1.21.7)): + dependencies: + eslint: 9.17.0(jiti@1.21.7) + + eslint-plugin-react-refresh@0.4.16(eslint@9.17.0(jiti@1.21.7)): + dependencies: + eslint: 9.17.0(jiti@1.21.7) + + eslint-plugin-react@7.37.3(eslint@9.17.0(jiti@1.21.7)): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.17.0(jiti@1.21.7) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.17.0(jiti@1.21.7): + dependencies: + "@eslint-community/eslint-utils": 4.4.1(eslint@9.17.0(jiti@1.21.7)) + "@eslint-community/regexpp": 4.12.1 + "@eslint/config-array": 0.19.1 + "@eslint/core": 0.9.1 + "@eslint/eslintrc": 3.2.0 + "@eslint/js": 9.17.0 + "@eslint/plugin-kit": 0.2.4 + "@humanfs/node": 0.16.6 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.4.1 + "@types/estree": 1.0.6 + "@types/json-schema": 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-util-attach-comments@2.1.1: + dependencies: + "@types/estree": 1.0.6 + + estree-util-build-jsx@2.2.2: + dependencies: + "@types/estree-jsx": 1.0.5 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@1.1.0: {} + + estree-util-is-identifier-name@2.1.0: {} + + estree-util-to-js@1.2.0: + dependencies: + "@types/estree-jsx": 1.0.5 + astring: 1.9.0 + source-map: 0.7.4 + + estree-util-value-to-estree@1.3.0: + dependencies: + is-plain-obj: 3.0.0 + + estree-util-visit@1.2.1: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/unist": 2.0.11 + + estree-walker@3.0.3: + dependencies: + "@types/estree": 1.0.6 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eval@0.1.8: + dependencies: + "@types/node": 22.10.5 + require-like: 0.1.2 + + event-target-shim@5.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-hook@2.2.1: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.18.0: + dependencies: + reusify: 1.0.4 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + + flatted@3.3.2: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + format@0.2.2: {} + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + framer-motion@11.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + motion-dom: 11.16.0 + motion-utils: 11.16.0 + tslib: 2.8.1 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + fresh@0.5.2: {} + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-nonce@1.0.1: {} + + get-port@5.1.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.0.0 + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@11.12.0: {} + + globals@14.0.0: {} + + globals@15.14.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globrex@0.1.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + gunzip-maybe@1.4.2: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-estree@2.3.3: + dependencies: + "@types/estree": 1.0.6 + "@types/estree-jsx": 1.0.5 + "@types/hast": 2.3.10 + "@types/unist": 2.0.11 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@2.0.1: {} + + hosted-git-info@6.1.3: + dependencies: + lru-cache: 7.18.3 + + howler@2.2.4: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inherits@2.0.4: {} + + inline-style-parser@0.1.1: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + ipaddr.js@1.9.1: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + is-async-function@2.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-buffer@2.0.5: {} + + is-bun-module@1.3.0: + dependencies: + semver: 7.6.3 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-decimal@2.0.1: {} + + is-deflate@1.0.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-gzip@1.0.0: {} + + is-hexadecimal@2.0.1: {} + + is-interactive@1.0.0: {} + + is-map@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-obj@4.1.0: {} + + is-reference@3.0.3: + dependencies: + "@types/estree": 1.0.6 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-unicode-supported@0.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isbot@4.4.0: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jackspeak@3.4.3: + dependencies: + "@isaacs/cliui": 8.0.2 + optionalDependencies: + "@pkgjs/parseargs": 0.11.0 + + javascript-stringify@2.1.0: {} + + jiti@1.21.7: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@3.0.2: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@4.1.5: {} + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + loader-utils@3.3.1: {} + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.3 + pkg-types: 1.3.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.debounce@4.0.8: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@7.18.3: {} + + lucide-react@0.469.0(react@18.3.1): + dependencies: + react: 18.3.1 + + markdown-extensions@1.1.1: {} + + math-intrinsics@1.1.0: {} + + mdast-util-definitions@5.1.2: + dependencies: + "@types/mdast": 3.0.15 + "@types/unist": 2.0.11 + unist-util-visit: 4.1.2 + + mdast-util-from-markdown@1.3.1: + dependencies: + "@types/mdast": 3.0.15 + "@types/unist": 2.0.11 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@1.0.1: + dependencies: + "@types/mdast": 3.0.15 + mdast-util-to-markdown: 1.5.0 + micromark-extension-frontmatter: 1.1.1 + + mdast-util-mdx-expression@1.3.2: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 2.3.10 + "@types/mdast": 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@2.1.4: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 2.3.10 + "@types/mdast": 3.0.15 + "@types/unist": 2.0.11 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@2.0.1: + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@1.3.1: + dependencies: + "@types/estree-jsx": 1.0.5 + "@types/hast": 2.3.10 + "@types/mdast": 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@3.0.1: + dependencies: + "@types/mdast": 3.0.15 + unist-util-is: 5.2.1 + + mdast-util-to-hast@12.3.0: + dependencies: + "@types/hast": 2.3.10 + "@types/mdast": 3.0.15 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + + mdast-util-to-markdown@1.5.0: + dependencies: + "@types/mdast": 3.0.15 + "@types/unist": 2.0.11 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + + mdast-util-to-string@3.2.0: + dependencies: + "@types/mdast": 3.0.15 + + media-query-parser@2.0.2: + dependencies: + "@babel/runtime": 7.26.0 + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-extension-frontmatter@1.1.1: + dependencies: + fault: 2.0.1 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-extension-mdx-expression@1.0.8: + dependencies: + "@types/estree": 1.0.6 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-extension-mdx-jsx@1.0.5: + dependencies: + "@types/acorn": 4.0.6 + "@types/estree": 1.0.6 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-extension-mdx-md@1.0.1: + dependencies: + micromark-util-types: 1.1.0 + + micromark-extension-mdxjs-esm@1.0.5: + dependencies: + "@types/estree": 1.0.6 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-extension-mdxjs@1.0.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-mdx-expression@1.0.9: + dependencies: + "@types/estree": 1.0.6 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-encode@1.1.0: {} + + micromark-util-events-to-acorn@1.2.3: + dependencies: + "@types/acorn": 4.0.6 + "@types/estree": 1.0.6 + "@types/unist": 2.0.11 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-util-html-tag-name@1.2.0: {} + + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-util-symbol@1.1.0: {} + + micromark-util-types@1.1.0: {} + + micromark@3.2.0: + dependencies: + "@types/debug": 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.2: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + mlly@1.7.3: + dependencies: + acorn: 8.14.0 + pathe: 1.1.2 + pkg-types: 1.3.0 + ufo: 1.5.4 + + modern-ahocorasick@1.1.0: {} + + morgan@1.10.0: + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + + motion-dom@11.16.0: + dependencies: + motion-utils: 11.16.0 + + motion-utils@11.16.0: {} + + mri@1.2.0: {} + + mrmime@1.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.8: {} + + nanoid@5.0.9: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + node-releases@2.0.19: {} + + normalize-package-data@5.0.0: + dependencies: + hosted-git-info: 6.1.3 + is-core-module: 2.16.1 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-install-checks@6.3.0: + dependencies: + semver: 7.6.3 + + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@10.1.0: + dependencies: + hosted-git-info: 6.1.3 + proc-log: 3.0.0 + semver: 7.6.3 + validate-npm-package-name: 5.0.1 + + npm-pick-manifest@8.0.2: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.6.3 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.3: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + outdent@0.8.0: {} + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + package-json-from-dist@1.0.1: {} + + pako@0.2.9: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@4.0.2: + dependencies: + "@types/unist": 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-ms@2.1.0: {} + + parseurl@1.3.3: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + + periscopic@3.1.0: + dependencies: + "@types/estree": 1.0.6 + estree-walker: 3.0.3 + is-reference: 3.0.3 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + pify@2.3.0: {} + + pirates@4.0.6: {} + + pkg-types@1.3.0: + dependencies: + confbox: 0.1.8 + mlly: 1.7.3 + pathe: 1.1.2 + + possible-typed-array-names@1.0.0: {} + + postcss-discard-duplicates@5.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-import@15.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.10 + + postcss-js@4.0.1(postcss@8.4.49): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.49 + + postcss-load-config@4.0.2(postcss@8.4.49): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.4.49 + + postcss-modules-extract-imports@3.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + + postcss-modules-local-by-default@4.2.0(postcss@8.4.49): + dependencies: + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 + postcss-selector-parser: 7.0.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 7.0.0 + + postcss-modules-values@4.0.0(postcss@8.4.49): + dependencies: + icss-utils: 5.1.0(postcss@8.4.49) + postcss: 8.4.49 + + postcss-modules@6.0.1(postcss@8.4.49): + dependencies: + generic-names: 4.0.0 + icss-utils: 5.1.0(postcss@8.4.49) + lodash.camelcase: 4.3.0 + postcss: 8.4.49 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) + postcss-modules-local-by-default: 4.2.0(postcss@8.4.49) + postcss-modules-scope: 3.2.1(postcss@8.4.49) + postcss-modules-values: 4.0.0(postcss@8.4.49) + string-hash: 1.1.3 + + postcss-nested@6.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.0.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.49: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@2.8.8: {} + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + proc-log@3.0.0: {} + + process-nextick-args@2.0.1: {} + + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-aiwriter@1.0.0: {} + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-is@16.13.1: {} + + react-refresh@0.14.2: {} + + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + "@types/react": 18.3.18 + + react-remove-scroll@2.6.2(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.3.1) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + + react-router-dom@6.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + "@remix-run/router": 1.21.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.28.1(react@18.3.1) + + react-router@6.28.1(react@18.3.1): + dependencies: + "@remix-run/router": 1.21.0 + react: 18.3.1 + + react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + get-nonce: 1.0.1 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + "@types/react": 18.3.18 + + react-textarea-autosize@8.5.6(@types/react@18.3.18)(react@18.3.1): + dependencies: + "@babel/runtime": 7.26.0 + react: 18.3.1 + use-composed-ref: 1.4.0(@types/react@18.3.18)(react@18.3.1) + use-latest: 1.3.0(@types/react@18.3.18)(react@18.3.1) + transitivePeerDependencies: + - "@types/react" + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerator-runtime@0.14.1: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + remark-frontmatter@4.0.1: + dependencies: + "@types/mdast": 3.0.15 + mdast-util-frontmatter: 1.0.1 + micromark-extension-frontmatter: 1.1.1 + unified: 10.1.2 + + remark-mdx-frontmatter@1.1.1: + dependencies: + estree-util-is-identifier-name: 1.1.0 + estree-util-value-to-estree: 1.3.0 + js-yaml: 4.1.0 + toml: 3.0.0 + + remark-mdx@2.3.0: + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + + remark-parse@10.0.2: + dependencies: + "@types/mdast": 3.0.15 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + + remark-rehype@10.1.0: + dependencies: + "@types/hast": 2.3.10 + "@types/mdast": 3.0.15 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + + require-like@0.1.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.3: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retry@0.12.0: {} + + reusify@1.0.4: {} + + rollup@4.30.1: + dependencies: + "@types/estree": 1.0.6 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.30.1 + "@rollup/rollup-android-arm64": 4.30.1 + "@rollup/rollup-darwin-arm64": 4.30.1 + "@rollup/rollup-darwin-x64": 4.30.1 + "@rollup/rollup-freebsd-arm64": 4.30.1 + "@rollup/rollup-freebsd-x64": 4.30.1 + "@rollup/rollup-linux-arm-gnueabihf": 4.30.1 + "@rollup/rollup-linux-arm-musleabihf": 4.30.1 + "@rollup/rollup-linux-arm64-gnu": 4.30.1 + "@rollup/rollup-linux-arm64-musl": 4.30.1 + "@rollup/rollup-linux-loongarch64-gnu": 4.30.1 + "@rollup/rollup-linux-powerpc64le-gnu": 4.30.1 + "@rollup/rollup-linux-riscv64-gnu": 4.30.1 + "@rollup/rollup-linux-s390x-gnu": 4.30.1 + "@rollup/rollup-linux-x64-gnu": 4.30.1 + "@rollup/rollup-linux-x64-musl": 4.30.1 + "@rollup/rollup-win32-arm64-msvc": 4.30.1 + "@rollup/rollup-win32-ia32-msvc": 4.30.1 + "@rollup/rollup-win32-x64-msvc": 4.30.1 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + secure-json-parse@3.0.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + + ssri@10.0.6: + dependencies: + minipass: 7.1.2 + + stable-hash@0.0.4: {} + + statuses@2.0.1: {} + + stream-shift@1.0.3: {} + + stream-slice@0.1.2: {} + + string-hash@1.1.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.9 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + sucrase@3.35.0: + dependencies: + "@jridgewell/gen-mapping": 0.3.8 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@2.6.0: {} + + tailwindcss-animate@1.0.7(tailwindcss@3.4.17): + dependencies: + tailwindcss: 3.4.17 + + tailwindcss@3.4.17: + dependencies: + "@alloc/quick-lru": 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.1: {} + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + toml@3.0.0: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@1.4.3(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + ts-api-utils@2.0.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + ts-interface-checker@0.1.13: {} + + tsconfck@3.1.4(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + + tsconfig-paths@3.15.0: + dependencies: + "@types/json5": 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + turbo-stream@2.4.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3): + dependencies: + "@typescript-eslint/eslint-plugin": 8.19.1(@typescript-eslint/parser@8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3))(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/parser": 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + "@typescript-eslint/utils": 8.19.1(eslint@9.17.0(jiti@1.21.7))(typescript@5.6.3) + eslint: 9.17.0(jiti@1.21.7) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + typescript@5.6.3: {} + + ufo@1.5.4: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.20.0: {} + + undici@6.21.0: {} + + unified@10.1.2: + dependencies: + "@types/unist": 2.0.11 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + + unique-filename@3.0.0: + dependencies: + unique-slug: 4.0.0 + + unique-slug@4.0.0: + dependencies: + imurmurhash: 0.1.4 + + unist-util-generated@2.0.1: {} + + unist-util-is@5.2.1: + dependencies: + "@types/unist": 2.0.11 + + unist-util-position-from-estree@1.1.2: + dependencies: + "@types/unist": 2.0.11 + + unist-util-position@4.0.4: + dependencies: + "@types/unist": 2.0.11 + + unist-util-remove-position@4.0.2: + dependencies: + "@types/unist": 2.0.11 + unist-util-visit: 4.1.2 + + unist-util-stringify-position@3.0.3: + dependencies: + "@types/unist": 2.0.11 + + unist-util-visit-parents@5.1.3: + dependencies: + "@types/unist": 2.0.11 + unist-util-is: 5.2.1 + + unist-util-visit@4.1.2: + dependencies: + "@types/unist": 2.0.11 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + "@types/react": 18.3.18 + + use-composed-ref@1.4.0(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + use-isomorphic-layout-effect@1.2.0(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + "@types/react": 18.3.18 + + use-latest@1.3.0(@types/react@18.3.18)(react@18.3.1): + dependencies: + react: 18.3.1 + use-isomorphic-layout-effect: 1.2.0(@types/react@18.3.18)(react@18.3.1) + optionalDependencies: + "@types/react": 18.3.18 + + use-sidecar@1.1.3(@types/react@18.3.18)(react@18.3.1): + dependencies: + detect-node-es: 1.1.0 + react: 18.3.1 + tslib: 2.8.1 + optionalDependencies: + "@types/react": 18.3.18 + + use-sound@4.0.3(react@18.3.1): + dependencies: + howler: 2.2.4 + react: 18.3.1 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + + utils-merge@1.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + valibot@0.41.0(typescript@5.6.3): + optionalDependencies: + typescript: 5.6.3 + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + + vary@1.1.2: {} + + vfile-message@3.1.4: + dependencies: + "@types/unist": 2.0.11 + unist-util-stringify-position: 3.0.3 + + vfile@5.3.7: + dependencies: + "@types/unist": 2.0.11 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + vite-node@1.6.0(@types/node@22.10.5): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.11(@types/node@22.10.5) + transitivePeerDependencies: + - "@types/node" + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@4.3.2(typescript@5.6.3)(vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.4(typescript@5.6.3) + optionalDependencies: + vite: 6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.4.11(@types/node@22.10.5): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.30.1 + optionalDependencies: + "@types/node": 22.10.5 + fsevents: 2.3.3 + + vite@6.0.7(@types/node@22.10.5)(jiti@1.21.7)(yaml@2.7.0): + dependencies: + esbuild: 0.24.2 + postcss: 8.4.49 + rollup: 4.30.1 + optionalDependencies: + "@types/node": 22.10.5 + fsevents: 2.3.3 + jiti: 1.21.7 + yaml: 2.7.0 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-encoding@1.1.5: + dependencies: + util: 0.12.5 + optionalDependencies: + "@zxing/text-encoding": 0.9.0 + + web-streams-polyfill@3.3.3: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@3.0.1: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + ws@7.5.10: {} + + xtend@4.0.2: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@2.7.0: {} + + yocto-queue@0.1.0: {} + + zod-to-json-schema@3.24.1(zod@3.24.1): + dependencies: + zod: 3.24.1 + + zod@3.24.1: {} + + zustand@5.0.3(@types/react@18.3.18)(react@18.3.1): + optionalDependencies: + "@types/react": 18.3.18 + react: 18.3.1 + + zwitch@2.0.4: {} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/postcss.config.js b/clone-agent/eliza-on-flow/deps/eliza/client/postcss.config.js new file mode 100644 index 00000000..49c0612d --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/public/elizaos-icon.png b/clone-agent/eliza-on-flow/deps/eliza/client/public/elizaos-icon.png new file mode 100644 index 00000000..0350e7dc Binary files /dev/null and b/clone-agent/eliza-on-flow/deps/eliza/client/public/elizaos-icon.png differ diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/public/elizaos.webp b/clone-agent/eliza-on-flow/deps/eliza/client/public/elizaos.webp new file mode 100644 index 00000000..899c8966 Binary files /dev/null and b/clone-agent/eliza-on-flow/deps/eliza/client/public/elizaos.webp differ diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/App.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/App.tsx new file mode 100644 index 00000000..a0ab33c5 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/App.tsx @@ -0,0 +1,59 @@ +import "./index.css"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar"; +import { AppSidebar } from "./components/app-sidebar"; +import { TooltipProvider } from "./components/ui/tooltip"; +import { Toaster } from "./components/ui/toaster"; +import { BrowserRouter, Route, Routes } from "react-router"; +import Chat from "./routes/chat"; +import Overview from "./routes/overview"; +import Home from "./routes/home"; +import useVersion from "./hooks/use-version"; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: Number.POSITIVE_INFINITY, + }, + }, +}); + +function App() { + useVersion(); + return ( + +
+ + + + + +
+ + } /> + } + /> + } + /> + +
+
+
+ +
+
+
+
+ ); +} + +export default App; diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/app-sidebar.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/app-sidebar.tsx new file mode 100644 index 00000000..b307655e --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/app-sidebar.tsx @@ -0,0 +1,123 @@ +import { useQuery } from "@tanstack/react-query"; +import info from "@/lib/info.json"; +import { + Sidebar, + SidebarContent, + SidebarFooter, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarHeader, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarMenuSkeleton, +} from "@/components/ui/sidebar"; +import { apiClient } from "@/lib/api"; +import { NavLink, useLocation } from "react-router"; +import type { UUID } from "@elizaos/core"; +import { Book, Cog, User } from "lucide-react"; +import ConnectionStatus from "./connection-status"; + +export function AppSidebar() { + const location = useLocation(); + const query = useQuery({ + queryKey: ["agents"], + queryFn: () => apiClient.getAgents(), + refetchInterval: 5_000, + }); + + const agents = query?.data?.agents; + + return ( + + + + + + + elizaos-icon + +
+ + ElizaOS + + v{info?.version} +
+
+
+
+
+
+ + + Agents + + + {query?.isPending ? ( +
+ {Array.from({ length: 5 }).map( + (_, _index) => ( + + + + ) + )} +
+ ) : ( +
+ {agents?.map( + (agent: { id: UUID; name: string }) => ( + + + + + + {agent.name} + + + + + ) + )} +
+ )} +
+
+
+
+ + + + + + Documentation + + + + + + Settings + + + + + +
+ ); +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/array-input.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/array-input.tsx new file mode 100644 index 00000000..8b476528 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/array-input.tsx @@ -0,0 +1,23 @@ +import { Input } from "./ui/input"; +import { Label } from "./ui/label"; + +export default function ArrayInput({ + title, + data, +}: { + title: string; + data: string[]; +}) { + return ( +
+ +
+
+ {data?.map((b: string, _idx: number) => ( + + ))} +
+
+
+ ); +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/audio-recorder.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/audio-recorder.tsx new file mode 100644 index 00000000..31c36a6d --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/audio-recorder.tsx @@ -0,0 +1,322 @@ +import React, { useEffect, useMemo, useRef, useState } from "react"; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { Button } from "@/components/ui/button"; +import { Ellipsis, Mic, Send, Trash } from "lucide-react"; +import { cn } from "@/lib/utils"; +import { useToast } from "@/hooks/use-toast"; +import { useMutation } from "@tanstack/react-query"; +import type { UUID } from "@elizaos/core"; +import { apiClient } from "@/lib/api"; + +type Props = { + agentId: UUID; + onChange: (newInput: string) => void; + className?: string; + timerClassName?: string; +}; + +type Record = { + id: number; + name: string; + file: string | null; +}; + +let recorder: MediaRecorder; +let recordingChunks: BlobPart[] = []; +let timerTimeout: NodeJS.Timeout; + +// Utility function to pad a number with leading zeros +const padWithLeadingZeros = (num: number, length: number): string => { + return String(num).padStart(length, "0"); +}; + +export const AudioRecorder = ({ + className, + timerClassName, + agentId, + onChange, +}: Props) => { + const { toast } = useToast(); + // States + const [isRecording, setIsRecording] = useState(false); + const [_, setIsRecordingFinished] = + useState(false); + const [timer, setTimer] = useState(0); + const [currentRecord, setCurrentRecord] = useState({ + id: -1, + name: "", + file: null, + }); + // Calculate the hours, minutes, and seconds from the timer + const minutes = Math.floor((timer % 3600) / 60); + const seconds = timer % 60; + + const [minuteLeft, minuteRight] = useMemo( + () => padWithLeadingZeros(minutes, 2).split(""), + [minutes] + ); + const [secondLeft, secondRight] = useMemo( + () => padWithLeadingZeros(seconds, 2).split(""), + [seconds] + ); + // Refs + const mediaRecorderRef = useRef<{ + stream: MediaStream | null; + analyser: AnalyserNode | null; + mediaRecorder: MediaRecorder | null; + audioContext: AudioContext | null; + }>({ + stream: null, + analyser: null, + mediaRecorder: null, + audioContext: null, + }); + + const mutation = useMutation({ + mutationKey: ["whisper"], + mutationFn: (file: Blob) => apiClient.whisper(agentId, file), + onSuccess: (data: { text: string }) => { + if (data?.text) { + onChange(data.text); + } + }, + onError: (e) => { + toast({ + variant: "destructive", + title: "Unable to start recording", + description: e.message, + }); + console.log(e); + }, + }); + + function startRecording() { + if (navigator.mediaDevices?.getUserMedia) { + navigator.mediaDevices + .getUserMedia({ + audio: true, + }) + .then((stream) => { + setIsRecording(true); + // ============ Analyzing ============ + const AudioContext = window.AudioContext; + const audioCtx = new AudioContext(); + const analyser = audioCtx.createAnalyser(); + const source = audioCtx.createMediaStreamSource(stream); + source.connect(analyser); + mediaRecorderRef.current = { + stream, + analyser, + mediaRecorder: null, + audioContext: audioCtx, + }; + + const mimeType = MediaRecorder.isTypeSupported("audio/mpeg") + ? "audio/mpeg" + : MediaRecorder.isTypeSupported("audio/webm") + ? "audio/webm" + : "audio/wav"; + + const options = { mimeType }; + mediaRecorderRef.current.mediaRecorder = new MediaRecorder( + stream, + options + ); + mediaRecorderRef.current.mediaRecorder.start(); + recordingChunks = []; + // ============ Recording ============ + recorder = new MediaRecorder(stream); + recorder.start(); + recorder.ondataavailable = (e) => { + recordingChunks.push(e.data); + }; + }) + .catch((e) => { + toast({ + variant: "destructive", + title: "Unable to start recording", + description: e.message, + }); + console.log(e); + }); + } + } + function stopRecording() { + recorder.onstop = () => { + const recordBlob = new Blob(recordingChunks, { + type: "audio/wav", + }); + mutation.mutate(recordBlob); + setCurrentRecord({ + ...currentRecord, + file: window.URL.createObjectURL(recordBlob), + }); + recordingChunks = []; + }; + + recorder.stop(); + + setIsRecording(false); + setIsRecordingFinished(true); + setTimer(0); + clearTimeout(timerTimeout); + } + function resetRecording() { + const { mediaRecorder, stream, analyser, audioContext } = + mediaRecorderRef.current; + + if (mediaRecorder) { + mediaRecorder.onstop = () => { + recordingChunks = []; + }; + mediaRecorder.stop(); + } + + // Stop the web audio context and the analyser node + if (analyser) { + analyser.disconnect(); + } + if (stream) { + for (const track of stream.getTracks()) { + track.stop(); + } + } + if (audioContext) { + audioContext.close(); + } + setIsRecording(false); + setIsRecordingFinished(true); + setTimer(0); + clearTimeout(timerTimeout); + } + const handleSubmit = () => { + stopRecording(); + }; + + // Effect to update the timer every second + useEffect(() => { + if (isRecording) { + timerTimeout = setTimeout(() => { + setTimer(timer + 1); + }, 1000); + } + return () => clearTimeout(timerTimeout); + }, [isRecording, timer]); + + if (mutation?.isPending) { + return ( + + ); + } + + return ( +
+ {isRecording ? ( +
+
+ +
+ ) : null} + +
+ {/* ========== Delete recording button ========== */} + {isRecording ? ( + + + + + + Reset recording + + + ) : null} + + {/* ========== Start and send recording button ========== */} + + + {!isRecording ? ( + + ) : ( + + )} + + + {!isRecording ? "Start" : "Send"} + + +
+
+ ); +}; + +const Timer = React.memo( + ({ + minuteLeft, + minuteRight, + secondLeft, + secondRight, + timerClassName, + }: { + minuteLeft: string; + minuteRight: string; + secondLeft: string; + secondRight: string; + timerClassName?: string; + }) => { + return ( +
+

+ {minuteLeft} + {minuteRight}:{secondLeft} + {secondRight} +

+
+ ); + } +); + +Timer.displayName = "Timer"; diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/chat.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/chat.tsx new file mode 100644 index 00000000..d0c13431 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/chat.tsx @@ -0,0 +1,371 @@ +import { Button } from "@/components/ui/button"; +import { + ChatBubble, + ChatBubbleMessage, + ChatBubbleTimestamp, +} from "@/components/ui/chat/chat-bubble"; +import { ChatInput } from "@/components/ui/chat/chat-input"; +import { ChatMessageList } from "@/components/ui/chat/chat-message-list"; +import { useTransition, animated, type AnimatedProps } from "@react-spring/web"; +import { Paperclip, Send, X } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; +import type { Content, UUID } from "@elizaos/core"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { apiClient } from "@/lib/api"; +import { cn, moment } from "@/lib/utils"; +import { Avatar, AvatarImage } from "./ui/avatar"; +import CopyButton from "./copy-button"; +import ChatTtsButton from "./ui/chat/chat-tts-button"; +import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip"; +import { useToast } from "@/hooks/use-toast"; +import AIWriter from "react-aiwriter"; +import type { IAttachment } from "@/types"; +import { AudioRecorder } from "./audio-recorder"; +import { Badge } from "./ui/badge"; +import { useAutoScroll } from "./ui/chat/hooks/useAutoScroll"; + +type ExtraContentFields = { + user: string; + createdAt: number; + isLoading?: boolean; +}; + +type ContentWithUser = Content & ExtraContentFields; + +type AnimatedDivProps = AnimatedProps<{ style: React.CSSProperties }> & { + children?: React.ReactNode; +}; + +export default function Page({ agentId }: { agentId: UUID }) { + const { toast } = useToast(); + const [selectedFile, setSelectedFile] = useState(null); + const [input, setInput] = useState(""); + const inputRef = useRef(null); + const fileInputRef = useRef(null); + const formRef = useRef(null); + + const queryClient = useQueryClient(); + + const getMessageVariant = (role: string) => + role !== "user" ? "received" : "sent"; + + const { scrollRef, isAtBottom, scrollToBottom, disableAutoScroll } = useAutoScroll({ + smooth: true, + }); + + useEffect(() => { + scrollToBottom(); + }, [queryClient.getQueryData(["messages", agentId])]); + + useEffect(() => { + scrollToBottom(); + }, []); + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + if (e.nativeEvent.isComposing) return; + handleSendMessage(e as unknown as React.FormEvent); + } + }; + + const handleSendMessage = (e: React.FormEvent) => { + e.preventDefault(); + if (!input) return; + + const attachments: IAttachment[] | undefined = selectedFile + ? [ + { + url: URL.createObjectURL(selectedFile), + contentType: selectedFile.type, + title: selectedFile.name, + }, + ] + : undefined; + + const newMessages = [ + { + text: input, + user: "user", + createdAt: Date.now(), + attachments, + }, + { + text: input, + user: "system", + isLoading: true, + createdAt: Date.now(), + }, + ]; + + queryClient.setQueryData( + ["messages", agentId], + (old: ContentWithUser[] = []) => [...old, ...newMessages] + ); + + sendMessageMutation.mutate({ + message: input, + selectedFile: selectedFile ? selectedFile : null, + }); + + setSelectedFile(null); + setInput(""); + formRef.current?.reset(); + }; + + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); + } + }, []); + + const sendMessageMutation = useMutation({ + mutationKey: ["send_message", agentId], + mutationFn: ({ + message, + selectedFile, + }: { + message: string; + selectedFile?: File | null; + }) => apiClient.sendMessage(agentId, message, selectedFile), + onSuccess: (newMessages: ContentWithUser[]) => { + queryClient.setQueryData( + ["messages", agentId], + (old: ContentWithUser[] = []) => [ + ...old.filter((msg) => !msg.isLoading), + ...newMessages.map((msg) => ({ + ...msg, + createdAt: Date.now(), + })), + ] + ); + }, + onError: (e) => { + toast({ + variant: "destructive", + title: "Unable to send message", + description: e.message, + }); + }, + }); + + const handleFileChange = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (file?.type.startsWith("image/")) { + setSelectedFile(file); + } + }; + + const messages = + queryClient.getQueryData(["messages", agentId]) || + []; + + const transitions = useTransition(messages, { + keys: (message) => + `${message.createdAt}-${message.user}-${message.text}`, + from: { opacity: 0, transform: "translateY(50px)" }, + enter: { opacity: 1, transform: "translateY(0px)" }, + leave: { opacity: 0, transform: "translateY(10px)" }, + }); + + const CustomAnimatedDiv = animated.div as React.FC; + + return ( +
+
+ + {transitions((style, message: ContentWithUser) => { + const variant = getMessageVariant(message?.user); + return ( + + + {message?.user !== "user" ? ( + + + + ) : null} +
+ + {message?.user !== "user" ? ( + + {message?.text} + + ) : ( + message?.text + )} + {/* Attachments */} +
+ {message?.attachments?.map( + (attachment: IAttachment) => ( +
+ attachment +
+ + +
+
+ ) + )} +
+
+
+ {message?.text && + !message?.isLoading ? ( +
+ + +
+ ) : null} +
+ {message?.source ? ( + + {message.source} + + ) : null} + {message?.action ? ( + + {message.action} + + ) : null} + {message?.createdAt ? ( + + ) : null} +
+
+
+
+
+ ); + })} +
+
+
+
+ {selectedFile ? ( +
+
+ + Selected file +
+
+ ) : null} + setInput(target.value)} + placeholder="Type your message here..." + className="min-h-12 resize-none rounded-md bg-card border-0 p-3 shadow-none focus-visible:ring-0" + /> +
+ + +
+ + +
+
+ +

Attach file

+
+
+ setInput(newInput)} + /> + +
+ +
+
+ ); +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/connection-status.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/connection-status.tsx new file mode 100644 index 00000000..57aca41b --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/connection-status.tsx @@ -0,0 +1,77 @@ +import { cn } from "@/lib/utils"; +import { SidebarMenuButton, SidebarMenuItem } from "./ui/sidebar"; +import { useQuery } from "@tanstack/react-query"; +import { apiClient } from "@/lib/api"; +import { useState } from "react"; +import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip"; +import { Activity } from "lucide-react"; + +export default function ConnectionStatus() { + const [queryTime, setQueryTime] = useState(null); + + const query = useQuery({ + queryKey: ["status"], + queryFn: async () => { + const start = performance.now(); + const data = await apiClient.getAgents(); + const end = performance.now(); + setQueryTime(end - start); + return data; + }, + refetchInterval: 5_000, + retry: 1, + refetchOnWindowFocus: "always", + }); + + const connected = query?.isSuccess && !query?.isError; + const isLoading = query?.isRefetching || query?.isPending; + + return ( + + + + +
+
+
+ + {isLoading + ? "Connecting..." + : connected + ? "Connected" + : "Disconnected"} + +
+
+ + + {connected ? ( + +
+ + {queryTime?.toFixed(2)} ms +
+
+ ) : null} + + + ); +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/copy-button.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/copy-button.tsx new file mode 100644 index 00000000..c941bf3b --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/copy-button.tsx @@ -0,0 +1,39 @@ +import { Check, Copy } from "lucide-react"; +import { useState } from "react"; +import { Button } from "@/components/ui/button"; +import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip"; + +const CopyButton = ({ text }: { text: string }) => { + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + navigator.clipboard.writeText(text).then(() => { + setCopied(true); + setTimeout(() => setCopied(false), 2000); // Reset after 2 seconds + }); + }; + + return ( + + + + + +

Copy

+
+
+ ); +}; + +export default CopyButton; diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/input-copy.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/input-copy.tsx new file mode 100644 index 00000000..603d3b74 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/input-copy.tsx @@ -0,0 +1,17 @@ +import { Input } from "./ui/input"; +import { Label } from "./ui/label"; + +export default function InputCopy({ + title, + value, +}: { + title: string; + value: string | number | undefined; +}) { + return ( +
+ + +
+ ); +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/overview.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/overview.tsx new file mode 100644 index 00000000..68b77bae --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/overview.tsx @@ -0,0 +1,39 @@ +import type { Character } from "@elizaos/core"; +import ArrayInput from "@/components/array-input"; +import InputCopy from "@/components/input-copy"; +import PageTitle from "./page-title"; + +export default function Overview({ character }: { character: Character }) { + return ( +
+ +
+ + + + + + + +
+
+ ); +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/page-title.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/page-title.tsx new file mode 100644 index 00000000..804f6c23 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/page-title.tsx @@ -0,0 +1,16 @@ +export default function PageTitle({ + title, + subtitle, +}: { + title: string; + subtitle?: string; +}) { + return ( +
+

{title}

+ {subtitle ? ( +

{subtitle}

+ ) : null} +
+ ); +} diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/avatar.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/avatar.tsx new file mode 100644 index 00000000..9efd6b49 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/avatar.tsx @@ -0,0 +1,48 @@ +import * as React from "react"; +import * as AvatarPrimitive from "@radix-ui/react-avatar"; + +import { cn } from "@/lib/utils"; + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +Avatar.displayName = AvatarPrimitive.Root.displayName; + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarImage.displayName = AvatarPrimitive.Image.displayName; + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; + +export { Avatar, AvatarImage, AvatarFallback }; diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/badge.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/badge.tsx new file mode 100644 index 00000000..5cb108e8 --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import type * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/breadcrumb.tsx b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/breadcrumb.tsx new file mode 100644 index 00000000..c88436ab --- /dev/null +++ b/clone-agent/eliza-on-flow/deps/eliza/client/src/components/ui/breadcrumb.tsx @@ -0,0 +1,116 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { ChevronRight, MoreHorizontal } from "lucide-react"; + +import { cn } from "@/lib/utils"; + +const Breadcrumb = React.forwardRef< + HTMLElement, + React.ComponentPropsWithoutRef<"nav"> & { + separator?: React.ReactNode; + } +>(({ ...props }, ref) =>