diff --git a/.github/workflows/bytecode.yml b/.github/workflows/bytecode.yml index 2f0717a..1b20fec 100644 --- a/.github/workflows/bytecode.yml +++ b/.github/workflows/bytecode.yml @@ -4,17 +4,11 @@ on: pull_request: paths: - "src/**" - - "artifacts/native_deployment.hex" - - "artifacts/native_runtime.hex" - - "artifacts/erc20_deployment.hex" - - "artifacts/erc20_runtime.hex" + - "artifacts/**" push: paths: - "src/**" - - "artifacts/native_deployment.hex" - - "artifacts/native_runtime.hex" - - "artifacts/erc20_deployment.hex" - - "artifacts/erc20_runtime.hex" + - "artifacts/**" workflow_dispatch: jobs: @@ -28,6 +22,14 @@ jobs: submodules: recursive fetch-depth: 0 # needed to diff + - uses: cachix/install-nix-action@v27 + with: + nix_path: nixpkgs=channel:nixos-unstable + + - uses: cachix/cachix-action@v15 + with: + name: devenv + - name: Determine diff range id: range shell: bash @@ -70,18 +72,17 @@ jobs: if echo "$CHANGED_FILES" | grep -qE '^src/'; then echo "Detected changes in src/." - MISSING=() - for f in native_deployment native_runtime erc20_deployment erc20_runtime; do - if echo "$CHANGED_FILES" | grep -qE "^artifacts/${f}\\.hex$"; then - echo "artifacts/${f}.hex changed as expected." - else - MISSING+=("artifacts/${f}.hex") - fi - done - if [[ ${#MISSING[@]} -gt 0 ]]; then - echo "::error title=Bytecode not updated::Changes in src/ require updated artifacts: ${MISSING[*]}" + nix develop -c ./scripts/update_artifacts.sh + + ARTIFACT_STATUS="$(git status --short -- artifacts)" + if [[ -n "$ARTIFACT_STATUS" ]]; then + echo "::error title=Bytecode artifacts out of date::Run 'make artifacts' and commit the generated artifact changes." + echo "$ARTIFACT_STATUS" | sed 's/^/ - /' + git diff -- artifacts || true exit 1 fi + + echo "Bytecode artifacts are up-to-date." else echo "No changes in src/; no bytecode update required." fi diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..45772f1 --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +.PHONY: artifacts + +artifacts: + @./scripts/update_artifacts.sh diff --git a/artifacts/batch_deployment.hex b/artifacts/batch_deployment.hex new file mode 100644 index 0000000..35c145a --- /dev/null +++ b/artifacts/batch_deployment.hex @@ -0,0 +1 @@ +0x61010080604052614289803803809161001882856105d8565b83398101906060818303126105d457610030816105fb565b60208201519091906001600160401b0381116105d457810183601f820112156105d4578051906001600160401b038211610255576040519461007860208460051b01876105d8565b828652602060a08188019402830101918183116105d457602001925b82841061055a57604085015160016012558790876001600160a01b0381161561027c5782511561054b5760a052336080525f915f5b81518110156102dd57600581901b820160200151604081018051909291906001600160a01b03161561027c5760608101908151156102ce5760808101968751156102ce578151600281101561022d5761028b5760208201516001600160a01b03161561027c575b815190600282101561022d5761017d91600103610269575f5b61015281610648565b84519060018060a01b03165f52600b60205261017360405f2091825461060f565b905588519061060f565b96600654680100000000000000008110156102555760018101806006558110156102415760065f52825195600291821b7ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01949187101561022d5760019660039460ff87549160206101008c60a81b0391015160081b16921690898060a81b0319161717855586850190878060a01b03905116878060a01b031982541617905551600284015551910155016100c9565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b60208301516001600160a01b0316610149565b63d92e233d60e01b5f5260045ffd5b8151600281101561022d576001036102bf5760208201516001600160a01b0316156101305763d92e233d60e01b5f5260045ffd5b6369ed70ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b60c084905260e084905282801580610534576105255760e0519081156102ce575f8052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f76543403610516575f818155600282905560019290925560038290556011805462ffff0019166201010017905560a0516040516323b872dd60e01b81523360048201523060248201526044810192909252909160209183916064918391906001600160a01b03165af190811561047f575f916104f7575b50156103fa575f5b600e5481101561048a576103b781610630565b60018060a01b0391549060031b1c16805f52600b60205260405f205490805f52600c6020528160405f20558015159182610409575b50506103fa576001016103a4565b63022e258160e11b5f5260045ffd5b6040516323b872dd60e01b815233600482015230602482015260448101919091529150602090829060649082905f905af190811561047f575f91610451575b501582806103ec565b610472915060203d8111610478575b61046a81836105d8565b8101906106c4565b82610448565b503d610460565b6040513d5f823e3d90fd5b505b604051613bac90816106dd823960805181818161021601528181610760015281816109580152610b41015260a05181818161067a015281816108d901528181610c6301528181610f7e0152611b27015260c051816105d7015260e051818181610b8e01526110800152f35b610510915060203d6020116104785761046a81836105d8565b8161039c565b6316fe52a960e21b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b5050341561048c576316fe52a960e21b5f5260045ffd5b63c2e5347d60e01b5f5260045ffd5b60a0848303126105d4576040519060a082016001600160401b038111838210176102555760405284519060028210156105d4578260209260a094526105a08388016105fb565b838201526105b0604088016105fb565b60408201526060870151606082015260808701516080820152815201930192610094565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761025557604052565b51906001600160a01b03821682036105d457565b9190820180921161061c57565b634e487b7160e01b5f52601160045260245ffd5b600e5481101561024157600e5f5260205f2001905f90565b6001600160a01b03165f818152600d602052604090205460ff166106c157805f52600d60205260405f20600160ff19825416179055600e5468010000000000000000811015610255578060016106a19201600e55610630565b81546001600160a01b0360039290921b91821b191692901b919091179055565b50565b908160209103126105d4575180151581036105d4579056fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146102045780630608b174146101ff57806306b5c8f4146101fa5780632957dffc146101f5578063308657d7146101f05780633a487fc6146101eb5780633d2691bc146101e6578063494fe9ed146101e157806354794405146101dc57806355a373d6146101d75780635a4fd645146101d25780635c499b17146101cd5780635e00606c146101c85780636b892b22146101c35780637d29f54c146101be57806381972d00146101b95780638bd03d0a146101b457806399ce000f146101af578063b26ff637146101aa578063b3d584f6146101a5578063ba6a8344146101a0578063ca1d209d1461019b578063cb6cdf2f14610196578063cb766a5614610191578063cf4df2561461018c578063d415b3f914610187578063d64b84b514610182578063f34e247e1461017d578063f3a504f214610178578063fd3dc53a146101735763fe03a4601461016e575f80fd5b611164565b611100565b6110db565b6110a3565b611069565b61104c565b610e7d565b610e59565b610dff565b610b21565b610ae9565b610acc565b610aaf565b610a49565b610995565b610946565b610921565b61073f565b610710565b6106c5565b6106a9565b610665565b610648565b610616565b6105fa565b6105c0565b61059e565b6102ff565b610296565b610263565b3461025f575f36600319011261025f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610250576011805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461025f575f36600319011261025f576020600454604051908152f35b600435906001600160a01b038216820361025f57565b3461025f57602036600319011261025f576001600160a01b036102b7610280565b165f52600b602052602060405f2054604051908152f35b9181601f8401121561025f5782359167ffffffffffffffff831161025f576020808501948460051b01011161025f57565b3461025f57602036600319011261025f5760043567ffffffffffffffff811161025f576103309036906004016102ce565b9060026012541461058f57600260125561034861142a565b335f9081526007602052604090209061036e61036a60115460ff9060081c1690565b1590565b6105805760018201548015908115610576575b506105675782156105585791600654926103a361039d856111d4565b946111d4565b915f925f925f925b80841061049357505050506004830190815403610468576003830154820361046857335f908152600860205260409020915f5b8354811015610477576103fe6103f482866112c4565b90549060031b1c90565b9061041561036a61040f848a6112d9565b51151590565b61046857610462610452836104446104376001965f52601060205260405f2090565b805460ff19166001179055565b5f52600f60205260405f2090565b80546001600160a01b0319169055565b016103de565b631d377ac760e01b5f5260045ffd5b610487838387549154913361199e565b6104916001601255565b005b90919293946104a3858385611206565b9086858a8a6104b186611228565b6104ba816109e7565b6104f057946104e594936104df936104d99360026001990154936116c1565b92611287565b97611287565b945b019291906103ab565b5050505060016104ff83611228565b610508816109e7565b036105495761053d61054391600361053461052f6001968c8f8f9060028e9201549361154a565b6109c6565b50015490611287565b96611249565b946104e7565b6369ed70ab60e01b5f5260045ffd5b63027e25b160e11b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b905042115f610381565b636af784dd60e11b5f5260045ffd5b63558a1e0360e11b5f5260045ffd5b3461025f575f36600319011261025f57602060ff601154166040519015158152f35b3461025f575f36600319011261025f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461025f575f36600319011261025f5760206040516101008152f35b3461025f57602036600319011261025f576004355f52600f602052602060018060a01b0360405f205416604051908152f35b3461025f575f36600319011261025f576020600354604051908152f35b3461025f575f36600319011261025f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461025f575f36600319011261025f5760205f54604051908152f35b3461025f57604036600319011261025f5760206107016106e3610280565b6001600160a01b03165f9081526008835260409020602435906112c4565b90549060031b1c604051908152f35b3461025f57602036600319011261025f576004355f526010602052602060ff60405f2054166040519015158152f35b3461025f575f36600319011261025f5760026012541461058f5760026012557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102505760115461079f9060081c60ff161590565b610580576107b5600160ff196011541617601155565b6107bd61142a565b600454610912575f546107ce6112ed565b906107d982516111d4565b91816107eb61ff001960115416601155565b5f80556107f75f600155565b5f905b82518210156108765761085c60019161083f61082661081986886112d9565b516001600160a01b031690565b6001600160a01b03165f908152600c6020526040902090565b5461084a85896112d9565b5261085584886112d9565b5190611287565b915f61086e61082661081984886112d9565b5501906107fa565b849391501561090357806108d2575b505f5b8151811015610487578061089e600192856112d9565b516108aa575b01610888565b6108cd6108ba61081983866112d9565b6108c483876112d9565b51903390611c7f565b6108a4565b6108fd90337f0000000000000000000000000000000000000000000000000000000000000000611b87565b82610885565b6353cd7f7960e01b5f5260045ffd5b639cbc1de160e01b5f5260045ffd5b3461025f575f36600319011261025f57602060ff60115460101c166040519015158152f35b3461025f575f36600319011261025f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610250576011805460ff19166001179055005b3461025f575f36600319011261025f576020600154604051908152f35b634e487b7160e01b5f52603260045260245ffd5b6006548110156109e25760065f5260205f209060021b01905f90565b6109b2565b600211156109f157565b634e487b7160e01b5f52602160045260245ffd5b9060028210156109f15752565b91926080939695949196610a2a8460a0810199610a05565b6001600160a01b03908116602085015216604083015260608201520152565b3461025f57602036600319011261025f5760043560065481101561025f57610a70906109c6565b50805460018201546002830154600390930154604051938493610aab936001600160a01b0390811691600881901c9091169060ff1686610a12565b0390f35b3461025f575f36600319011261025f576020600e54604051908152f35b3461025f575f36600319011261025f576020600654604051908152f35b3461025f57602036600319011261025f576001600160a01b03610b0a610280565b165f52600c602052602060405f2054604051908152f35b602036600319011261025f5760043560026012541461058f5760026012557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102505760115460ff8160081c16908115610df1575b50610de2578015610dd3577f00000000000000000000000000000000000000000000000000000000000000008015610dc4575f8052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f76543403610db55781610bfe602092610c5e945f55610bf983600255565b600155565b610c075f600355565b610c1d6201000062ff0000196011541617601155565b610c3161010061ff00196011541617601155565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610d91575f91610d96575b5015610d0c575f5b600e5481101561048757610cce610cb982611294565b905460039190911b1c6001600160a01b031690565b6001600160a01b03165f818152600b6020908152604080832054600c909252909120819055811515919082610d1b575b5050610d0c57600101610ca3565b63022e258160e11b5f5260045ffd5b6040516323b872dd60e01b815233600482015230602482015260448101919091529150602090829060649082905f905af1908115610d91575f91610d63575b50155f80610cfe565b610d84915060203d8111610d8a575b610d7c8183611195565b810190611407565b5f610d5a565b503d610d72565b61141f565b610daf915060203d602011610d8a57610d7c8183611195565b5f610c9b565b6316fe52a960e21b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b60ff915060101c165f610b81565b3461025f57602036600319011261025f57600435600e548110156109e257600e5f527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01546040516001600160a01b039091168152602090f35b3461025f575f36600319011261025f576020610e73611340565b6040519015158152f35b3461025f57604036600319011261025f5760043567ffffffffffffffff811161025f57610eae9036906004016102ce565b906024359160026012541461058f576002601255610eca61142a565b610ed5838284611ce5565b610edf8183611d4c565b90610ef2610eec82611e6f565b60011c90565b851061103d57600490610f0433611ecd565b335f90815260076020526040902090868255610f1f4261125c565b600183015543600283015560038201550155610f44610f3f600454611249565b600455565b5f5b818110610fdd576040516323b872dd60e01b8152336004820152306024820152604481018590526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1908115610d91575f91610fbe575b5015610d0c576104916001601255565b610fd7915060203d602011610d8a57610d7c8183611195565b81610fae565b80611037610fee60019385876113c3565b3561102433611005835f52600f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b335f9081526008602052604090206113d3565b01610f46565b63e92c469f60e01b5f5260045ffd5b3461025f575f36600319011261025f576020600254604051908152f35b3461025f575f36600319011261025f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461025f57602036600319011261025f576001600160a01b036110c4610280565b165f526008602052602060405f2054604051908152f35b3461025f575f36600319011261025f57602060ff60115460081c166040519015158152f35b3461025f57602036600319011261025f576001600160a01b03611121610280565b165f52600760205260a060405f20805490600181015490600281015460046003830154920154926040519485526020850152604084015260608301526080820152f35b3461025f575f36600319011261025f576020600554604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176111b757604052565b611181565b67ffffffffffffffff81116111b75760051b60200190565b906111de826111bc565b6111eb6040519182611195565b82815280926111fc601f19916111bc565b0190602036910137565b91908110156109e25760051b8101359060be198136030182121561025f570190565b35600281101561025f5790565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161125757565b611235565b9061012c820180921161125757565b906015820180921161125757565b600101908160011161125757565b9190820180921161125757565b600e548110156109e257600e5f5260205f2001905f90565b600a548110156109e257600a5f5260205f2001905f90565b80548210156109e2575f5260205f2001905f90565b80518210156109e25760209160051b010190565b60405190600e548083528260208101600e5f5260205f20925f5b81811061131e57505061131c92500383611195565b565b84546001600160a01b0316835260019485019487945060209093019201611307565b600a545f5b818110156113b4577fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a88101546001600160a01b03165f9081526007602052604090206001015480151590816113a9575b506113a257600101611345565b5050600190565b90504211155f611395565b50505f90565b90156109e25790565b91908110156109e25760051b0190565b8054600160401b8110156111b7576113f0916001820181556112c4565b819291549060031b91821b915f19901b1916179055565b9081602091031261025f5751801515810361025f5790565b6040513d5f823e3d90fd5b5f905b600a5482101561148257600a5f527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8820154611474906001906001600160a01b0316611f49565b61142d57906001019061142d565b9050565b903590601e198136030182121561025f570180359067ffffffffffffffff821161025f57602001918160051b3603831361025f57565b903590609e198136030182121561025f570190565b903590601e198136030182121561025f570180359067ffffffffffffffff821161025f5760200191813603831361025f57565b908060209392818452848401375f828201840152601f01601f1916010190565b611547949261153582606094610a05565b60208201528160408201520191611504565b90565b9194939060808301600161155e8286611486565b90501480159061167b575b610558578161158461157e61158a9387611486565b906113ba565b35611fcd565b95611594876109c6565b509460016115a3875460ff1690565b6115ac816109e7565b036105495761163f61163989608095611645956116338a966115cd88611228565b61161161161f60208b019a6115fd6115f38f8e906115eb82866114bc565b0135936114bc565b60608101906114d1565b604094919451948593602085019788611524565b03601f198101835282611195565b5190209261162e848383612031565b6112d9565b526112d9565b60019052565b846114bc565b0135111561166c57600182015461131c92906002906001600160a01b03169101549161206a565b6346f12ed160e01b5f5260045ffd5b5061168960a0850185611486565b90501515611569565b9594936116bc926116a68860609694610a05565b6020880152608060408801526080870191611504565b930152565b9491949290925f905f93608082016116d98184611486565b905015610558576116ea8184611486565b60a085019391506116fb8486611486565b91905003610558576117196117138486999799611486565b906121b2565b5f965b6117268386611486565b905088101561180f57611747896115848a611741878a611486565b906113c3565b611750816109c6565b50805460ff1661175f816109e7565b61054957600192600361053d928f6116398f968f978f8f8f958f611633926117f891896118069f6117db906116116117996117fe9e611228565b946117c860208601936117416117c06115f360806117b7898c6114bc565b0135978a6114bc565b949098611486565b3590604051958694602086019889611692565b519020946117f3866117ed8484611287565b86612031565b611287565b906112d9565b015490611287565b9701969461171c565b94939897509850935093506020860194608061182b87896114bc565b0135111561166c5761184561184086886114bc565b6121fa565b5f5b6118518488611486565b90508110156118eb576118d061036a8888886118a28661174161189a6118906118886118828f61174187918c611486565b356109c6565b5096886114bc565b60208101906114d1565b949096611486565b825490359060081c6001600160a01b031660018401549092906002906001600160a01b0316940154946122db565b6118dc57600101611847565b6364fa89e160e11b5f5260045ffd5b5094509492505050565b9060405160a0810181811067ffffffffffffffff8211176111b757604052809280549060ff82169060028210156109f157908352608091600391906119509060081c6001600160a01b03166001600160a01b03166020860152565b60018101546001600160a01b03166040850152600281015460608501520154910152565b5f1981019190821161125757565b60011981019190821161125757565b9190820391821161125757565b909291936119ae83600354611287565b60065414918215611b8157600154955b8315611b7257505f54935b6001600160a01b0382165f908152600860205260409020938454956119f66119f0886111d4565b976111d4565b985f5b8a8854821015611a8b579080611a83611a7b82600195611a618f8f90611a57611a2a61052f6103f4886002966112c4565b5091611a48611a40611a3b856118f5565b612475565b9788926112d9565b6001600160a01b039091169052565b01549586926112d9565b526001600160a01b03165f908152600c6020526040902090565b918254611991565b9055016119f9565b5050819294979650610bf990611abd611ab8611aaf611ac595611acc989a9d611287565b98600354611287565b600355565b600154611991565b5f54611991565b5f55611ad7846124cc565b611b51575b80611b20575b505f5b8151811015611b195780611b13611b01610819600194866112d9565b85611b0c848a6112d9565b5191611c7f565b01611ae5565b5050509050565b611b4b90837f0000000000000000000000000000000000000000000000000000000000000000611b87565b5f611ae2565b611b6161ff001960115416601155565b611b6a5f600155565b5f8055611adc565b611b7b90611e6f565b936119c9565b856119be565b904662aa36a703611bfc57604051633419e74d60e21b81526001600160a01b0391821660048201526024810193909352602091839160449183915f91165af1908115610d91575f91611bdd575b505b15610d0c57565b611bf6915060203d602011610d8a57610d7c8183611195565b5f611bd4565b60405163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352602091839160449183915f91165af1908115610d91575f91611c44575b50611bd6565b611c5d915060203d602011610d8a57610d7c8183611195565b5f611c3e565b67ffffffffffffffff81116111b757601f01601f191660200190565b91906001600160a01b038316611cdc575f809350809281925af13d15611cd7573d611ca981611c63565b90611cb76040519283611195565b81525f60203d92013e5b15611cc857565b63b12d13eb60e01b5f5260045ffd5b611cc1565b61131c92611b87565b50601154600881901c60ff16156105805760ff16611d3d5715611d2e57335f90815260076020526040902060010154611d1f571561103d57565b63129f78e960e11b5f5260045ffd5b63bff3433960e01b5f5260045ffd5b632479328960e01b5f5260045ffd5b90915f925f92600654611d5e816111d4565b5f935b808510611d6f575050505050565b909192939596611d808783876113c3565b359084821015611e4a57611d9761040f83866112d9565b611e3b57611db7611db0835f52601060205260405f2090565b5460ff1690565b611e2c57611dec611de0611dd3845f52600f60205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b611e1d57611e0c611e129160036105348561052f6116396001988b6112d9565b98611249565b960193929190611d61565b631a09926360e11b5f5260045ffd5b6305de099160e31b5f5260045ffd5b631bf39d0f60e31b5f5260045ffd5b63981bbc4b60e01b5f5260045ffd5b908160011b918083046002149015171561125757565b80158015611ec4575b611ebf576001549081811015611eb8575f54818102918183041490151715611257578115611ea4570490565b634e487b7160e01b5f52601260045260245ffd5b50505f5490565b505f90565b505f5415611e78565b6001600160a01b0381165f81815260096020526040902054909190611f4557600a5490600160401b8210156111b757611f0f826001611f339401600a556112ac565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b600a54905f52600960205260405f2055565b5050565b9060018060a01b0382165f52600760205260405f2060018101548015908115611fc2575b50611fbb57611f7d9054926124cc565b80611fb2575b611f8e575b50600190565b5f54818101809111611257575f55600554908101809111611257576005555f611f88565b50801515611f83565b5050505f90565b90504211155f611f6d565b90600654821015611e4a5781611fe2916112d9565b51611e3b575f818152600f6020526040902054336001600160a01b03909116036120225761201b611db0825f52601060205260405f2090565b611e2c5790565b6376fe0ceb60e11b5f5260045ffd5b9190915f5b8381106120435750505050565b8261204e82846112d9565b511461205c57600101612036565b62e5936760e51b5f5260045ffd5b91602083019161209a61208661208085876114bc565b806114d1565b608061209287896114bc565b013591612616565b6120b06120aa61208085876114bc565b906126aa565b926120ec61036a60408701956120c687896114d1565b90858a6120e46115f36120dc60608401846114d1565b9490936114bc565b949093612789565b6121a35761213961036a61210c612106612080858a6114bc565b9061279f565b612119611890858a6114bc565b90858a6120e46115f36120dc61212f85856114bc565b60408101906114d1565b6121945761036a61215061189061215693886114bc565b90612800565b6121855761216a61036a93612170956114d1565b906128c1565b61217657565b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b905f5b8181106121c157505050565b6121cc8183856113c3565b355f5b8281106121e05750506001016121b5565b6121eb8185876113c3565b35821461205c576001016121cf565b61226b9061221661220b82806114d1565b608084013591612616565b61225661222661210683806114d1565b9161226561223760208301836114d1565b919061225d61224960408601866114d1565b96909560608101906114d1565b36916125e0565b9236916125e0565b90612f04565b1561219457565b908210156109e2570190565b60ff60f6199116019060ff821161125757565b60ff607f199116019060ff821161125757565b60ff60bf199116019060ff821161125757565b60ff60b6199116019060ff821161125757565b60ff166001019060ff821161125757565b9594939291905f818881151580612459575b61244b575b61231b6123156123078560c09560ff95612272565b356001600160f81b03191690565b60f81c90565b161061241557808860f860ff61233961231561230788978887612272565b161061243b5761236661236161235c612315612307866123729861236c97612272565b61227e565b6122ca565b60ff1690565b90611287565b81885f5b6003811061242457506123666123156123078560c09561239595612272565b1061241557808860f86123b361236661231561230788978887612272565b106124045761236661236161235c612315612307866123d59861236c97612272565b915b5f905b8082106123ed5750506115479596612c41565b90926123fc600191848b612ad7565b9301906123da565b5061240f9150611249565b916123d7565b631bd5dcf760e31b5f5260045ffd5b9260019261243192612ad7565b9101888391612376565b506124469150611249565b612372565b5060019150829050886122f2565b50608060ff61246e61231561230786866113ba565b16106122ed565b805160028110156109f15760010361248c57505f90565b602001516001600160a01b031690565b8054905f8155816124ab575050565b5f5260205f20908101905b8181106124c1575050565b5f81556001016124b6565b9060016124e98360018060a01b03165f52600760205260405f2090565b015415611482576001600160a01b0382165f908152600860205260409020915f5b835481101561256d57806125236103f4600193876112c4565b612538611dd3825f52600f60205260405f2090565b60a084901b849003858116911614612552575b500161250a565b610452612567915f52600f60205260405f2090565b5f61254b565b506001600160a01b0381165f9081526008602052604090209192506125d2916125959061249c565b6001600160a01b0381165f9081526007602052604090206125cd9060045f918281558260018201558260028201558260038201550155565b612d69565b61131c610f3f600454611974565b9291926125ec82611c63565b916125fa6040519384611195565b82948184528183011161025f578281602093845f960137010152565b9043831161269b5761010061262b8443611991565b1161268c578240801561267d576126433683856125e0565b602081519101200361266e5761265891612e36565b0361265f57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b905f600360fe1b6001600160f81b03196126c761230785876113ba565b161061277a57601f60fb1b6001600160f81b03196126e861230785876113ba565b1610612771578061236c61236661236161235c61231561230761270c97898b612272565b905b5f5b6004811061275c5750600560fd1b906001600160f81b0319906127399061230790859087612272565b160361274d5761274890611249565b013590565b633954003560e11b5f5260045ffd5b9161276a6001918386612ad7565b9201612710565b5060019061270e565b63c0098bd960e01b5f5260045ffd5b61225d61226592939495611547989736916125e0565b906127aa81836130be565b905f5b600581106127eb5750600560fd1b906001600160f81b0319906127d290849086612272565b35160361274d5760018101811161125757016001013590565b916127f96001918386612ad7565b92016127ad565b5f90821515806128a5575b61289c575b60c060ff612825612315612307868887612272565b16106124155761231561230782858560f860ff61284f612315612307839b60019d6128799c612272565b1610612893578061236c61236661236161235c61231561230761287397898b612272565b91612272565b160361288457600190565b63e9dd8a9d60e01b5f5260045ffd5b61287390611249565b60019150612810565b50608060ff6128ba61231561230787866113ba565b161061280b565b90916003905f84151580612abb575b612a73575b60c060ff6128ea612315612307858a8a612272565b1610612415578060f860ff61290961231561230761292f968b8b612272565b1610612a6a5760ff61292861236161235c612315612307868c8c612272565b1690611287565b915f905b808210612a53575050609460ff612951612315612307868989612272565b1603612a44576001600160a01b03168282016001013560601c03612a35576129789061126b565b9161298a612315612307858486612272565b925f9260ff851694608086105f146129bb5750505050505b036129ac57600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f146129d45750505050505f6129a2565b6123666129e391939293612291565b915f935b8385106129f85750505050506129a2565b9091929394612a0960019160081b90565b612a29612366612315612307612a228b6117f38b611249565b8789612272565b179501939291906129e7565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092612a626001918787612ad7565b930190612933565b60ff6001612928565b509050612a8661231561230785856113ba565b6001919060ff16808303612a9d57506004916128d5565b600203612aac576005916128d5565b636fc3daa360e11b5f5260045ffd5b50608060ff612ad061231561230789896113ba565b16106128d0565b919080821015612c3257612af2612315612307848487612272565b9060ff82166080811015612b0d575050506115479150611249565b91929160b8811015612b355750506115479250612366612b2f61236c92611249565b92612291565b90929060c0811015612bab5750612366612b51919493946122b7565b915f935f915b848310612b725750505061154792916117f36117f392611249565b909194612b8160019160081b90565b612ba1612366612315612307612b9a8b6117f38b611249565b8888612272565b1795019190612b57565b90929060f81115612bd157506115479250612366612bcb61236c92611249565b926122a4565b9291612366612bdf9161227e565b915f935f915b848310612c005750505061154792916117f36117f392611249565b909194612c0f60019160081b90565b612c28612366612315612307612b9a8b6117f38b611249565b1795019190612be5565b6318d76ae160e11b5f5260045ffd5b91949392948060c060ff612c5c61231561230785888a612272565b16106124155760f860ff612c7761231561230785888a612272565b1610612cf257508061236c61236661236161235c612315612307612c9c97898b612272565b945b609460ff612cb36123156123078a8789612272565b1603612a44576001600160a01b03168286016001013560601c03612ce357612cdd6115479561126b565b916131d6565b63a087f96f60e01b5f5260045ffd5b612cfc9150611249565b94612c9e565b600a548015612d55575f19810190600a548210156109e257600a5f8190527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a790910180546001600160a01b031916905555565b634e487b7160e01b5f52603160045260245ffd5b6001600160a01b0381165f908152600960205260409020548015611f45575f19810181811161125757600a54915f19830183811161125757808303612dd6575b50505050612dd35f91612dba612d02565b6001600160a01b03165f90815260096020526040902090565b55565b928094929310156109e257612e2d611f0f612dba612dd395612e257fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a75f99600a8b52015460018060a01b031690565b9283916112ac565b55915f80612da9565b612e4082826130be565b915f5b60088110612ed15750612e5d612315612307858486612272565b925f9260ff851694608086105f14612e7757505050505090565b612e88919394955061236690612291565b915f935b838510612e9b57505050505090565b9091929394612eac60019160081b90565b612ec5612366612315612307612a228b6117f38b611249565b17950193929190612e8c565b92612edf6001918385612ad7565b9301612e43565b8051156109e25760200190565b9081518110156109e2570160200190565b919390929190600360fe1b6001600160f81b0319612f2561230786896113ba565b16106130af57601f60fb1b6001600160f81b0319612f4661230786896113ba565b16106130a557612f6a612f6561236661235c612315612307888b6113ba565b611279565b9492905b945f5b828210612f8357505050505050505f90565b612fa1612f9a83612f9536878a6125e0565b6133c7565b9093611287565b96825160208401200361304357600360fe1b612fdd612fd0612fc285612ee6565b516001600160f81b03191690565b6001600160f81b03191690565b10613043578590846001601f60fb1b612ffb612fd0612fc288612ee6565b1015613087575b61300c818661356e565b6011810361304e575061301e946136de565b9491156130435784156130375793915b91959093612f71565b50505050505050600190565b505050505050505f90565b90935060021415905061307b5784879261306794613599565b94911561304357841561303757939161302e565b50505050505050505f90565b506130a0612f6561236661235c612315612fc289612ee6565b613002565b6001949290612f6e565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196130da61230786866113ba565b161061277a57601f60fb1b6001600160f81b03196130fb61230786866113ba565b16106131cd578061236c61236661236161235c61231561230761311f978a8a612272565b905b61a5bd461480156131c2575b613138575b50905090565b5f5b600381106131ad5750600360fe1b613159612fd0612307858786612272565b1061277a57601f60fb1b613174612fd0612307858786612272565b1061319d5761236661236161235c612315612307866131969861236c97612272565b805f613132565b506131a89150611249565b613196565b916131bb6001918584612ad7565b920161313a565b5061a5bf461461312d565b50600190613121565b929190918160c060ff6131f061231561230787898b612272565b16106124155760f860ff61320b61231561230787898b612272565b161061336e578061236c61236661236161235c61231561230761322f978b8d612272565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61325b8286886137f3565b0361335f57611de0611de061327e61327761328594888a612ad7565b8789612ad7565b86886137f3565b6001600160a01b03918216911603613350576132a2908284612ad7565b905f916132b6612315612307838588612272565b60ff8116949060808610156132d4575050505050036129ac57600190565b9091929394608081145f146132ef575050505050505f6129a2565b60a0106124155761236661330591939293612291565b915f935b83851061331a5750505050506129a2565b909192939461332b60019160081b90565b613344612366612315612307612a228b6117f38b611249565b17950193929190613309565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b5061337882611249565b61322f565b6040805190919061338e8382611195565b6001815291601f1901366020840137565b906133a982611c63565b6133b66040519182611195565b82815280926111fc601f1991611c63565b8051821015612c32576133e0612315612fc28484612ef3565b9160ff83166080811015613419575050506133f961337d565b9060f81b6001600160f81b0319165f1a61341282612ee6565b5390600190565b919392909160b8811015613483575061236661343491612291565b9061343e8261339f565b935f5b8381106134545750505061154790611279565b80613470612fc261346a6001946117f388611249565b85612ef3565b5f1a61347c8289612ef3565b5301613441565b60c0111561352157612366613497916122b7565b5f915f5b8281106134f357506134ac8361339f565b945f5b8481106134c657505050906117f361154792611279565b806134e0612fc261346a6001946117f3896117f38a611249565b5f1a6134ec828a612ef3565b53016134af565b9260019060081b613519612366612315612fc2613513896117f389611249565b8b612ef3565b17930161349b565b509161352d838261382f565b926135378461339f565b915f5b858110613548575050509190565b8061355b612fc261346a60019487611287565b5f1a6135678287612ef3565b530161353a565b5f92915b8151811015611f4557613585818361382f565b810180911161125757600190930192613572565b839492916135a781836133c7565b93906135c660206135bd612315612fc285612ee6565b1615159161395c565b9788911561366857506135da905187611287565b6135e48251611e59565b146135f9575b505050505050505f905f905f90565b86866001928251613656575b505050613613575b806135ea565b6136269261362091611287565b906133c7565b5060208151910120906020815191012014613644578080808061360d565b61364f915190611287565b6001915f90565b6136609350613ac5565b86865f613605565b613679939495965061036a92613ac5565b6136d15761368a9261362091611287565b50908151602081145f146136b1575060206136a9920151925190611287565b916001929190565b80156136c55760206136a993012092610855565b505050505f905f905f90565b50505050505f905f905f90565b919092936136ec8251611e59565b8510156137965750612315612fc261370e926137088760011c90565b90612ef3565b6001841661378d5760041c600f16915b905f925b60ff8116841061376d575061373792506133c7565b5080518015613762576136a991602082036137585760209150015191611249565b6020012091611249565b5050505f905f905f90565b909160016137818261236c60ff948761382f565b94019392919050613722565b600f169161371e565b9290509392935f915b601083106137d9576137b192506133c7565b50602081519101209060208151910120145f146137d057600191905f90565b5f915081908190565b906137ea8161236c6001938561382f565b9201919061379f565b9190600560fd1b906001600160f81b03199061381190849086612272565b35160361382057016001013590565b63f0ff325b60e01b5f5260045ffd5b908151811015612c3257613849612315612fc28385612ef3565b9160ff831660808110156138605750505050600190565b60b881101561387b5750505061236661236161154792612291565b60c08110156138e7575091612366613892916122b7565b905f925f915b8383106138af57505050906117f361154792611279565b9091936138be60019160081b90565b6138dd612366612315612fc26138d78a6117f389611249565b88612ef3565b1794019190613898565b60f81115613900575050612366612361611547926122a4565b9161236661390d9161227e565b905f925f915b83831061392a57505050906117f361154792611279565b90919361393960019160081b90565b613952612366612315612fc26138d78a6117f389611249565b1794019190613913565b9081511561131c57613973612315612fc284612ee6565b6010811615613a425761399661399161398c8551611e59565b611974565b61339f565b9060f81b600f60f81b165f1a6139ab82612ee6565b5360015b8351811015613a3d57806139ea6139da6139d1612315612fc26001968a612ef3565b60041c600f1690565b60f81b6001600160f81b03191690565b613a036139f961398c84611e59565b915f1a9185612ef3565b53613a2a600f613a19612315612fc2858a612ef3565b1660f81b6001600160f81b03191690565b613a366139f983611e59565b53016139af565b509150565b50613a58613991613a538451611e59565b611982565b60015b8351811015613a3d5780613a7d6139da6139d1612315612fc26001968a612ef3565b613a916139f9613a8c84611974565b611e59565b53613aa7600f613a19612315612fc2858a612ef3565b613abe6139f9613ab9613a8c85611974565b611249565b5301613a5b565b919091613ad3825184611287565b613add8251611e59565b10611fbb575f5b8251811015613b6d57613b00613afa8286611287565b60011690565b613b4f57613b236139d1612315612fc2613b1d610eec868a611287565b86612ef3565b60ff613b38612366612315612fc28689612ef3565b911603613b4757600101613ae4565b505050505f90565b600f613b67612315612fc2613b1d610eec868a611287565b16613b23565b5050505060019056fea26469706673582212202eab8a871addb0e2a60cd81dda39cde315a291a561b424c2c36a1abc9ad6474764736f6c634300081e0033 diff --git a/artifacts/batch_runtime.hex b/artifacts/batch_runtime.hex new file mode 100644 index 0000000..2b12771 --- /dev/null +++ b/artifacts/batch_runtime.hex @@ -0,0 +1 @@ +0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146102045780630608b174146101ff57806306b5c8f4146101fa5780632957dffc146101f5578063308657d7146101f05780633a487fc6146101eb5780633d2691bc146101e6578063494fe9ed146101e157806354794405146101dc57806355a373d6146101d75780635a4fd645146101d25780635c499b17146101cd5780635e00606c146101c85780636b892b22146101c35780637d29f54c146101be57806381972d00146101b95780638bd03d0a146101b457806399ce000f146101af578063b26ff637146101aa578063b3d584f6146101a5578063ba6a8344146101a0578063ca1d209d1461019b578063cb6cdf2f14610196578063cb766a5614610191578063cf4df2561461018c578063d415b3f914610187578063d64b84b514610182578063f34e247e1461017d578063f3a504f214610178578063fd3dc53a146101735763fe03a4601461016e575f80fd5b611164565b611100565b6110db565b6110a3565b611069565b61104c565b610e7d565b610e59565b610dff565b610b21565b610ae9565b610acc565b610aaf565b610a49565b610995565b610946565b610921565b61073f565b610710565b6106c5565b6106a9565b610665565b610648565b610616565b6105fa565b6105c0565b61059e565b6102ff565b610296565b610263565b3461025f575f36600319011261025f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610250576011805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461025f575f36600319011261025f576020600454604051908152f35b600435906001600160a01b038216820361025f57565b3461025f57602036600319011261025f576001600160a01b036102b7610280565b165f52600b602052602060405f2054604051908152f35b9181601f8401121561025f5782359167ffffffffffffffff831161025f576020808501948460051b01011161025f57565b3461025f57602036600319011261025f5760043567ffffffffffffffff811161025f576103309036906004016102ce565b9060026012541461058f57600260125561034861142a565b335f9081526007602052604090209061036e61036a60115460ff9060081c1690565b1590565b6105805760018201548015908115610576575b506105675782156105585791600654926103a361039d856111d4565b946111d4565b915f925f925f925b80841061049357505050506004830190815403610468576003830154820361046857335f908152600860205260409020915f5b8354811015610477576103fe6103f482866112c4565b90549060031b1c90565b9061041561036a61040f848a6112d9565b51151590565b61046857610462610452836104446104376001965f52601060205260405f2090565b805460ff19166001179055565b5f52600f60205260405f2090565b80546001600160a01b0319169055565b016103de565b631d377ac760e01b5f5260045ffd5b610487838387549154913361199e565b6104916001601255565b005b90919293946104a3858385611206565b9086858a8a6104b186611228565b6104ba816109e7565b6104f057946104e594936104df936104d99360026001990154936116c1565b92611287565b97611287565b945b019291906103ab565b5050505060016104ff83611228565b610508816109e7565b036105495761053d61054391600361053461052f6001968c8f8f9060028e9201549361154a565b6109c6565b50015490611287565b96611249565b946104e7565b6369ed70ab60e01b5f5260045ffd5b63027e25b160e11b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b905042115f610381565b636af784dd60e11b5f5260045ffd5b63558a1e0360e11b5f5260045ffd5b3461025f575f36600319011261025f57602060ff601154166040519015158152f35b3461025f575f36600319011261025f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461025f575f36600319011261025f5760206040516101008152f35b3461025f57602036600319011261025f576004355f52600f602052602060018060a01b0360405f205416604051908152f35b3461025f575f36600319011261025f576020600354604051908152f35b3461025f575f36600319011261025f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461025f575f36600319011261025f5760205f54604051908152f35b3461025f57604036600319011261025f5760206107016106e3610280565b6001600160a01b03165f9081526008835260409020602435906112c4565b90549060031b1c604051908152f35b3461025f57602036600319011261025f576004355f526010602052602060ff60405f2054166040519015158152f35b3461025f575f36600319011261025f5760026012541461058f5760026012557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102505760115461079f9060081c60ff161590565b610580576107b5600160ff196011541617601155565b6107bd61142a565b600454610912575f546107ce6112ed565b906107d982516111d4565b91816107eb61ff001960115416601155565b5f80556107f75f600155565b5f905b82518210156108765761085c60019161083f61082661081986886112d9565b516001600160a01b031690565b6001600160a01b03165f908152600c6020526040902090565b5461084a85896112d9565b5261085584886112d9565b5190611287565b915f61086e61082661081984886112d9565b5501906107fa565b849391501561090357806108d2575b505f5b8151811015610487578061089e600192856112d9565b516108aa575b01610888565b6108cd6108ba61081983866112d9565b6108c483876112d9565b51903390611c7f565b6108a4565b6108fd90337f0000000000000000000000000000000000000000000000000000000000000000611b87565b82610885565b6353cd7f7960e01b5f5260045ffd5b639cbc1de160e01b5f5260045ffd5b3461025f575f36600319011261025f57602060ff60115460101c166040519015158152f35b3461025f575f36600319011261025f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610250576011805460ff19166001179055005b3461025f575f36600319011261025f576020600154604051908152f35b634e487b7160e01b5f52603260045260245ffd5b6006548110156109e25760065f5260205f209060021b01905f90565b6109b2565b600211156109f157565b634e487b7160e01b5f52602160045260245ffd5b9060028210156109f15752565b91926080939695949196610a2a8460a0810199610a05565b6001600160a01b03908116602085015216604083015260608201520152565b3461025f57602036600319011261025f5760043560065481101561025f57610a70906109c6565b50805460018201546002830154600390930154604051938493610aab936001600160a01b0390811691600881901c9091169060ff1686610a12565b0390f35b3461025f575f36600319011261025f576020600e54604051908152f35b3461025f575f36600319011261025f576020600654604051908152f35b3461025f57602036600319011261025f576001600160a01b03610b0a610280565b165f52600c602052602060405f2054604051908152f35b602036600319011261025f5760043560026012541461058f5760026012557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102505760115460ff8160081c16908115610df1575b50610de2578015610dd3577f00000000000000000000000000000000000000000000000000000000000000008015610dc4575f8052600b6020527fdf7de25b7f1fd6d0b5205f0e18f1f35bd7b8d84cce336588d184533ce43a6f76543403610db55781610bfe602092610c5e945f55610bf983600255565b600155565b610c075f600355565b610c1d6201000062ff0000196011541617601155565b610c3161010061ff00196011541617601155565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1908115610d91575f91610d96575b5015610d0c575f5b600e5481101561048757610cce610cb982611294565b905460039190911b1c6001600160a01b031690565b6001600160a01b03165f818152600b6020908152604080832054600c909252909120819055811515919082610d1b575b5050610d0c57600101610ca3565b63022e258160e11b5f5260045ffd5b6040516323b872dd60e01b815233600482015230602482015260448101919091529150602090829060649082905f905af1908115610d91575f91610d63575b50155f80610cfe565b610d84915060203d8111610d8a575b610d7c8183611195565b810190611407565b5f610d5a565b503d610d72565b61141f565b610daf915060203d602011610d8a57610d7c8183611195565b5f610c9b565b6316fe52a960e21b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b60ff915060101c165f610b81565b3461025f57602036600319011261025f57600435600e548110156109e257600e5f527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01546040516001600160a01b039091168152602090f35b3461025f575f36600319011261025f576020610e73611340565b6040519015158152f35b3461025f57604036600319011261025f5760043567ffffffffffffffff811161025f57610eae9036906004016102ce565b906024359160026012541461058f576002601255610eca61142a565b610ed5838284611ce5565b610edf8183611d4c565b90610ef2610eec82611e6f565b60011c90565b851061103d57600490610f0433611ecd565b335f90815260076020526040902090868255610f1f4261125c565b600183015543600283015560038201550155610f44610f3f600454611249565b600455565b5f5b818110610fdd576040516323b872dd60e01b8152336004820152306024820152604481018590526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1908115610d91575f91610fbe575b5015610d0c576104916001601255565b610fd7915060203d602011610d8a57610d7c8183611195565b81610fae565b80611037610fee60019385876113c3565b3561102433611005835f52600f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b335f9081526008602052604090206113d3565b01610f46565b63e92c469f60e01b5f5260045ffd5b3461025f575f36600319011261025f576020600254604051908152f35b3461025f575f36600319011261025f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461025f57602036600319011261025f576001600160a01b036110c4610280565b165f526008602052602060405f2054604051908152f35b3461025f575f36600319011261025f57602060ff60115460081c166040519015158152f35b3461025f57602036600319011261025f576001600160a01b03611121610280565b165f52600760205260a060405f20805490600181015490600281015460046003830154920154926040519485526020850152604084015260608301526080820152f35b3461025f575f36600319011261025f576020600554604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176111b757604052565b611181565b67ffffffffffffffff81116111b75760051b60200190565b906111de826111bc565b6111eb6040519182611195565b82815280926111fc601f19916111bc565b0190602036910137565b91908110156109e25760051b8101359060be198136030182121561025f570190565b35600281101561025f5790565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161125757565b611235565b9061012c820180921161125757565b906015820180921161125757565b600101908160011161125757565b9190820180921161125757565b600e548110156109e257600e5f5260205f2001905f90565b600a548110156109e257600a5f5260205f2001905f90565b80548210156109e2575f5260205f2001905f90565b80518210156109e25760209160051b010190565b60405190600e548083528260208101600e5f5260205f20925f5b81811061131e57505061131c92500383611195565b565b84546001600160a01b0316835260019485019487945060209093019201611307565b600a545f5b818110156113b4577fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a88101546001600160a01b03165f9081526007602052604090206001015480151590816113a9575b506113a257600101611345565b5050600190565b90504211155f611395565b50505f90565b90156109e25790565b91908110156109e25760051b0190565b8054600160401b8110156111b7576113f0916001820181556112c4565b819291549060031b91821b915f19901b1916179055565b9081602091031261025f5751801515810361025f5790565b6040513d5f823e3d90fd5b5f905b600a5482101561148257600a5f527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8820154611474906001906001600160a01b0316611f49565b61142d57906001019061142d565b9050565b903590601e198136030182121561025f570180359067ffffffffffffffff821161025f57602001918160051b3603831361025f57565b903590609e198136030182121561025f570190565b903590601e198136030182121561025f570180359067ffffffffffffffff821161025f5760200191813603831361025f57565b908060209392818452848401375f828201840152601f01601f1916010190565b611547949261153582606094610a05565b60208201528160408201520191611504565b90565b9194939060808301600161155e8286611486565b90501480159061167b575b610558578161158461157e61158a9387611486565b906113ba565b35611fcd565b95611594876109c6565b509460016115a3875460ff1690565b6115ac816109e7565b036105495761163f61163989608095611645956116338a966115cd88611228565b61161161161f60208b019a6115fd6115f38f8e906115eb82866114bc565b0135936114bc565b60608101906114d1565b604094919451948593602085019788611524565b03601f198101835282611195565b5190209261162e848383612031565b6112d9565b526112d9565b60019052565b846114bc565b0135111561166c57600182015461131c92906002906001600160a01b03169101549161206a565b6346f12ed160e01b5f5260045ffd5b5061168960a0850185611486565b90501515611569565b9594936116bc926116a68860609694610a05565b6020880152608060408801526080870191611504565b930152565b9491949290925f905f93608082016116d98184611486565b905015610558576116ea8184611486565b60a085019391506116fb8486611486565b91905003610558576117196117138486999799611486565b906121b2565b5f965b6117268386611486565b905088101561180f57611747896115848a611741878a611486565b906113c3565b611750816109c6565b50805460ff1661175f816109e7565b61054957600192600361053d928f6116398f968f978f8f8f958f611633926117f891896118069f6117db906116116117996117fe9e611228565b946117c860208601936117416117c06115f360806117b7898c6114bc565b0135978a6114bc565b949098611486565b3590604051958694602086019889611692565b519020946117f3866117ed8484611287565b86612031565b611287565b906112d9565b015490611287565b9701969461171c565b94939897509850935093506020860194608061182b87896114bc565b0135111561166c5761184561184086886114bc565b6121fa565b5f5b6118518488611486565b90508110156118eb576118d061036a8888886118a28661174161189a6118906118886118828f61174187918c611486565b356109c6565b5096886114bc565b60208101906114d1565b949096611486565b825490359060081c6001600160a01b031660018401549092906002906001600160a01b0316940154946122db565b6118dc57600101611847565b6364fa89e160e11b5f5260045ffd5b5094509492505050565b9060405160a0810181811067ffffffffffffffff8211176111b757604052809280549060ff82169060028210156109f157908352608091600391906119509060081c6001600160a01b03166001600160a01b03166020860152565b60018101546001600160a01b03166040850152600281015460608501520154910152565b5f1981019190821161125757565b60011981019190821161125757565b9190820391821161125757565b909291936119ae83600354611287565b60065414918215611b8157600154955b8315611b7257505f54935b6001600160a01b0382165f908152600860205260409020938454956119f66119f0886111d4565b976111d4565b985f5b8a8854821015611a8b579080611a83611a7b82600195611a618f8f90611a57611a2a61052f6103f4886002966112c4565b5091611a48611a40611a3b856118f5565b612475565b9788926112d9565b6001600160a01b039091169052565b01549586926112d9565b526001600160a01b03165f908152600c6020526040902090565b918254611991565b9055016119f9565b5050819294979650610bf990611abd611ab8611aaf611ac595611acc989a9d611287565b98600354611287565b600355565b600154611991565b5f54611991565b5f55611ad7846124cc565b611b51575b80611b20575b505f5b8151811015611b195780611b13611b01610819600194866112d9565b85611b0c848a6112d9565b5191611c7f565b01611ae5565b5050509050565b611b4b90837f0000000000000000000000000000000000000000000000000000000000000000611b87565b5f611ae2565b611b6161ff001960115416601155565b611b6a5f600155565b5f8055611adc565b611b7b90611e6f565b936119c9565b856119be565b904662aa36a703611bfc57604051633419e74d60e21b81526001600160a01b0391821660048201526024810193909352602091839160449183915f91165af1908115610d91575f91611bdd575b505b15610d0c57565b611bf6915060203d602011610d8a57610d7c8183611195565b5f611bd4565b60405163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352602091839160449183915f91165af1908115610d91575f91611c44575b50611bd6565b611c5d915060203d602011610d8a57610d7c8183611195565b5f611c3e565b67ffffffffffffffff81116111b757601f01601f191660200190565b91906001600160a01b038316611cdc575f809350809281925af13d15611cd7573d611ca981611c63565b90611cb76040519283611195565b81525f60203d92013e5b15611cc857565b63b12d13eb60e01b5f5260045ffd5b611cc1565b61131c92611b87565b50601154600881901c60ff16156105805760ff16611d3d5715611d2e57335f90815260076020526040902060010154611d1f571561103d57565b63129f78e960e11b5f5260045ffd5b63bff3433960e01b5f5260045ffd5b632479328960e01b5f5260045ffd5b90915f925f92600654611d5e816111d4565b5f935b808510611d6f575050505050565b909192939596611d808783876113c3565b359084821015611e4a57611d9761040f83866112d9565b611e3b57611db7611db0835f52601060205260405f2090565b5460ff1690565b611e2c57611dec611de0611dd3845f52600f60205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b611e1d57611e0c611e129160036105348561052f6116396001988b6112d9565b98611249565b960193929190611d61565b631a09926360e11b5f5260045ffd5b6305de099160e31b5f5260045ffd5b631bf39d0f60e31b5f5260045ffd5b63981bbc4b60e01b5f5260045ffd5b908160011b918083046002149015171561125757565b80158015611ec4575b611ebf576001549081811015611eb8575f54818102918183041490151715611257578115611ea4570490565b634e487b7160e01b5f52601260045260245ffd5b50505f5490565b505f90565b505f5415611e78565b6001600160a01b0381165f81815260096020526040902054909190611f4557600a5490600160401b8210156111b757611f0f826001611f339401600a556112ac565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b600a54905f52600960205260405f2055565b5050565b9060018060a01b0382165f52600760205260405f2060018101548015908115611fc2575b50611fbb57611f7d9054926124cc565b80611fb2575b611f8e575b50600190565b5f54818101809111611257575f55600554908101809111611257576005555f611f88565b50801515611f83565b5050505f90565b90504211155f611f6d565b90600654821015611e4a5781611fe2916112d9565b51611e3b575f818152600f6020526040902054336001600160a01b03909116036120225761201b611db0825f52601060205260405f2090565b611e2c5790565b6376fe0ceb60e11b5f5260045ffd5b9190915f5b8381106120435750505050565b8261204e82846112d9565b511461205c57600101612036565b62e5936760e51b5f5260045ffd5b91602083019161209a61208661208085876114bc565b806114d1565b608061209287896114bc565b013591612616565b6120b06120aa61208085876114bc565b906126aa565b926120ec61036a60408701956120c687896114d1565b90858a6120e46115f36120dc60608401846114d1565b9490936114bc565b949093612789565b6121a35761213961036a61210c612106612080858a6114bc565b9061279f565b612119611890858a6114bc565b90858a6120e46115f36120dc61212f85856114bc565b60408101906114d1565b6121945761036a61215061189061215693886114bc565b90612800565b6121855761216a61036a93612170956114d1565b906128c1565b61217657565b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b905f5b8181106121c157505050565b6121cc8183856113c3565b355f5b8281106121e05750506001016121b5565b6121eb8185876113c3565b35821461205c576001016121cf565b61226b9061221661220b82806114d1565b608084013591612616565b61225661222661210683806114d1565b9161226561223760208301836114d1565b919061225d61224960408601866114d1565b96909560608101906114d1565b36916125e0565b9236916125e0565b90612f04565b1561219457565b908210156109e2570190565b60ff60f6199116019060ff821161125757565b60ff607f199116019060ff821161125757565b60ff60bf199116019060ff821161125757565b60ff60b6199116019060ff821161125757565b60ff166001019060ff821161125757565b9594939291905f818881151580612459575b61244b575b61231b6123156123078560c09560ff95612272565b356001600160f81b03191690565b60f81c90565b161061241557808860f860ff61233961231561230788978887612272565b161061243b5761236661236161235c612315612307866123729861236c97612272565b61227e565b6122ca565b60ff1690565b90611287565b81885f5b6003811061242457506123666123156123078560c09561239595612272565b1061241557808860f86123b361236661231561230788978887612272565b106124045761236661236161235c612315612307866123d59861236c97612272565b915b5f905b8082106123ed5750506115479596612c41565b90926123fc600191848b612ad7565b9301906123da565b5061240f9150611249565b916123d7565b631bd5dcf760e31b5f5260045ffd5b9260019261243192612ad7565b9101888391612376565b506124469150611249565b612372565b5060019150829050886122f2565b50608060ff61246e61231561230786866113ba565b16106122ed565b805160028110156109f15760010361248c57505f90565b602001516001600160a01b031690565b8054905f8155816124ab575050565b5f5260205f20908101905b8181106124c1575050565b5f81556001016124b6565b9060016124e98360018060a01b03165f52600760205260405f2090565b015415611482576001600160a01b0382165f908152600860205260409020915f5b835481101561256d57806125236103f4600193876112c4565b612538611dd3825f52600f60205260405f2090565b60a084901b849003858116911614612552575b500161250a565b610452612567915f52600f60205260405f2090565b5f61254b565b506001600160a01b0381165f9081526008602052604090209192506125d2916125959061249c565b6001600160a01b0381165f9081526007602052604090206125cd9060045f918281558260018201558260028201558260038201550155565b612d69565b61131c610f3f600454611974565b9291926125ec82611c63565b916125fa6040519384611195565b82948184528183011161025f578281602093845f960137010152565b9043831161269b5761010061262b8443611991565b1161268c578240801561267d576126433683856125e0565b602081519101200361266e5761265891612e36565b0361265f57565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b905f600360fe1b6001600160f81b03196126c761230785876113ba565b161061277a57601f60fb1b6001600160f81b03196126e861230785876113ba565b1610612771578061236c61236661236161235c61231561230761270c97898b612272565b905b5f5b6004811061275c5750600560fd1b906001600160f81b0319906127399061230790859087612272565b160361274d5761274890611249565b013590565b633954003560e11b5f5260045ffd5b9161276a6001918386612ad7565b9201612710565b5060019061270e565b63c0098bd960e01b5f5260045ffd5b61225d61226592939495611547989736916125e0565b906127aa81836130be565b905f5b600581106127eb5750600560fd1b906001600160f81b0319906127d290849086612272565b35160361274d5760018101811161125757016001013590565b916127f96001918386612ad7565b92016127ad565b5f90821515806128a5575b61289c575b60c060ff612825612315612307868887612272565b16106124155761231561230782858560f860ff61284f612315612307839b60019d6128799c612272565b1610612893578061236c61236661236161235c61231561230761287397898b612272565b91612272565b160361288457600190565b63e9dd8a9d60e01b5f5260045ffd5b61287390611249565b60019150612810565b50608060ff6128ba61231561230787866113ba565b161061280b565b90916003905f84151580612abb575b612a73575b60c060ff6128ea612315612307858a8a612272565b1610612415578060f860ff61290961231561230761292f968b8b612272565b1610612a6a5760ff61292861236161235c612315612307868c8c612272565b1690611287565b915f905b808210612a53575050609460ff612951612315612307868989612272565b1603612a44576001600160a01b03168282016001013560601c03612a35576129789061126b565b9161298a612315612307858486612272565b925f9260ff851694608086105f146129bb5750505050505b036129ac57600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f146129d45750505050505f6129a2565b6123666129e391939293612291565b915f935b8385106129f85750505050506129a2565b9091929394612a0960019160081b90565b612a29612366612315612307612a228b6117f38b611249565b8789612272565b179501939291906129e7565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092612a626001918787612ad7565b930190612933565b60ff6001612928565b509050612a8661231561230785856113ba565b6001919060ff16808303612a9d57506004916128d5565b600203612aac576005916128d5565b636fc3daa360e11b5f5260045ffd5b50608060ff612ad061231561230789896113ba565b16106128d0565b919080821015612c3257612af2612315612307848487612272565b9060ff82166080811015612b0d575050506115479150611249565b91929160b8811015612b355750506115479250612366612b2f61236c92611249565b92612291565b90929060c0811015612bab5750612366612b51919493946122b7565b915f935f915b848310612b725750505061154792916117f36117f392611249565b909194612b8160019160081b90565b612ba1612366612315612307612b9a8b6117f38b611249565b8888612272565b1795019190612b57565b90929060f81115612bd157506115479250612366612bcb61236c92611249565b926122a4565b9291612366612bdf9161227e565b915f935f915b848310612c005750505061154792916117f36117f392611249565b909194612c0f60019160081b90565b612c28612366612315612307612b9a8b6117f38b611249565b1795019190612be5565b6318d76ae160e11b5f5260045ffd5b91949392948060c060ff612c5c61231561230785888a612272565b16106124155760f860ff612c7761231561230785888a612272565b1610612cf257508061236c61236661236161235c612315612307612c9c97898b612272565b945b609460ff612cb36123156123078a8789612272565b1603612a44576001600160a01b03168286016001013560601c03612ce357612cdd6115479561126b565b916131d6565b63a087f96f60e01b5f5260045ffd5b612cfc9150611249565b94612c9e565b600a548015612d55575f19810190600a548210156109e257600a5f8190527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a790910180546001600160a01b031916905555565b634e487b7160e01b5f52603160045260245ffd5b6001600160a01b0381165f908152600960205260409020548015611f45575f19810181811161125757600a54915f19830183811161125757808303612dd6575b50505050612dd35f91612dba612d02565b6001600160a01b03165f90815260096020526040902090565b55565b928094929310156109e257612e2d611f0f612dba612dd395612e257fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a75f99600a8b52015460018060a01b031690565b9283916112ac565b55915f80612da9565b612e4082826130be565b915f5b60088110612ed15750612e5d612315612307858486612272565b925f9260ff851694608086105f14612e7757505050505090565b612e88919394955061236690612291565b915f935b838510612e9b57505050505090565b9091929394612eac60019160081b90565b612ec5612366612315612307612a228b6117f38b611249565b17950193929190612e8c565b92612edf6001918385612ad7565b9301612e43565b8051156109e25760200190565b9081518110156109e2570160200190565b919390929190600360fe1b6001600160f81b0319612f2561230786896113ba565b16106130af57601f60fb1b6001600160f81b0319612f4661230786896113ba565b16106130a557612f6a612f6561236661235c612315612307888b6113ba565b611279565b9492905b945f5b828210612f8357505050505050505f90565b612fa1612f9a83612f9536878a6125e0565b6133c7565b9093611287565b96825160208401200361304357600360fe1b612fdd612fd0612fc285612ee6565b516001600160f81b03191690565b6001600160f81b03191690565b10613043578590846001601f60fb1b612ffb612fd0612fc288612ee6565b1015613087575b61300c818661356e565b6011810361304e575061301e946136de565b9491156130435784156130375793915b91959093612f71565b50505050505050600190565b505050505050505f90565b90935060021415905061307b5784879261306794613599565b94911561304357841561303757939161302e565b50505050505050505f90565b506130a0612f6561236661235c612315612fc289612ee6565b613002565b6001949290612f6e565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b03196130da61230786866113ba565b161061277a57601f60fb1b6001600160f81b03196130fb61230786866113ba565b16106131cd578061236c61236661236161235c61231561230761311f978a8a612272565b905b61a5bd461480156131c2575b613138575b50905090565b5f5b600381106131ad5750600360fe1b613159612fd0612307858786612272565b1061277a57601f60fb1b613174612fd0612307858786612272565b1061319d5761236661236161235c612315612307866131969861236c97612272565b805f613132565b506131a89150611249565b613196565b916131bb6001918584612ad7565b920161313a565b5061a5bf461461312d565b50600190613121565b929190918160c060ff6131f061231561230787898b612272565b16106124155760f860ff61320b61231561230787898b612272565b161061336e578061236c61236661236161235c61231561230761322f978b8d612272565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61325b8286886137f3565b0361335f57611de0611de061327e61327761328594888a612ad7565b8789612ad7565b86886137f3565b6001600160a01b03918216911603613350576132a2908284612ad7565b905f916132b6612315612307838588612272565b60ff8116949060808610156132d4575050505050036129ac57600190565b9091929394608081145f146132ef575050505050505f6129a2565b60a0106124155761236661330591939293612291565b915f935b83851061331a5750505050506129a2565b909192939461332b60019160081b90565b613344612366612315612307612a228b6117f38b611249565b17950193929190613309565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b5061337882611249565b61322f565b6040805190919061338e8382611195565b6001815291601f1901366020840137565b906133a982611c63565b6133b66040519182611195565b82815280926111fc601f1991611c63565b8051821015612c32576133e0612315612fc28484612ef3565b9160ff83166080811015613419575050506133f961337d565b9060f81b6001600160f81b0319165f1a61341282612ee6565b5390600190565b919392909160b8811015613483575061236661343491612291565b9061343e8261339f565b935f5b8381106134545750505061154790611279565b80613470612fc261346a6001946117f388611249565b85612ef3565b5f1a61347c8289612ef3565b5301613441565b60c0111561352157612366613497916122b7565b5f915f5b8281106134f357506134ac8361339f565b945f5b8481106134c657505050906117f361154792611279565b806134e0612fc261346a6001946117f3896117f38a611249565b5f1a6134ec828a612ef3565b53016134af565b9260019060081b613519612366612315612fc2613513896117f389611249565b8b612ef3565b17930161349b565b509161352d838261382f565b926135378461339f565b915f5b858110613548575050509190565b8061355b612fc261346a60019487611287565b5f1a6135678287612ef3565b530161353a565b5f92915b8151811015611f4557613585818361382f565b810180911161125757600190930192613572565b839492916135a781836133c7565b93906135c660206135bd612315612fc285612ee6565b1615159161395c565b9788911561366857506135da905187611287565b6135e48251611e59565b146135f9575b505050505050505f905f905f90565b86866001928251613656575b505050613613575b806135ea565b6136269261362091611287565b906133c7565b5060208151910120906020815191012014613644578080808061360d565b61364f915190611287565b6001915f90565b6136609350613ac5565b86865f613605565b613679939495965061036a92613ac5565b6136d15761368a9261362091611287565b50908151602081145f146136b1575060206136a9920151925190611287565b916001929190565b80156136c55760206136a993012092610855565b505050505f905f905f90565b50505050505f905f905f90565b919092936136ec8251611e59565b8510156137965750612315612fc261370e926137088760011c90565b90612ef3565b6001841661378d5760041c600f16915b905f925b60ff8116841061376d575061373792506133c7565b5080518015613762576136a991602082036137585760209150015191611249565b6020012091611249565b5050505f905f905f90565b909160016137818261236c60ff948761382f565b94019392919050613722565b600f169161371e565b9290509392935f915b601083106137d9576137b192506133c7565b50602081519101209060208151910120145f146137d057600191905f90565b5f915081908190565b906137ea8161236c6001938561382f565b9201919061379f565b9190600560fd1b906001600160f81b03199061381190849086612272565b35160361382057016001013590565b63f0ff325b60e01b5f5260045ffd5b908151811015612c3257613849612315612fc28385612ef3565b9160ff831660808110156138605750505050600190565b60b881101561387b5750505061236661236161154792612291565b60c08110156138e7575091612366613892916122b7565b905f925f915b8383106138af57505050906117f361154792611279565b9091936138be60019160081b90565b6138dd612366612315612fc26138d78a6117f389611249565b88612ef3565b1794019190613898565b60f81115613900575050612366612361611547926122a4565b9161236661390d9161227e565b905f925f915b83831061392a57505050906117f361154792611279565b90919361393960019160081b90565b613952612366612315612fc26138d78a6117f389611249565b1794019190613913565b9081511561131c57613973612315612fc284612ee6565b6010811615613a425761399661399161398c8551611e59565b611974565b61339f565b9060f81b600f60f81b165f1a6139ab82612ee6565b5360015b8351811015613a3d57806139ea6139da6139d1612315612fc26001968a612ef3565b60041c600f1690565b60f81b6001600160f81b03191690565b613a036139f961398c84611e59565b915f1a9185612ef3565b53613a2a600f613a19612315612fc2858a612ef3565b1660f81b6001600160f81b03191690565b613a366139f983611e59565b53016139af565b509150565b50613a58613991613a538451611e59565b611982565b60015b8351811015613a3d5780613a7d6139da6139d1612315612fc26001968a612ef3565b613a916139f9613a8c84611974565b611e59565b53613aa7600f613a19612315612fc2858a612ef3565b613abe6139f9613ab9613a8c85611974565b611249565b5301613a5b565b919091613ad3825184611287565b613add8251611e59565b10611fbb575f5b8251811015613b6d57613b00613afa8286611287565b60011690565b613b4f57613b236139d1612315612fc2613b1d610eec868a611287565b86612ef3565b60ff613b38612366612315612fc28689612ef3565b911603613b4757600101613ae4565b505050505f90565b600f613b67612315612fc2613b1d610eec868a611287565b16613b23565b5050505060019056fea26469706673582212202eab8a871addb0e2a60cd81dda39cde315a291a561b424c2c36a1abc9ad6474764736f6c634300081e0033 diff --git a/flake.nix b/flake.nix index 8dceabd..2c51b66 100644 --- a/flake.nix +++ b/flake.nix @@ -27,6 +27,7 @@ devShells.${system}.default = pkgs.mkShell { packages = with pkgs; [ foundry + jq (inputs.solc.mkDefault pkgs solc_0_8_30) ]; }; diff --git a/out/EscrowERC20.sol/EscrowERC20.json b/out/EscrowERC20.sol/EscrowERC20.json index 86bf7ba..fa98a0d 100644 --- a/out/EscrowERC20.sol/EscrowERC20.json +++ b/out/EscrowERC20.sol/EscrowERC20.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"_tokenContract","type":"address","internalType":"address"},{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[{"name":"_bondAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancelAndWithdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowERC20.ReceiptProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"proofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptPath","type":"bytes","internalType":"bytes"},{"name":"logIndex","type":"uint256","internalType":"uint256"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"tokenContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedBytes32","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTransferEvent","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"ToAddressMismatch","inputs":[]},{"type":"error","name":"TokenTransferFailed","inputs":[]},{"type":"error","name":"WrongEventSignature","inputs":[]},{"type":"error","name":"WrongTokenContract","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x61010080604052346101c15760a08161231b80380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b60405161209e908161027d82396080518181816101660152818161040c015281816105790152610a87015260a05181818161045e015261084c015260c0518181816101f2015261082a015260e05181818161028501528181610353015281816105000152818161061a0152818161086e01528181610f8501526110170152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633d2691bc1461013b57806355a373d6146101365780635a4fd645146101315780636b892b221461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b610961565b61093c565b6106f9565b6106dc565b6106b8565b610560565b6104aa565b61048d565b610449565b6103fa565b6103dd565b6102d0565b6102b4565b610270565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576102f2600160ff196007541617600755565b6102fa610a77565b610302610ab7565b61030a610aee565b61032161ff0019600754166007555f6001555f8055565b80156103ce5760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f9161039a575b501561038b57005b63022e258160e11b5f5260045ffd5b6103bc915060203d6020116103c2575b6103b48183610992565b8101906109b9565b5f610383565b503d6103aa565b6109d1565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104c6610b00565b6104cf81610b49565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f91610541575b501561038b5761053f90610ba4565b005b61055a915060203d6020116103c2576103b48183610992565b5f610530565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff166106a957811561069a57801561068b576105cf826105d4935f55600255565b600155565b61061560206105e860025460015490610a1f565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f9161066c575b501561038b5761053f61010061ff00196007541617600755565b610685915060203d6020116103c2576103b48183610992565b5f610652565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106d2610a2c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af5760243561073b8280610a44565b6007546107509060081c60ff161590565b1590565b61092d57600354610771906001600160a01b03165b6001600160a01b031690565b331480159061091c575b61090d574383116108fe576101006107938443610be9565b116108ef57824080156108e0576107ab368385610c12565b60208151910120036108d1576107c091611074565b036108c2576107d86107d28280610a44565b90610c76565b9161081261074c60248301946107ee8686610a44565b906107fc6044870188610a44565b9061080a606489018a610a44565b949093610ce6565b6108b35760846108286108989461074c94610a44565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d6a565b6108a45761053f610f04565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061092861074c610a2c565b61077b565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109b457604052565b61097e565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109fe57565b6109dc565b60010190816001116109fe57565b90601582018092116109fe57565b919082018092116109fe57565b6004548015159081610a3c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561092d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610abf610a2c565b610adf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109fe5790565b6004548015159081610b3f575b50610b1457565b6005545f548181018091116109fe575f556006549081018091116109fe57600655610b3d610ab7565b565b905042115f610b0d565b60075460ff8160081c161561092d5760ff16610b9557610b67610a2c565b610b86575f5460011c11610b7757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109fe57600455600555565b6001198101919082116109fe57565b5f198101919082116109fe57565b919082039182116109fe57565b67ffffffffffffffff81116109b457601f01601f191660200190565b929192610c1e82610bf6565b91610c2c6040519384610992565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c655790565b610c48565b90821015610c65570190565b90610c818183611130565b905f5b60058110610cd15750600560fd1b906001600160f81b031990610ca990849086610c6a565b351603610cc2576001810181116109fe57016001013590565b633954003560e11b5f5260045ffd5b91610cdf6001918386611264565b9201610c84565b610cfc610d0492939495610d0a98973691610c12565b923691610c12565b906113ec565b90565b60ff60f6199116019060ff82116109fe57565b60ff607f199116019060ff82116109fe57565b60ff60bf199116019060ff82116109fe57565b60ff60b6199116019060ff82116109fe57565b60ff166001019060ff82116109fe57565b9594939291905f818881151580610ee8575b610eda575b610daa610da4610d968560c09560ff95610c6a565b356001600160f81b03191690565b60f81c90565b1610610ea457808860f860ff610dc8610da4610d9688978887610c6a565b1610610eca57610df5610df0610deb610da4610d9686610e0198610dfb97610c6a565b610d0d565b610d59565b60ff1690565b90610a1f565b81885f5b60038110610eb35750610df5610da4610d968560c095610e2495610c6a565b10610ea457808860f8610e42610df5610da4610d9688978887610c6a565b10610e9357610df5610df0610deb610da4610d9686610e6498610dfb97610c6a565b915b5f905b808210610e7c575050610d0a9596611599565b9092610e8b600191848b611264565b930190610e69565b50610e9e91506109f0565b91610e66565b631bd5dcf760e31b5f5260045ffd5b92600192610ec092611264565b9101888391610e05565b50610ed591506109f0565b610e01565b506001915082905088610d81565b50608060ff610efd610da4610d968686610c5c565b1610610d7c565b610f0c611669565b6003546001600160a01b0316610f496001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fe557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91610fc6575b505b1561038b57565b610fdf915060203d6020116103c2576103b48183610992565b5f610fbd565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91611055575b50610fbf565b61106e915060203d6020116103c2576103b48183610992565b5f61104f565b61107e8282611130565b915f5b6008811061111b575061109b610da4610d96858486610c6a565b925f9260ff851694608086105f146110b557505050505090565b6110c69193949550610df590610d20565b915f935b8385106110d957505050505090565b90919293946110ea60019160081b90565b61110f610df5610da4610d966111088b6111038b6109f0565b610a1f565b8789610c6a565b179501939291906110ca565b926111296001918385611264565b9301611081565b5f600360fe1b6001600160f81b031961114c610d968686610c5c565b161061122c57601f60fb1b6001600160f81b031961116d610d968686610c5c565b161061125b5780610dfb610df5610df0610deb610da4610d96611191978a8a610c6a565b905b61a5bd46148015611250575b6111aa575b50905090565b5f5b6003811061123b5750600360fe1b6111d86111cb610d96858786610c6a565b6001600160f81b03191690565b1061122c57601f60fb1b6111f36111cb610d96858786610c6a565b1061121c57610df5610df0610deb610da4610d968661121598610dfb97610c6a565b805f6111a4565b5061122791506109f0565b611215565b63c0098bd960e01b5f5260045ffd5b916112496001918584611264565b92016111ac565b5061a5bf461461119f565b50600190611193565b9190808210156113bf5761127f610da4610d96848487610c6a565b9060ff8216608081101561129a57505050610d0a91506109f0565b91929160b88110156112c2575050610d0a9250610df56112bc610dfb926109f0565b92610d20565b90929060c08110156113385750610df56112de91949394610d46565b915f935f915b8483106112ff57505050610d0a9291611103611103926109f0565b90919461130e60019160081b90565b61132e610df5610da4610d966113278b6111038b6109f0565b8888610c6a565b17950191906112e4565b90929060f8111561135e5750610d0a9250610df5611358610dfb926109f0565b92610d33565b9291610df561136c91610d0d565b915f935f915b84831061138d57505050610d0a9291611103611103926109f0565b90919461139c60019160081b90565b6113b5610df5610da4610d966113278b6111038b6109f0565b1795019190611372565b6318d76ae160e11b5f5260045ffd5b805115610c655760200190565b908151811015610c65570160200190565b919390929190600360fe1b6001600160f81b031961140d610d968689610c5c565b161061158a57601f60fb1b6001600160f81b031961142e610d968689610c5c565b16106115805761145261144d610df5610deb610da4610d96888b610c5c565b610a03565b9492905b945f5b82821061146b57505050505050505f90565b6114896114828361147d36878a610c12565b6116da565b9093610a1f565b96825160208401200361151e57600360fe1b6114b86111cb6114aa856113ce565b516001600160f81b03191690565b1061151e578590846001601f60fb1b6114d66111cb6114aa886113ce565b1015611562575b6114e78186611881565b6011810361152957506114f994611a0c565b94911561151e5784156115125793915b91959093611459565b50505050505050600190565b505050505050505f90565b90935060021415905061155657848792611542946118c6565b94911561151e578415611512579391611509565b50505050505050505f90565b5061157b61144d610df5610deb610da46114aa896113ce565b6114dd565b6001949290611456565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115b4610da4610d9685888a610c6a565b1610610ea45760f860ff6115cf610da4610d9685888a610c6a565b1610611659575080610dfb610df5610df0610deb610da4610d966115f497898b610c6a565b945b609460ff61160b610da4610d968a8789610c6a565b160361164a576001600160a01b03168286016001013560601c0361163b57611635610d0a95610a11565b91611b21565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61166391506109f0565b946115f6565b6005545f5481018091116109fe5760015481018091116109fe5790565b604080519091906116978382610992565b6001815291601f1901366020840137565b906116b282610bf6565b6116bf6040519182610992565b82815280926116d0601f1991610bf6565b0190602036910137565b80518210156113bf576116f3610da46114aa84846113db565b9160ff8316608081101561172c5750505061170c611686565b9060f81b6001600160f81b0319165f1a611725826113ce565b5390600190565b919392909160b88110156117965750610df561174791610d20565b90611751826116a8565b935f5b83811061176757505050610d0a90610a03565b806117836114aa61177d600194611103886109f0565b856113db565b5f1a61178f82896113db565b5301611754565b60c0111561183457610df56117aa91610d46565b5f915f5b82811061180657506117bf836116a8565b945f5b8481106117d95750505090611103610d0a92610a03565b806117f36114aa61177d600194611103896111038a6109f0565b5f1a6117ff828a6113db565b53016117c2565b9260019060081b61182c610df5610da46114aa61182689611103896109f0565b8b6113db565b1793016117ae565b50916118408382611cd8565b9261184a846116a8565b915f5b85811061185b575050509190565b8061186e6114aa61177d60019487610a1f565b5f1a61187a82876113db565b530161184d565b5f92915b81518110156118ac576118988183611cd8565b81018091116109fe57600190930192611885565b5050565b908160011b91808304600214901517156109fe57565b839492916118d481836116da565b93906118f360206118ea610da46114aa856113ce565b16151591611e05565b978891156119955750611907905187610a1f565b61191182516118b0565b14611926575b505050505050505f905f905f90565b86866001928251611983575b505050611940575b80611917565b6119539261194d91610a1f565b906116da565b5060208151910120906020815191012014611971578080808061193a565b61197c915190610a1f565b6001915f90565b61198d9350611f6e565b86865f611932565b6119a6939495965061074c92611f6e565b6119ff576119b79261194d91610a1f565b50908151602081145f146119df575060206119d7920151925b5190610a1f565b916001929190565b80156119f35760206119d7930120926119d0565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a1a82516118b0565b851015611ac45750610da46114aa611a3c92611a368760011c90565b906113db565b60018416611abb5760041c600f16915b905f925b60ff81168410611a9b5750611a6592506116da565b5080518015611a90576119d79160208203611a8657602091500151916109f0565b60200120916109f0565b5050505f905f905f90565b90916001611aaf82610dfb60ff9487611cd8565b94019392919050611a50565b600f1691611a4c565b9290509392935f915b60108310611b0757611adf92506116da565b50602081519101209060208151910120145f14611afe57600191905f90565b5f915081908190565b90611b1881610dfb60019385611cd8565b92019190611acd565b929190918160c060ff611b3b610da4610d9687898b610c6a565b1610610ea45760f860ff611b56610da4610d9687898b610c6a565b1610611cc95780610dfb610df5610df0610deb610da4610d96611b7a978b8d610c6a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611ba682868861202c565b03611cba57610765610765611bc9611bc2611bd094888a611264565b8789611264565b868861202c565b6001600160a01b03918216911603611cab57611bed908284611264565b905f91611c01610da4610d96838588610c6a565b60ff811694906080861015611c2f5750505050505b03611c2057600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c4a575050505050505f611c16565b60a010610ea457610df5611c6091939293610d20565b915f935b838510611c75575050505050611c16565b9091929394611c8660019160081b90565b611c9f610df5610da4610d966111088b6111038b6109f0565b17950193929190611c64565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cd3826109f0565b611b7a565b9081518110156113bf57611cf2610da46114aa83856113db565b9160ff83166080811015611d095750505050600190565b60b8811015611d2457505050610df5610df0610d0a92610d20565b60c0811015611d90575091610df5611d3b91610d46565b905f925f915b838310611d585750505090611103610d0a92610a03565b909193611d6760019160081b90565b611d86610df5610da46114aa611d808a611103896109f0565b886113db565b1794019190611d41565b60f81115611da9575050610df5610df0610d0a92610d33565b91610df5611db691610d0d565b905f925f915b838310611dd35750505090611103610d0a92610a03565b909193611de260019160081b90565b611dfb610df5610da46114aa611d808a611103896109f0565b1794019190611dbc565b90815115610b3d57611e1c610da46114aa846113ce565b6010811615611eeb57611e3f611e3a611e3585516118b0565b610bdb565b6116a8565b9060f81b600f60f81b165f1a611e54826113ce565b5360015b8351811015611ee65780611e93611e83611e7a610da46114aa6001968a6113db565b60041c600f1690565b60f81b6001600160f81b03191690565b611eac611ea2611e35846118b0565b915f1a91856113db565b53611ed3600f611ec2610da46114aa858a6113db565b1660f81b6001600160f81b03191690565b611edf611ea2836118b0565b5301611e58565b509150565b50611f01611e3a611efc84516118b0565b610bcc565b60015b8351811015611ee65780611f26611e83611e7a610da46114aa6001968a6113db565b611f3a611ea2611f3584610bdb565b6118b0565b53611f50600f611ec2610da46114aa858a6113db565b611f67611ea2611f62611f3585610bdb565b6109f0565b5301611f04565b919091611f7c825184610a1f565b611f8682516118b0565b10612025575f5b825181101561201c57611fa9611fa38286610a1f565b60011690565b611ffe57611fd2611e7a610da46114aa611fcc611fc6868a610a1f565b60011c90565b866113db565b60ff611fe7610df5610da46114aa86896113db565b911603611ff657600101611f8d565b505050505f90565b600f612016610da46114aa611fcc611fc6868a610a1f565b16611fd2565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061204a90849086610c6a565b35160361205957016001013590565b63f0ff325b60e01b5f5260045ffdfea264697066735822122028c96b0e3c2075e4a273041c863c4e813c898fa651607c92e57dad2760f392cd64736f6c634300081e0033","sourceMap":"426:4679:21:-:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;1670:38:20;426:4679:21;1670:38:20;1718:32;;1778:10;426:4679:21;1760:28:20;426:4679:21;;;;;;;1437:28;;;1433:54;;1497:30;;1542:24;;;;:53;;;-1:-1:-1;1538:133:21;;-1:-1:-1;426:4679:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1718:32:20;426:4679:21;;;;;;;;;;1497:30;426:4679;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:133;426:4679;1953:6;426:4679;;;;1949:34;;1993:56;;2063:26;;2059:58;;426:4679;-1:-1:-1;426:4679:21;;2180:43;426:4679;;;;;;;;;;;-1:-1:-1;426:4679:21;2292:106;426:4679;;;;;;;;;;;;2292:106;;1778:10:20;2292:106:21;;;426:4679;2347:4;426:4679;;;;;;;;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;1538:133;2291:107;;2287:174;;426:4679;;;1953:6;426:4679;;;1953:6;426:4679;1538:133;;;;;;2287:174;2429:21;;;-1:-1:-1;2429:21:21;2292:106;-1:-1:-1;2429:21:21;2292:106;;;426:4679;2292:106;;426:4679;2292:106;;;;;;426:4679;2292:106;;;:::i;:::-;;;426:4679;;;;;;;;;;;;2292:106;;;426:4679;-1:-1:-1;426:4679:21;;2292:106;;;-1:-1:-1;2292:106:21;;;426:4679;;;-1:-1:-1;426:4679:21;;;;;;;;;-1:-1:-1;426:4679:21;;;;;-1:-1:-1;426:4679:21;2059:58;2098:19;;;-1:-1:-1;2098:19:21;;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;;-1:-1:-1;1968:15:21;1542:53;1570:25;;;;1542:53;;1433:54;1474:13;;;-1:-1:-1;1474:13:21;;-1:-1:-1;1474:13:21;426:4679;;;;;-1:-1:-1;;426:4679:21;;;;-1:-1:-1;;;;;426:4679:21;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;426:4679:21;;;;;-1:-1:-1;426:4679:21;;;;-1:-1:-1;;;;;426:4679:21;;;;;;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633d2691bc1461013b57806355a373d6146101365780635a4fd645146101315780636b892b221461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b610961565b61093c565b6106f9565b6106dc565b6106b8565b610560565b6104aa565b61048d565b610449565b6103fa565b6103dd565b6102d0565b6102b4565b610270565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576102f2600160ff196007541617600755565b6102fa610a77565b610302610ab7565b61030a610aee565b61032161ff0019600754166007555f6001555f8055565b80156103ce5760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f9161039a575b501561038b57005b63022e258160e11b5f5260045ffd5b6103bc915060203d6020116103c2575b6103b48183610992565b8101906109b9565b5f610383565b503d6103aa565b6109d1565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104c6610b00565b6104cf81610b49565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f91610541575b501561038b5761053f90610ba4565b005b61055a915060203d6020116103c2576103b48183610992565b5f610530565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff166106a957811561069a57801561068b576105cf826105d4935f55600255565b600155565b61061560206105e860025460015490610a1f565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f9161066c575b501561038b5761053f61010061ff00196007541617600755565b610685915060203d6020116103c2576103b48183610992565b5f610652565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106d2610a2c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af5760243561073b8280610a44565b6007546107509060081c60ff161590565b1590565b61092d57600354610771906001600160a01b03165b6001600160a01b031690565b331480159061091c575b61090d574383116108fe576101006107938443610be9565b116108ef57824080156108e0576107ab368385610c12565b60208151910120036108d1576107c091611074565b036108c2576107d86107d28280610a44565b90610c76565b9161081261074c60248301946107ee8686610a44565b906107fc6044870188610a44565b9061080a606489018a610a44565b949093610ce6565b6108b35760846108286108989461074c94610a44565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d6a565b6108a45761053f610f04565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061092861074c610a2c565b61077b565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109b457604052565b61097e565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109fe57565b6109dc565b60010190816001116109fe57565b90601582018092116109fe57565b919082018092116109fe57565b6004548015159081610a3c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561092d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610abf610a2c565b610adf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109fe5790565b6004548015159081610b3f575b50610b1457565b6005545f548181018091116109fe575f556006549081018091116109fe57600655610b3d610ab7565b565b905042115f610b0d565b60075460ff8160081c161561092d5760ff16610b9557610b67610a2c565b610b86575f5460011c11610b7757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109fe57600455600555565b6001198101919082116109fe57565b5f198101919082116109fe57565b919082039182116109fe57565b67ffffffffffffffff81116109b457601f01601f191660200190565b929192610c1e82610bf6565b91610c2c6040519384610992565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c655790565b610c48565b90821015610c65570190565b90610c818183611130565b905f5b60058110610cd15750600560fd1b906001600160f81b031990610ca990849086610c6a565b351603610cc2576001810181116109fe57016001013590565b633954003560e11b5f5260045ffd5b91610cdf6001918386611264565b9201610c84565b610cfc610d0492939495610d0a98973691610c12565b923691610c12565b906113ec565b90565b60ff60f6199116019060ff82116109fe57565b60ff607f199116019060ff82116109fe57565b60ff60bf199116019060ff82116109fe57565b60ff60b6199116019060ff82116109fe57565b60ff166001019060ff82116109fe57565b9594939291905f818881151580610ee8575b610eda575b610daa610da4610d968560c09560ff95610c6a565b356001600160f81b03191690565b60f81c90565b1610610ea457808860f860ff610dc8610da4610d9688978887610c6a565b1610610eca57610df5610df0610deb610da4610d9686610e0198610dfb97610c6a565b610d0d565b610d59565b60ff1690565b90610a1f565b81885f5b60038110610eb35750610df5610da4610d968560c095610e2495610c6a565b10610ea457808860f8610e42610df5610da4610d9688978887610c6a565b10610e9357610df5610df0610deb610da4610d9686610e6498610dfb97610c6a565b915b5f905b808210610e7c575050610d0a9596611599565b9092610e8b600191848b611264565b930190610e69565b50610e9e91506109f0565b91610e66565b631bd5dcf760e31b5f5260045ffd5b92600192610ec092611264565b9101888391610e05565b50610ed591506109f0565b610e01565b506001915082905088610d81565b50608060ff610efd610da4610d968686610c5c565b1610610d7c565b610f0c611669565b6003546001600160a01b0316610f496001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fe557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91610fc6575b505b1561038b57565b610fdf915060203d6020116103c2576103b48183610992565b5f610fbd565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91611055575b50610fbf565b61106e915060203d6020116103c2576103b48183610992565b5f61104f565b61107e8282611130565b915f5b6008811061111b575061109b610da4610d96858486610c6a565b925f9260ff851694608086105f146110b557505050505090565b6110c69193949550610df590610d20565b915f935b8385106110d957505050505090565b90919293946110ea60019160081b90565b61110f610df5610da4610d966111088b6111038b6109f0565b610a1f565b8789610c6a565b179501939291906110ca565b926111296001918385611264565b9301611081565b5f600360fe1b6001600160f81b031961114c610d968686610c5c565b161061122c57601f60fb1b6001600160f81b031961116d610d968686610c5c565b161061125b5780610dfb610df5610df0610deb610da4610d96611191978a8a610c6a565b905b61a5bd46148015611250575b6111aa575b50905090565b5f5b6003811061123b5750600360fe1b6111d86111cb610d96858786610c6a565b6001600160f81b03191690565b1061122c57601f60fb1b6111f36111cb610d96858786610c6a565b1061121c57610df5610df0610deb610da4610d968661121598610dfb97610c6a565b805f6111a4565b5061122791506109f0565b611215565b63c0098bd960e01b5f5260045ffd5b916112496001918584611264565b92016111ac565b5061a5bf461461119f565b50600190611193565b9190808210156113bf5761127f610da4610d96848487610c6a565b9060ff8216608081101561129a57505050610d0a91506109f0565b91929160b88110156112c2575050610d0a9250610df56112bc610dfb926109f0565b92610d20565b90929060c08110156113385750610df56112de91949394610d46565b915f935f915b8483106112ff57505050610d0a9291611103611103926109f0565b90919461130e60019160081b90565b61132e610df5610da4610d966113278b6111038b6109f0565b8888610c6a565b17950191906112e4565b90929060f8111561135e5750610d0a9250610df5611358610dfb926109f0565b92610d33565b9291610df561136c91610d0d565b915f935f915b84831061138d57505050610d0a9291611103611103926109f0565b90919461139c60019160081b90565b6113b5610df5610da4610d966113278b6111038b6109f0565b1795019190611372565b6318d76ae160e11b5f5260045ffd5b805115610c655760200190565b908151811015610c65570160200190565b919390929190600360fe1b6001600160f81b031961140d610d968689610c5c565b161061158a57601f60fb1b6001600160f81b031961142e610d968689610c5c565b16106115805761145261144d610df5610deb610da4610d96888b610c5c565b610a03565b9492905b945f5b82821061146b57505050505050505f90565b6114896114828361147d36878a610c12565b6116da565b9093610a1f565b96825160208401200361151e57600360fe1b6114b86111cb6114aa856113ce565b516001600160f81b03191690565b1061151e578590846001601f60fb1b6114d66111cb6114aa886113ce565b1015611562575b6114e78186611881565b6011810361152957506114f994611a0c565b94911561151e5784156115125793915b91959093611459565b50505050505050600190565b505050505050505f90565b90935060021415905061155657848792611542946118c6565b94911561151e578415611512579391611509565b50505050505050505f90565b5061157b61144d610df5610deb610da46114aa896113ce565b6114dd565b6001949290611456565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115b4610da4610d9685888a610c6a565b1610610ea45760f860ff6115cf610da4610d9685888a610c6a565b1610611659575080610dfb610df5610df0610deb610da4610d966115f497898b610c6a565b945b609460ff61160b610da4610d968a8789610c6a565b160361164a576001600160a01b03168286016001013560601c0361163b57611635610d0a95610a11565b91611b21565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61166391506109f0565b946115f6565b6005545f5481018091116109fe5760015481018091116109fe5790565b604080519091906116978382610992565b6001815291601f1901366020840137565b906116b282610bf6565b6116bf6040519182610992565b82815280926116d0601f1991610bf6565b0190602036910137565b80518210156113bf576116f3610da46114aa84846113db565b9160ff8316608081101561172c5750505061170c611686565b9060f81b6001600160f81b0319165f1a611725826113ce565b5390600190565b919392909160b88110156117965750610df561174791610d20565b90611751826116a8565b935f5b83811061176757505050610d0a90610a03565b806117836114aa61177d600194611103886109f0565b856113db565b5f1a61178f82896113db565b5301611754565b60c0111561183457610df56117aa91610d46565b5f915f5b82811061180657506117bf836116a8565b945f5b8481106117d95750505090611103610d0a92610a03565b806117f36114aa61177d600194611103896111038a6109f0565b5f1a6117ff828a6113db565b53016117c2565b9260019060081b61182c610df5610da46114aa61182689611103896109f0565b8b6113db565b1793016117ae565b50916118408382611cd8565b9261184a846116a8565b915f5b85811061185b575050509190565b8061186e6114aa61177d60019487610a1f565b5f1a61187a82876113db565b530161184d565b5f92915b81518110156118ac576118988183611cd8565b81018091116109fe57600190930192611885565b5050565b908160011b91808304600214901517156109fe57565b839492916118d481836116da565b93906118f360206118ea610da46114aa856113ce565b16151591611e05565b978891156119955750611907905187610a1f565b61191182516118b0565b14611926575b505050505050505f905f905f90565b86866001928251611983575b505050611940575b80611917565b6119539261194d91610a1f565b906116da565b5060208151910120906020815191012014611971578080808061193a565b61197c915190610a1f565b6001915f90565b61198d9350611f6e565b86865f611932565b6119a6939495965061074c92611f6e565b6119ff576119b79261194d91610a1f565b50908151602081145f146119df575060206119d7920151925b5190610a1f565b916001929190565b80156119f35760206119d7930120926119d0565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a1a82516118b0565b851015611ac45750610da46114aa611a3c92611a368760011c90565b906113db565b60018416611abb5760041c600f16915b905f925b60ff81168410611a9b5750611a6592506116da565b5080518015611a90576119d79160208203611a8657602091500151916109f0565b60200120916109f0565b5050505f905f905f90565b90916001611aaf82610dfb60ff9487611cd8565b94019392919050611a50565b600f1691611a4c565b9290509392935f915b60108310611b0757611adf92506116da565b50602081519101209060208151910120145f14611afe57600191905f90565b5f915081908190565b90611b1881610dfb60019385611cd8565b92019190611acd565b929190918160c060ff611b3b610da4610d9687898b610c6a565b1610610ea45760f860ff611b56610da4610d9687898b610c6a565b1610611cc95780610dfb610df5610df0610deb610da4610d96611b7a978b8d610c6a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611ba682868861202c565b03611cba57610765610765611bc9611bc2611bd094888a611264565b8789611264565b868861202c565b6001600160a01b03918216911603611cab57611bed908284611264565b905f91611c01610da4610d96838588610c6a565b60ff811694906080861015611c2f5750505050505b03611c2057600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c4a575050505050505f611c16565b60a010610ea457610df5611c6091939293610d20565b915f935b838510611c75575050505050611c16565b9091929394611c8660019160081b90565b611c9f610df5610da4610d966111088b6111038b6109f0565b17950193929190611c64565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cd3826109f0565b611b7a565b9081518110156113bf57611cf2610da46114aa83856113db565b9160ff83166080811015611d095750505050600190565b60b8811015611d2457505050610df5610df0610d0a92610d20565b60c0811015611d90575091610df5611d3b91610d46565b905f925f915b838310611d585750505090611103610d0a92610a03565b909193611d6760019160081b90565b611d86610df5610da46114aa611d808a611103896109f0565b886113db565b1794019190611d41565b60f81115611da9575050610df5610df0610d0a92610d33565b91610df5611db691610d0d565b905f925f915b838310611dd35750505090611103610d0a92610a03565b909193611de260019160081b90565b611dfb610df5610da46114aa611d808a611103896109f0565b1794019190611dbc565b90815115610b3d57611e1c610da46114aa846113ce565b6010811615611eeb57611e3f611e3a611e3585516118b0565b610bdb565b6116a8565b9060f81b600f60f81b165f1a611e54826113ce565b5360015b8351811015611ee65780611e93611e83611e7a610da46114aa6001968a6113db565b60041c600f1690565b60f81b6001600160f81b03191690565b611eac611ea2611e35846118b0565b915f1a91856113db565b53611ed3600f611ec2610da46114aa858a6113db565b1660f81b6001600160f81b03191690565b611edf611ea2836118b0565b5301611e58565b509150565b50611f01611e3a611efc84516118b0565b610bcc565b60015b8351811015611ee65780611f26611e83611e7a610da46114aa6001968a6113db565b611f3a611ea2611f3584610bdb565b6118b0565b53611f50600f611ec2610da46114aa858a6113db565b611f67611ea2611f62611f3585610bdb565b6109f0565b5301611f04565b919091611f7c825184610a1f565b611f8682516118b0565b10612025575f5b825181101561201c57611fa9611fa38286610a1f565b60011690565b611ffe57611fd2611e7a610da46114aa611fcc611fc6868a610a1f565b60011c90565b866113db565b60ff611fe7610df5610da46114aa86896113db565b911603611ff657600101611f8d565b505050505f90565b600f612016610da46114aa611fcc611fc6868a610a1f565b16611fd2565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061204a90849086610c6a565b35160361205957016001013590565b63f0ff325b60e01b5f5260045ffdfea264697066735822122028c96b0e3c2075e4a273041c863c4e813c898fa651607c92e57dad2760f392cd64736f6c634300081e0033","sourceMap":"426:4679:21:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;426:4679:21;;;;2363:15:20;-1:-1:-1;;;;;426:4679:21;2349:10:20;:29;2345:56;;2411:27;426:4679:21;;-1:-1:-1;;426:4679:21;;;;2345:56:20;2387:14;;;426:4679:21;2387:14:20;426:4679:21;;2387:14:20;426:4679:21;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;1263:29:20;426:4679:21;;;-1:-1:-1;;;;;426:4679:21;;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;;963:39:20;426:4679:21;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;1407:31:20;426:4679:21;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;;1085:3:20;426:4679:21;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;735:38;-1:-1:-1;;;;;426:4679:21;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;4710:26;4732:4;426:4679;;4710:26;426:4679;;;4710:26;426:4679;;4710:26;;;:::i;:::-;;;:::i;:::-;4834:30;;:::i;:::-;4805:59;426:4679;;5686:14:20;426:4679:21;;5686:14:20;426:4679:21;5695:5:20;426:4679:21;;5695:5:20;426:4679:21;;5636:138:20;4805:59:21;4911:23;;4907:57;;426:4679;;-1:-1:-1;;;4980:62:21;;5011:10;426:4679;4980:62;;426:4679;;;;;;;;4980:62;426:4679;;;-1:-1:-1;;;;;;4987:13:21;426:4679;4980:62;;;;;;;426:4679;4980:62;;;426:4679;4979:63;;4975:122;;426:4679;4975:122;5065:21;;;426:4679;5065:21;426:4679;;5065:21;4980:62;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;4907:57::-;4943:21;;;426:4679;4943:21;426:4679;;4943:21;426:4679;;;;;;-1:-1:-1;;426:4679:21;;;;;1336:25:20;426:4679:21;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;2113:15:20;-1:-1:-1;;;;;426:4679:21;2099:10:20;:29;2095:56;;2161:26;426:4679:21;;-1:-1:-1;;426:4679:21;2183:4:20;426:4679:21;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;873:42:20;-1:-1:-1;;;;;426:4679:21;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;727:35:20;426:4679:21;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;2783:388;;:::i;:::-;2972:11;;;:::i;:::-;426:4679;;-1:-1:-1;;;3000:74:21;;3035:10;426:4679;3000:74;;426:4679;3055:4;426:4679;;;;;;;;;;;;;;-1:-1:-1;;;;;;3007:13:21;426:4679;3000:74;;;;;;;-1:-1:-1;3000:74:21;;;426:4679;2999:75;;2995:134;;3152:11;;;:::i;:::-;426:4679;3000:74;;;;426:4679;3000:74;426:4679;3000:74;;;;;;;:::i;:::-;;;;426:4679;;;;;;-1:-1:-1;;426:4679:21;;;;;;;;1901:15;-1:-1:-1;;;;;426:4679:21;1887:10;:29;1883:56;;1953:6;426:4679;;;;;1949:34;;1997:25;;1993:56;;2063:26;;2059:58;;2180:43;426:4679;2233:44;426:4679;-1:-1:-1;426:4679:21;2180:43;426:4679;;2180:43;2233:44;426:4679;;2233:44;2292:106;426:4679;2354:43;2180;426:4679;2233:44;426:4679;2354:43;;:::i;:::-;426:4679;;-1:-1:-1;;;2292:106:21;;1887:10;426:4679;2292:106;;426:4679;2347:4;426:4679;;;;;;;;;;;;;;;;;;;;;2292:106;;426:4679;-1:-1:-1;2299:13:21;-1:-1:-1;;;;;426:4679:21;2292:106;;;;;;;-1:-1:-1;2292:106:21;;;426:4679;2291:107;;2287:174;;2470:13;426:4679;;;1953:6;426:4679;;;1953:6;426:4679;;2292:106;;;;426:4679;2292:106;426:4679;2292:106;;;;;;;:::i;:::-;;;;2059:58;2098:19;;;-1:-1:-1;2098:19:21;426:4679;-1:-1:-1;2098:19:21;1993:56;2031:18;;;-1:-1:-1;2031:18:21;426:4679;-1:-1:-1;2031:18:21;1949:34;1968:15;;;-1:-1:-1;1968:15:21;426:4679;-1:-1:-1;1968:15:21;426:4679;;;;;;-1:-1:-1;;426:4679:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;768:35:20;426:4679:21;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;;;;;;;;;;;;;;;;;;;;;;3397:17;;;;:::i;:::-;2843:6:20;426:4679:21;2842:7:20;;426:4679:21;;;;2842:7:20;;426:4679:21;;2842:7:20;;426:4679:21;2842:7:20;2838:31;;2897:14;426:4679:21;2883:28:20;;-1:-1:-1;;;;;426:4679:21;;-1:-1:-1;;;;;426:4679:21;;;2883:28:20;:10;:28;;;:44;;;426:4679:21;2879:77:20;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;426:4679:21;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;3530:56:21;3568:17;;;;:::i;:::-;3530:56;;:::i;:::-;3632:16;3600:100;3601:99;426:4679;3632:16;;;;;;;:::i;:::-;3650;;;;;;;:::i;:::-;3668:17;;;;;;;:::i;:::-;3601:99;;;;:::i;3600:100::-;3596:159;;3887:14;3869:16;3808:157;3869:16;3809:156;3869:16;;:::i;:::-;3937:14;;3918:17;;3903:13;;3887:14;;426:4679;;3887:14;3809:156;:::i;3808:157::-;3804:217;;;;:::i;:::-;3988:22;;;-1:-1:-1;3988:22:21;426:4679;-1:-1:-1;3988:22:21;3596:159;3723:21;;;-1:-1:-1;3723:21:21;426:4679;-1:-1:-1;3723:21:21;3361:104:20;3444:21;;;-1:-1:-1;3444:21:20;426:4679:21;-1:-1:-1;3444:21:20;3276:75;3330:21;;;-1:-1:-1;3330:21:20;426:4679:21;-1:-1:-1;3330:21:20;3202:64;3244:22;;;-1:-1:-1;3244:22:20;426:4679:21;-1:-1:-1;3244:22:20;3042:85;3108:19;;;-1:-1:-1;3108:19:20;426:4679:21;-1:-1:-1;3108:19:20;2966:66;3011:21;;;-1:-1:-1;3011:21:20;426:4679:21;-1:-1:-1;3011:21:20;2879:77;2936:20;;;-1:-1:-1;2936:20:20;426:4679:21;-1:-1:-1;2936:20:20;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;2838:31;2858:11;;;-1:-1:-1;2858:11:20;426:4679:21;-1:-1:-1;2858:11:20;426:4679:21;;;;;;-1:-1:-1;;426:4679:21;;;;;;1444:18:20;426:4679:21;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:21;;;;;1367:34:20;426:4679:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;1814:1:25;426:4679:21;;;;;;;:::o;:::-;;:::i;:::-;1984:1:23;426:4679:21;;;1984:1:23;426:4679:21;;;:::o;:::-;;3908:2:25;426:4679:21;;;;;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;426:4679:21;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;426:4679:21:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5203:157:20:-;426:4679:21;5261:6:20;426:4679:21;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;426:4679:21;5301:10:20;:29;5297:56;;5203:157::o;3533:184::-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;426:4679:21;;3628:27:20;426:4679:21;;3628:27:20;426:4679:21;3653:1:20;3665:14;426:4679:21;3653:1:20;3689:21;426:4679:21;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;426:4679:21;5550:20:20;426:4679:21;;;;;;;;5438:139:20;:::o;3797:259::-;3850:17;426:4679:21;3850:21:20;;;:60;;;;3797:259;3846:204;;;3797:259::o;3846:204::-;3949:10;426:4679:21;-1:-1:-1;426:4679:21;;;;;;;;;-1:-1:-1;426:4679:21;3973:33:20;426:4679:21;;;;;;;;;3973:33:20;426:4679:21;3973:33:20;;:::i;:::-;3797:259::o;3850:60::-;3875:15;;;:35;3850:60;;;4115:318;4200:6;426:4679:21;;;;;;4199:7:20;4195:31;;426:4679:21;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;-1:-1:-1;426:4679:21;;;-1:-1:-1;4358:68:20;;4115:318::o;4358:68::-;4408:18;;;-1:-1:-1;4408:18:20;;-1:-1:-1;4408:18:20;4301:47;4325:23;;;-1:-1:-1;4325:23:20;;-1:-1:-1;4325:23:20;4236:55;4268:23;;;-1:-1:-1;4268:23:20;;-1:-1:-1;4268:23:20;4479:187;4558:10;-1:-1:-1;;;;;426:4679:21;;4541:27:20;426:4679:21;;;4541:27:20;426:4679:21;4616:9:20;4598:15;426:4679:21;4598:15:20;;426:4679:21;;;4578:47:20;426:4679:21;4635:24:20;426:4679:21;4479:187:20:o;426:4679:21:-;-1:-1:-1;;426:4679:21;;;;;;;;:::o;:::-;-1:-1:-1;;426:4679:21;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;426:4679:21;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;426:4679:21;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;3219:769:19:-;;3335:33;;;;:::i;:::-;3539:13;3551:1;3554:5;3558:1;3554:5;;;;-1:-1:-1;;;;426:4679:21;-1:-1:-1;;;;;;426:4679:21;3740:19:19;;426:4679:21;;3740:19:19;;:::i;:::-;;426:4679:21;3740:27:19;3736:60;;426:4679:21;;;;;;;3858:94:19;426:4679:21;3858:94:19;;;3219:769::o;3736:60::-;3776:20;;;3551:1;3776:20;;3551:1;3776:20;3539:13;3585:28;;426:4679:21;3585:28:19;;;;:::i;:::-;426:4679:21;;3539:13:19;;720:484:23;426:4679:21;;720:484:23;;;;1148:49;720:484;;426:4679:21;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;426:4679:21:-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1136:1511:25:-;;;;;;;1384:1;1444:21;;;;;:52;;;1136:1511;1440:123;;1136:1511;1609:25;1615:18;;;1637:4;1615:18;426:4679:21;1615:18:25;;:::i;:::-;;-1:-1:-1;;;;;;426:4679:21;;;1615:18:25;426:4679:21;;;;1609:25:25;426:4679:21;1609:32:25;1605:57;;1682:18;;1705:4;426:4679:21;1676:25:25;1682:18;;;;;;;:::i;1676:25::-;426:4679:21;1676:33:25;1705:4;;1735:38;1740:32;:25;1746:18;;;1725:48;1746:18;1725:48;1746:18;;:::i;1740:25::-;:32;:::i;:::-;1735:38;:::i;:::-;426:4679:21;;;;1725:48:25;;;:::i;:::-;1905:13;;1384:1;1920:5;1924:1;1920:5;;;;2097:18;2091:25;2097:18;;;1637:4;2097:18;2091:32;2097:18;;:::i;2091:32::-;;2087:57;;2164:18;;1705:4;2158:33;:25;2164:18;;;;;;;:::i;2158:33::-;;1705:4;;2217:38;2222:32;:25;2228:18;;;2207:48;2228:18;2207:48;2228:18;;:::i;2207:48::-;2154:154;;1384:1;2352:155;2372:12;;;;;;2559:81;;;;;;:::i;2357:13::-;2410:27;;;426:4679:21;2410:27:25;;;;:::i;:::-;426:4679:21;;2357:13:25;;;2154:154;2286:11;;;;;:::i;:::-;2154:154;;;2087:57;1650:12;;;1384:1;2132:12;;1384:1;2132:12;1905:13;1951:27;426:4679:21;1951:27:25;;;;:::i;:::-;426:4679:21;;1905:13:25;;;;;1672:154;1804:11;;;;;:::i;:::-;1672:154;;1440:123;-1:-1:-1;1522:1:25;;-1:-1:-1;1512:11:25;;-1:-1:-1;1512:11:25;1440:123;;1444:52;1475:13;1492:4;426:4679:21;1469:20:25;1475:13;;;;;:::i;1469:20::-;426:4679:21;1469:27:25;1444:52;;4053:490:21;4108:18;;:::i;:::-;4155:14;426:4679;-1:-1:-1;;;;;426:4679:21;4136:33;-1:-1:-1;;;;;426:4679:21;;4765:27:20;426:4679:21;;4765:27:20;426:4679:21;4790:1:20;4802:14;426:4679:21;4790:1:20;4826:21;426:4679:21;;;4857:14:20;426:4679:21;;4857:14:20;426:4679:21;4790:1:20;426:4679:21;;4790:1:20;426:4679:21;;4717:228:20;4136:33:21;4236:13;4253:8;4236:25;4253:8;;426:4679;;-1:-1:-1;;;4341:44:21;;-1:-1:-1;;;;;426:4679:21;;;4341:44;;;426:4679;;;;;;;;4341:44;426:4679;;;;;4341:44;426:4679;-1:-1:-1;4348:13:21;-1:-1:-1;;;;;426:4679:21;4341:44;;;;;;;-1:-1:-1;4341:44:21;;;4232:253;4331:54;4232:253;4498:8;4494:42;;4053:490::o;4341:44::-;;;;;;;;;;;;;;:::i;:::-;;;;4232:253;426:4679;;-1:-1:-1;;;4426:48:21;;-1:-1:-1;;;;;426:4679:21;;;4426:48;;;426:4679;;;;;;;;4426:48;426:4679;;;;;4426:48;426:4679;-1:-1:-1;4433:13:21;-1:-1:-1;;;;;426:4679:21;4426:48;;;;;;;-1:-1:-1;4426:48:21;;;4232:253;4416:58;4232:253;;4426:48;;;;;;;;;;;;;;:::i;:::-;;;;2036:1012:19;2151:33;;;;:::i;:::-;2386:13;426:4679:21;2401:5:19;2405:1;2401:5;;;;2616:19;2610:26;2616:19;;;;;;:::i;2610:26::-;2646:19;426:4679:21;;;;;2679:13:19;2688:4;2679:13;;2675:338;2688:4;;;2708:20;;;;;2036:1012;:::o;2675:338::-;2759:27;2773:13;;;;;;;;:::i;2759:27::-;2805:13;426:4679:21;2800:203:19;2820:7;;;;;;2675:338;;;;;2036:1012;:::o;2805:13::-;2863:16;;;;;;426:4679:21;2863:16:19;426:4679:21;;;;2863:16:19;2862:55;2883:34;2889:27;;2901:14;:10;;;;:::i;:::-;:14;:::i;:::-;2889:27;;;:::i;2862:55::-;;426:4679:21;;2805:13:19;;;;;;2386;2432:28;;426:4679:21;2432:28:19;;;;:::i;:::-;426:4679:21;;2386:13:19;;738:1134;854:1;-1:-1:-1;;;;;;;;;908:19:19;;;;;:::i;:::-;426:4679:21;908:26:19;904:55;;-1:-1:-1;;;;;;;;;973:19:19;;;;;:::i;:::-;426:4679:21;973:27:19;426:4679:21;;1037:19:19;1016:49;1026:39;1031:33;:26;1037:19;;1016:49;1037:19;;;;:::i;1016:49::-;969:149;;1221:5;1204:13;:22;:48;;;;969:149;1200:642;;969:149;1852:13;;;738:1134;:::o;1200:642::-;854:1;1380:5;1384:1;1380:5;;;;-1:-1:-1;;;;1602:26:19;:19;;;;;;:::i;:::-;-1:-1:-1;;;;;;426:4679:21;;;1602:26:19;;1598:55;;-1:-1:-1;;;1671:27:19;:19;;;;;;:::i;:27::-;;426:4679:21;;1728:39:19;1733:33;:26;1739:19;;;1718:49;1739:19;1718:49;1739:19;;:::i;1718:49::-;1200:642;;;;1667:165;1806:11;;;;;:::i;:::-;1667:165;;1598:55;943:16;;;854:1;1637:16;;854:1;1637:16;1365:13;1415:28;;426:4679:21;1415:28:19;;;;:::i;:::-;426:4679:21;;1365:13:19;;1204:48;:13;1247:5;1204:13;1230:22;1204:48;;969:149;1096:11;1522:1:25;969:149:19;;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;426:4679:21;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;426:4679:21;1103:13:24;426:4679:21;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;426:4679:21;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;426:4679:21;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;426:4679:21;1598:13:24;426:4679:21;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;426:4679:21;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;426:4679:21;;1598:13:24;;;;638:56;672:22;;;426:4679:21;672:22:24;;426:4679:21;672:22:24;426:4679:21;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1567:2467:23:-;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;426:4679:21;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;426:4679:21;1870:21:23;426:4679:21;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;426:4679:21;2184:31:23;;;;;;4015:12;;;;;;;426:4679:21;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;426:4679:21;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;426:4679:21;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;426:4679:21;-1:-1:-1;;;;;;426:4679:21;;;2641:15:23;;426:4679:21;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;426:4679:21;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;426:4679:21;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;426:4679:21;1838:17:23;;426:4679:21;1838:17:23;3008:1033:25;;;;;;3233:26;3357:4;426:4679:21;3329:25:25;3335:18;;;;;;:::i;3329:25::-;426:4679:21;3329:32:25;3325:57;;3425:4;426:4679:21;3396:25:25;3402:18;;;;;;:::i;3396:25::-;426:4679:21;3396:33:25;3425:4;;3466:18;;3445:48;3455:38;3460:32;:25;3466:18;;3445:48;3466:18;;;;:::i;3445:48::-;3392:154;;3653:4;426:4679:21;3624:25:25;3630:18;;;;;;:::i;3624:25::-;426:4679:21;3624:33:25;3620:62;;-1:-1:-1;;;;;426:4679:21;3717:105:25;;;426:4679:21;3717:105:25;;;;3835:24;3831:57;;3898:12;3965:69;3898:12;;:::i;:::-;3965:69;;:::i;3831:57::-;3868:20;;;-1:-1:-1;3868:20:25;;-1:-1:-1;3868:20:25;3620:62;3666:16;;;;;;;;3392:154;3524:11;;;;:::i;:::-;3392:154;;;5001:139:20;5078:10;426:4679:21;-1:-1:-1;426:4679:21;;;;;;;;5113:20:20;426:4679:21;;;;;;;;5001:139:20;:::o;426:4679:21:-;;;;;;;;;;;:::i;:::-;2457:1:24;426:4679:21;;;-1:-1:-1;;426:4679:21;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;2143:1860:24:-;426:4679:21;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;426:4679:21;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;:::-;426:4679:21;;;-1:-1:-1;;;;;;426:4679:21;;2473:26:24;;426:4679:21;2473:26:24;:::i;:::-;;2513:18;2457:1;2513:18;:::o;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;426:4679:21;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;426:4679:21;2757:32:24;;;;;:::i;:::-;;426:4679:21;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;426:4679:21;3078:13:24;426:4679:21;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;426:4679:21;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;426:4679:21;3384:46:24;;;;;:::i;:::-;;426:4679:21;3338:13:24;;3078;3139:11;3174:1;;426:4679:21;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;426:4679:21;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;426:4679:21;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;426:4679:21;3848:10:24;;;:::i;3843:16::-;426:4679:21;3831:28:24;;;;;:::i;:::-;;426:4679:21;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;426:4679:21;;4410:20:23;;;;;4456:26;;;;:::i;:::-;426:4679:21;;;;;;;;4446:36:23;426:4679:21;;4403:153:23;;;4410:20;;;4233:351::o;426:4679:21:-;;;;;;;;;7928:1:23;426:4679:21;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;426:4679:21;7885:26:23;426:4679:21;;7885:26:23;;:::i;:::-;7915:14;426:4679:21;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;426:4679:21;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;426:4679:21;7686:4:23;426:4679:21;;;;8251:20:23;426:4679:21;7686:4:23;426:4679:21;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;426:4679:21;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;426:4679:21;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;426:4679:21;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;426:4679:21;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;426:4679:21;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;426:4679:21;;;;5998:13:23;5994:18;;:::i;5988:25::-;426:4679:21;;;6027:13:23;;426:4679:21;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;426:4679:21;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;426:4679:21;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;426:4679:21;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;426:4679:21;6286:48:23;6302:32;;426:4679:21;6302:32:23;;;:::i;6286:48::-;426:4679:21;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;426:4679:21;;;;;;5712:20:23;426:4679:21;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;426:4679:21;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;426:4679:21;5509:31:23;;;:::i;5494:46::-;426:4679:21;;5452:13:23;;;;4358:1914:25;;;;;4558:29;4660:4;426:4679:21;4632:25:25;4638:18;;;;;;:::i;4632:25::-;426:4679:21;4632:32:25;4628:57;;4728:4;426:4679:21;4699:25:25;4705:18;;;;;;:::i;4699:25::-;426:4679:21;4699:33:25;4728:4;;4769:18;4748:48;4758:38;4763:32;:25;4769:18;;4748:48;4769:18;;;;:::i;4748:48::-;735:66;4925:33;;;;;:::i;:::-;4972:30;4968:64;;5316:27;5261:33;5204:27;5115;5308:36;5115:27;;;;:::i;:::-;5204;;;:::i;:::-;5261:33;;;:::i;5308:36::-;-1:-1:-1;;;;;426:4679:21;;;;;5308:49:25;5304:81;;5457:33;;;;;:::i;:::-;5528:17;426:4679:21;5594:18:25;5588:25;5594:18;;;;;;:::i;5588:25::-;426:4679:21;;;;;5644:4:25;5631:17;;5644:4;;;5668:22;;;;;5627:541;6191:27;6187:56;;6261:4;4358:1914;:::o;6187:56::-;6227:16;;;426:4679:21;6227:16:25;;426:4679:21;6227:16:25;5627:541;5715:18;;;;;5644:4;5715:18;;5711:457;5644:4;;;5753:13;;;;;;426:4679:21;5627:541:25;;5711:457;5805:4;-1:-1:-1;5805:4:25;;5843:17;5829:31;5843:17;;;;;:::i;5829:31::-;5883:13;426:4679:21;5878:218:25;5898:7;;;;;;5787:381;;;;;5627:541;;5883:13;5943:14;;;;;;5987:1;5943:14;426:4679:21;;;;5943:14:25;5942:52;5961:33;5967:26;;5978:14;:10;;;;:::i;5942:52::-;;426:4679:21;;5883:13:25;;;;;;5304:81;5366:19;;;426:4679:21;5366:19:25;;426:4679:21;5366:19:25;4968:64;5011:21;;;426:4679:21;5011:21:25;;426:4679:21;5011:21:25;4695:154;4827:11;;;;:::i;:::-;4695:154;;4217:1141:24;;426:4679:21;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;426:4679:21;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;426:4679:21;4682:13:24;426:4679:21;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;426:4679:21;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;426:4679:21;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;426:4679:21;5108:13:24;426:4679:21;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;426:4679:21;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;426:4679:21;;5108:13:24;;;;9295:1058:23;;426:4679:21;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;426:4679:21;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;426:4679:21;;;-1:-1:-1;;;426:4679:21;9413:1:23;9643:36;;426:4679:21;9643:36:23;:::i;:::-;;9627:1;9698:13;426:4679:21;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;426:4679:21;;;;;;9779:22:23;426:4679:21;;-1:-1:-1;;;;;;426:4679:21;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;426:4679:21;;-1:-1:-1;;;;;;426:4679:21;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;426:4679:21;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;426:4679:21;9993:33:23;10003:22;:18;426:4679:21;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;426:4679:21;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;426:4679:21;10045:13:23;;10590:651;;;;10709:23;426:4679:21;;10709:23:23;;:::i;:::-;10735:14;426:4679:21;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;426:4679:21;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;426:4679:21;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;426:4679:21;;;;10925:16:23;10921:21;;:::i;10915:33::-;426:4679:21;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;426:4679:21;;11067:30:23;11063:81;;426:4679:21;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;426:4679:21;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o;5563:305:24:-;;;-1:-1:-1;;;426:4679:21;-1:-1:-1;;;;;;426:4679:21;5670:12:24;;5563:305;;;5670:12;:::i;:::-;;426:4679:21;5670:20:24;5666:50;;5750:89;;;;;5563:305::o;5666:50::-;5699:17;;;-1:-1:-1;5699:17:24;;-1:-1:-1;5699:17:24","linkReferences":{},"immutableReferences":{"40183":[{"start":358,"length":32},{"start":1036,"length":32},{"start":1401,"length":32},{"start":2695,"length":32}],"40191":[{"start":1118,"length":32},{"start":2124,"length":32}],"40193":[{"start":498,"length":32},{"start":2090,"length":32}],"40607":[{"start":645,"length":32},{"start":851,"length":32},{"start":1280,"length":32},{"start":1562,"length":32},{"start":2158,"length":32},{"start":3973,"length":32},{"start":4119,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond(uint256)":"9940686e","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancelAndWithdraw()":"6b892b22","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,uint256),uint256)":"ede7f6a3","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","tokenContract()":"55a373d6","totalBondsDeposited()":"fe03a460"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedBytes32\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransferEvent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ToAddressMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongEventSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongTokenContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bondAmount\",\"type\":\"uint256\"}],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAndWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptPath\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct EscrowERC20.ReceiptProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"cancelAndWithdraw()\":{\"notice\":\"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowERC20.sol\":\"EscrowERC20\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6\",\"dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowERC20.sol\":{\"keccak256\":\"0x33e054750cf105681bbcb49f94245b6c415845657f0a843f53f40b947713f68c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cd2751e798bf4cfa05f0c6ba80320d993ed0cf7053a5f5878d524dd67049401f\",\"dweb:/ipfs/QmUumceDHvrTdqh5V4L1PpiJjDphxhsXXcsXfPD8qxA3zR\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f\",\"dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedBytes32"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTransferEvent"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"ToAddressMismatch"},{"inputs":[],"type":"error","name":"TokenTransferFailed"},{"inputs":[],"type":"error","name":"WrongEventSignature"},{"inputs":[],"type":"error","name":"WrongTokenContract"},{"inputs":[],"type":"error","name":"ZeroAddress"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"cancelAndWithdraw"},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowERC20.ReceiptProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"proofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptPath","type":"bytes"},{"internalType":"uint256","name":"logIndex","type":"uint256"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"cancelAndWithdraw()":{"notice":"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded."}},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowERC20.sol":"EscrowERC20"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550","urls":["bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6","dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowERC20.sol":{"keccak256":"0x33e054750cf105681bbcb49f94245b6c415845657f0a843f53f40b947713f68c","urls":["bzz-raw://cd2751e798bf4cfa05f0c6ba80320d993ed0cf7053a5f5878d524dd67049401f","dweb:/ipfs/QmUumceDHvrTdqh5V4L1PpiJjDphxhsXXcsXfPD8qxA3zR"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728","urls":["bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f","dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH"],"license":"UNLICENSED"}},"version":1},"id":21} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"_tokenContract","type":"address","internalType":"address"},{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[{"name":"_bondAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancelAndWithdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowERC20.ReceiptProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"proofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptPath","type":"bytes","internalType":"bytes"},{"name":"logIndex","type":"uint256","internalType":"uint256"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"tokenContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedBytes32","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTransferEvent","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"ToAddressMismatch","inputs":[]},{"type":"error","name":"TokenTransferFailed","inputs":[]},{"type":"error","name":"WrongEventSignature","inputs":[]},{"type":"error","name":"WrongTokenContract","inputs":[]},{"type":"error","name":"ZeroAddress","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x61010080604052346101c15760a08161231b80380380916100208285610231565b8339810103126101c15761003381610268565b9061004060208201610268565b6040820151608060608401519301519160a05260c0523360805260018060a01b0383169283156102225760e0528115801580610219575b6100fc575b60405161209e908161027d82396080518181816101660152818161040c015281816105790152610a87015260a05181818161045e015261084c015260c0518181816101f2015261082a015260e05181818161028501528181610353015281816105000152818161061a0152818161086e01528181610f8501526110170152f35b60ff60075460081c1661020a576101fb5780156101ec57815f55816002558060015581018091116101d8575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af19081156101cd575f9161018e575b501561017f5761010061ff001960075416176007555f80808061007c565b63022e258160e11b5f5260045ffd5b90506020813d6020116101c5575b816101a960209383610231565b810103126101c1575180151581036101c1575f610161565b5f80fd5b3d915061019c565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b50811515610077565b63d92e233d60e01b5f5260045ffd5b601f909101601f19168101906001600160401b0382119082101761025457604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c15756fe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633d2691bc1461013b57806355a373d6146101365780635a4fd645146101315780636b892b221461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b610961565b61093c565b6106f9565b6106dc565b6106b8565b610560565b6104aa565b61048d565b610449565b6103fa565b6103dd565b6102d0565b6102b4565b610270565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576102f2600160ff196007541617600755565b6102fa610a77565b610302610ab7565b61030a610aee565b61032161ff0019600754166007555f6001555f8055565b80156103ce5760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f9161039a575b501561038b57005b63022e258160e11b5f5260045ffd5b6103bc915060203d6020116103c2575b6103b48183610992565b8101906109b9565b5f610383565b503d6103aa565b6109d1565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104c6610b00565b6104cf81610b49565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f91610541575b501561038b5761053f90610ba4565b005b61055a915060203d6020116103c2576103b48183610992565b5f610530565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff166106a957811561069a57801561068b576105cf826105d4935f55600255565b600155565b61061560206105e860025460015490610a1f565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f9161066c575b501561038b5761053f61010061ff00196007541617600755565b610685915060203d6020116103c2576103b48183610992565b5f610652565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106d2610a2c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af5760243561073b8280610a44565b6007546107509060081c60ff161590565b1590565b61092d57600354610771906001600160a01b03165b6001600160a01b031690565b331480159061091c575b61090d574383116108fe576101006107938443610be9565b116108ef57824080156108e0576107ab368385610c12565b60208151910120036108d1576107c091611074565b036108c2576107d86107d28280610a44565b90610c76565b9161081261074c60248301946107ee8686610a44565b906107fc6044870188610a44565b9061080a606489018a610a44565b949093610ce6565b6108b35760846108286108989461074c94610a44565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d6a565b6108a45761053f610f04565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061092861074c610a2c565b61077b565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109b457604052565b61097e565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109fe57565b6109dc565b60010190816001116109fe57565b90601582018092116109fe57565b919082018092116109fe57565b6004548015159081610a3c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561092d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610abf610a2c565b610adf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109fe5790565b6004548015159081610b3f575b50610b1457565b6005545f548181018091116109fe575f556006549081018091116109fe57600655610b3d610ab7565b565b905042115f610b0d565b60075460ff8160081c161561092d5760ff16610b9557610b67610a2c565b610b86575f5460011c11610b7757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109fe57600455600555565b6001198101919082116109fe57565b5f198101919082116109fe57565b919082039182116109fe57565b67ffffffffffffffff81116109b457601f01601f191660200190565b929192610c1e82610bf6565b91610c2c6040519384610992565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c655790565b610c48565b90821015610c65570190565b90610c818183611130565b905f5b60058110610cd15750600560fd1b906001600160f81b031990610ca990849086610c6a565b351603610cc2576001810181116109fe57016001013590565b633954003560e11b5f5260045ffd5b91610cdf6001918386611264565b9201610c84565b610cfc610d0492939495610d0a98973691610c12565b923691610c12565b906113ec565b90565b60ff60f6199116019060ff82116109fe57565b60ff607f199116019060ff82116109fe57565b60ff60bf199116019060ff82116109fe57565b60ff60b6199116019060ff82116109fe57565b60ff166001019060ff82116109fe57565b9594939291905f818881151580610ee8575b610eda575b610daa610da4610d968560c09560ff95610c6a565b356001600160f81b03191690565b60f81c90565b1610610ea457808860f860ff610dc8610da4610d9688978887610c6a565b1610610eca57610df5610df0610deb610da4610d9686610e0198610dfb97610c6a565b610d0d565b610d59565b60ff1690565b90610a1f565b81885f5b60038110610eb35750610df5610da4610d968560c095610e2495610c6a565b10610ea457808860f8610e42610df5610da4610d9688978887610c6a565b10610e9357610df5610df0610deb610da4610d9686610e6498610dfb97610c6a565b915b5f905b808210610e7c575050610d0a9596611599565b9092610e8b600191848b611264565b930190610e69565b50610e9e91506109f0565b91610e66565b631bd5dcf760e31b5f5260045ffd5b92600192610ec092611264565b9101888391610e05565b50610ed591506109f0565b610e01565b506001915082905088610d81565b50608060ff610efd610da4610d968686610c5c565b1610610d7c565b610f0c611669565b6003546001600160a01b0316610f496001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fe557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91610fc6575b505b1561038b57565b610fdf915060203d6020116103c2576103b48183610992565b5f610fbd565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91611055575b50610fbf565b61106e915060203d6020116103c2576103b48183610992565b5f61104f565b61107e8282611130565b915f5b6008811061111b575061109b610da4610d96858486610c6a565b925f9260ff851694608086105f146110b557505050505090565b6110c69193949550610df590610d20565b915f935b8385106110d957505050505090565b90919293946110ea60019160081b90565b61110f610df5610da4610d966111088b6111038b6109f0565b610a1f565b8789610c6a565b179501939291906110ca565b926111296001918385611264565b9301611081565b5f600360fe1b6001600160f81b031961114c610d968686610c5c565b161061122c57601f60fb1b6001600160f81b031961116d610d968686610c5c565b161061125b5780610dfb610df5610df0610deb610da4610d96611191978a8a610c6a565b905b61a5bd46148015611250575b6111aa575b50905090565b5f5b6003811061123b5750600360fe1b6111d86111cb610d96858786610c6a565b6001600160f81b03191690565b1061122c57601f60fb1b6111f36111cb610d96858786610c6a565b1061121c57610df5610df0610deb610da4610d968661121598610dfb97610c6a565b805f6111a4565b5061122791506109f0565b611215565b63c0098bd960e01b5f5260045ffd5b916112496001918584611264565b92016111ac565b5061a5bf461461119f565b50600190611193565b9190808210156113bf5761127f610da4610d96848487610c6a565b9060ff8216608081101561129a57505050610d0a91506109f0565b91929160b88110156112c2575050610d0a9250610df56112bc610dfb926109f0565b92610d20565b90929060c08110156113385750610df56112de91949394610d46565b915f935f915b8483106112ff57505050610d0a9291611103611103926109f0565b90919461130e60019160081b90565b61132e610df5610da4610d966113278b6111038b6109f0565b8888610c6a565b17950191906112e4565b90929060f8111561135e5750610d0a9250610df5611358610dfb926109f0565b92610d33565b9291610df561136c91610d0d565b915f935f915b84831061138d57505050610d0a9291611103611103926109f0565b90919461139c60019160081b90565b6113b5610df5610da4610d966113278b6111038b6109f0565b1795019190611372565b6318d76ae160e11b5f5260045ffd5b805115610c655760200190565b908151811015610c65570160200190565b919390929190600360fe1b6001600160f81b031961140d610d968689610c5c565b161061158a57601f60fb1b6001600160f81b031961142e610d968689610c5c565b16106115805761145261144d610df5610deb610da4610d96888b610c5c565b610a03565b9492905b945f5b82821061146b57505050505050505f90565b6114896114828361147d36878a610c12565b6116da565b9093610a1f565b96825160208401200361151e57600360fe1b6114b86111cb6114aa856113ce565b516001600160f81b03191690565b1061151e578590846001601f60fb1b6114d66111cb6114aa886113ce565b1015611562575b6114e78186611881565b6011810361152957506114f994611a0c565b94911561151e5784156115125793915b91959093611459565b50505050505050600190565b505050505050505f90565b90935060021415905061155657848792611542946118c6565b94911561151e578415611512579391611509565b50505050505050505f90565b5061157b61144d610df5610deb610da46114aa896113ce565b6114dd565b6001949290611456565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115b4610da4610d9685888a610c6a565b1610610ea45760f860ff6115cf610da4610d9685888a610c6a565b1610611659575080610dfb610df5610df0610deb610da4610d966115f497898b610c6a565b945b609460ff61160b610da4610d968a8789610c6a565b160361164a576001600160a01b03168286016001013560601c0361163b57611635610d0a95610a11565b91611b21565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61166391506109f0565b946115f6565b6005545f5481018091116109fe5760015481018091116109fe5790565b604080519091906116978382610992565b6001815291601f1901366020840137565b906116b282610bf6565b6116bf6040519182610992565b82815280926116d0601f1991610bf6565b0190602036910137565b80518210156113bf576116f3610da46114aa84846113db565b9160ff8316608081101561172c5750505061170c611686565b9060f81b6001600160f81b0319165f1a611725826113ce565b5390600190565b919392909160b88110156117965750610df561174791610d20565b90611751826116a8565b935f5b83811061176757505050610d0a90610a03565b806117836114aa61177d600194611103886109f0565b856113db565b5f1a61178f82896113db565b5301611754565b60c0111561183457610df56117aa91610d46565b5f915f5b82811061180657506117bf836116a8565b945f5b8481106117d95750505090611103610d0a92610a03565b806117f36114aa61177d600194611103896111038a6109f0565b5f1a6117ff828a6113db565b53016117c2565b9260019060081b61182c610df5610da46114aa61182689611103896109f0565b8b6113db565b1793016117ae565b50916118408382611cd8565b9261184a846116a8565b915f5b85811061185b575050509190565b8061186e6114aa61177d60019487610a1f565b5f1a61187a82876113db565b530161184d565b5f92915b81518110156118ac576118988183611cd8565b81018091116109fe57600190930192611885565b5050565b908160011b91808304600214901517156109fe57565b839492916118d481836116da565b93906118f360206118ea610da46114aa856113ce565b16151591611e05565b978891156119955750611907905187610a1f565b61191182516118b0565b14611926575b505050505050505f905f905f90565b86866001928251611983575b505050611940575b80611917565b6119539261194d91610a1f565b906116da565b5060208151910120906020815191012014611971578080808061193a565b61197c915190610a1f565b6001915f90565b61198d9350611f6e565b86865f611932565b6119a6939495965061074c92611f6e565b6119ff576119b79261194d91610a1f565b50908151602081145f146119df575060206119d7920151925b5190610a1f565b916001929190565b80156119f35760206119d7930120926119d0565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a1a82516118b0565b851015611ac45750610da46114aa611a3c92611a368760011c90565b906113db565b60018416611abb5760041c600f16915b905f925b60ff81168410611a9b5750611a6592506116da565b5080518015611a90576119d79160208203611a8657602091500151916109f0565b60200120916109f0565b5050505f905f905f90565b90916001611aaf82610dfb60ff9487611cd8565b94019392919050611a50565b600f1691611a4c565b9290509392935f915b60108310611b0757611adf92506116da565b50602081519101209060208151910120145f14611afe57600191905f90565b5f915081908190565b90611b1881610dfb60019385611cd8565b92019190611acd565b929190918160c060ff611b3b610da4610d9687898b610c6a565b1610610ea45760f860ff611b56610da4610d9687898b610c6a565b1610611cc95780610dfb610df5610df0610deb610da4610d96611b7a978b8d610c6a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611ba682868861202c565b03611cba57610765610765611bc9611bc2611bd094888a611264565b8789611264565b868861202c565b6001600160a01b03918216911603611cab57611bed908284611264565b905f91611c01610da4610d96838588610c6a565b60ff811694906080861015611c2f5750505050505b03611c2057600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c4a575050505050505f611c16565b60a010610ea457610df5611c6091939293610d20565b915f935b838510611c75575050505050611c16565b9091929394611c8660019160081b90565b611c9f610df5610da4610d966111088b6111038b6109f0565b17950193929190611c64565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cd3826109f0565b611b7a565b9081518110156113bf57611cf2610da46114aa83856113db565b9160ff83166080811015611d095750505050600190565b60b8811015611d2457505050610df5610df0610d0a92610d20565b60c0811015611d90575091610df5611d3b91610d46565b905f925f915b838310611d585750505090611103610d0a92610a03565b909193611d6760019160081b90565b611d86610df5610da46114aa611d808a611103896109f0565b886113db565b1794019190611d41565b60f81115611da9575050610df5610df0610d0a92610d33565b91610df5611db691610d0d565b905f925f915b838310611dd35750505090611103610d0a92610a03565b909193611de260019160081b90565b611dfb610df5610da46114aa611d808a611103896109f0565b1794019190611dbc565b90815115610b3d57611e1c610da46114aa846113ce565b6010811615611eeb57611e3f611e3a611e3585516118b0565b610bdb565b6116a8565b9060f81b600f60f81b165f1a611e54826113ce565b5360015b8351811015611ee65780611e93611e83611e7a610da46114aa6001968a6113db565b60041c600f1690565b60f81b6001600160f81b03191690565b611eac611ea2611e35846118b0565b915f1a91856113db565b53611ed3600f611ec2610da46114aa858a6113db565b1660f81b6001600160f81b03191690565b611edf611ea2836118b0565b5301611e58565b509150565b50611f01611e3a611efc84516118b0565b610bcc565b60015b8351811015611ee65780611f26611e83611e7a610da46114aa6001968a6113db565b611f3a611ea2611f3584610bdb565b6118b0565b53611f50600f611ec2610da46114aa858a6113db565b611f67611ea2611f62611f3585610bdb565b6109f0565b5301611f04565b919091611f7c825184610a1f565b611f8682516118b0565b10612025575f5b825181101561201c57611fa9611fa38286610a1f565b60011690565b611ffe57611fd2611e7a610da46114aa611fcc611fc6868a610a1f565b60011c90565b866113db565b60ff611fe7610df5610da46114aa86896113db565b911603611ff657600101611f8d565b505050505f90565b600f612016610da46114aa611fcc611fc6868a610a1f565b16611fd2565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061204a90849086610c6a565b35160361205957016001013590565b63f0ff325b60e01b5f5260045ffdfea264697066735822122028c96b0e3c2075e4a273041c863c4e813c898fa651607c92e57dad2760f392cd64736f6c634300081e0033","sourceMap":"426:4679:22:-:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;1670:38:20;426:4679:22;1670:38:20;1718:32;;1778:10;426:4679:22;1760:28:20;426:4679:22;;;;;;;1437:28;;;1433:54;;1497:30;;1542:24;;;;:53;;;-1:-1:-1;1538:133:22;;-1:-1:-1;426:4679:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1718:32:20;426:4679:22;;;;;;;;;;1497:30;426:4679;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1538:133;426:4679;1953:6;426:4679;;;;1949:34;;1993:56;;2063:26;;2059:58;;426:4679;-1:-1:-1;426:4679:22;;2180:43;426:4679;;;;;;;;;;;-1:-1:-1;426:4679:22;2292:106;426:4679;;;;;;;;;;;;2292:106;;1778:10:20;2292:106:22;;;426:4679;2347:4;426:4679;;;;;;;;2292:106;;;;;;;-1:-1:-1;2292:106:22;;;1538:133;2291:107;;2287:174;;426:4679;;;1953:6;426:4679;;;1953:6;426:4679;1538:133;;;;;;2287:174;2429:21;;;-1:-1:-1;2429:21:22;2292:106;-1:-1:-1;2429:21:22;2292:106;;;426:4679;2292:106;;426:4679;2292:106;;;;;;426:4679;2292:106;;;:::i;:::-;;;426:4679;;;;;;;;;;;;2292:106;;;426:4679;-1:-1:-1;426:4679:22;;2292:106;;;-1:-1:-1;2292:106:22;;;426:4679;;;-1:-1:-1;426:4679:22;;;;;;;;;-1:-1:-1;426:4679:22;;;;;-1:-1:-1;426:4679:22;2059:58;2098:19;;;-1:-1:-1;2098:19:22;;-1:-1:-1;2098:19:22;1993:56;2031:18;;;-1:-1:-1;2031:18:22;;-1:-1:-1;2031:18:22;1949:34;1968:15;;;-1:-1:-1;1968:15:22;;-1:-1:-1;1968:15:22;1542:53;1570:25;;;;1542:53;;1433:54;1474:13;;;-1:-1:-1;1474:13:22;;-1:-1:-1;1474:13:22;426:4679;;;;;-1:-1:-1;;426:4679:22;;;;-1:-1:-1;;;;;426:4679:22;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;426:4679:22;;;;;-1:-1:-1;426:4679:22;;;;-1:-1:-1;;;;;426:4679:22;;;;;;:::o","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101545780631aa7c0ec1461014f5780632feef2ec1461014a578063308657d71461014557806333ee5f35146101405780633d2691bc1461013b57806355a373d6146101365780635a4fd645146101315780636b892b221461012c57806380f323a71461012757806381972d00146101225780638677ab231461011d5780638bd03d0a146101185780639940686e14610113578063a65e2cfd1461010e578063cb766a5614610109578063d415b3f914610104578063ede7f6a3146100ff578063f3a504f2146100fa5763fe03a460146100f5575f80fd5b610961565b61093c565b6106f9565b6106dc565b6106b8565b610560565b6104aa565b61048d565b610449565b6103fa565b6103dd565b6102d0565b6102b4565b610270565b610254565b610237565b610215565b6101db565b6101b3565b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b346101af575f3660031901126101af576003546040516001600160a01b039091168152602090f35b346101af575f3660031901126101af5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101af575f3660031901126101af57602060ff600754166040519015158152f35b346101af575f3660031901126101af576020600454604051908152f35b346101af575f3660031901126101af5760206040516101008152f35b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af5760205f54604051908152f35b346101af575f3660031901126101af576102f2600160ff196007541617600755565b6102fa610a77565b610302610ab7565b61030a610aee565b61032161ff0019600754166007555f6001555f8055565b80156103ce5760405163a9059cbb60e01b815233600482015260248101919091526020816044815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f9161039a575b501561038b57005b63022e258160e11b5f5260045ffd5b6103bc915060203d6020116103c2575b6103b48183610992565b8101906109b9565b5f610383565b503d6103aa565b6109d1565b6353cd7f7960e01b5f5260045ffd5b346101af575f3660031901126101af576020600554604051908152f35b346101af575f3660031901126101af577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a0576007805460ff19166001179055005b346101af575f3660031901126101af576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101af575f3660031901126101af576020600154604051908152f35b346101af5760203660031901126101af576004356104c6610b00565b6104cf81610b49565b6040516323b872dd60e01b8152336004820152306024820152604481018290526020816064815f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156103c9575f91610541575b501561038b5761053f90610ba4565b005b61055a915060203d6020116103c2576103b48183610992565b5f610530565b346101af5760403660031901126101af576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a05760075460081c60ff166106a957811561069a57801561068b576105cf826105d4935f55600255565b600155565b61061560206105e860025460015490610a1f565b6040516323b872dd60e01b8152336004820152306024820152604481019190915291829081906064820190565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f9161066c575b501561038b5761053f61010061ff00196007541617600755565b610685915060203d6020116103c2576103b48183610992565b5f610652565b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b346101af575f3660031901126101af5760206106d2610a2c565b6040519015158152f35b346101af575f3660031901126101af576020600254604051908152f35b346101af5760403660031901126101af5760043567ffffffffffffffff81116101af578060040160a060031983360301126101af5760243561073b8280610a44565b6007546107509060081c60ff161590565b1590565b61092d57600354610771906001600160a01b03165b6001600160a01b031690565b331480159061091c575b61090d574383116108fe576101006107938443610be9565b116108ef57824080156108e0576107ab368385610c12565b60208151910120036108d1576107c091611074565b036108c2576107d86107d28280610a44565b90610c76565b9161081261074c60248301946107ee8686610a44565b906107fc6044870188610a44565b9061080a606489018a610a44565b949093610ce6565b6108b35760846108286108989461074c94610a44565b7f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000937f0000000000000000000000000000000000000000000000000000000000000000939101359190610d6a565b6108a45761053f610f04565b6364fa89e160e11b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b5061092861074c610a2c565b61077b565b636af784dd60e11b5f5260045ffd5b346101af575f3660031901126101af57602060ff60075460081c166040519015158152f35b346101af575f3660031901126101af576020600654604051908152f35b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff8211176109b457604052565b61097e565b908160209103126101af575180151581036101af5790565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b90600182018092116109fe57565b6109dc565b60010190816001116109fe57565b90601582018092116109fe57565b919082018092116109fe57565b6004548015159081610a3c575090565b905042111590565b903590601e19813603018212156101af570180359067ffffffffffffffff82116101af576020019181360383136101af57565b60ff60075460081c161561092d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101a057565b610abf610a2c565b610adf576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116109fe5790565b6004548015159081610b3f575b50610b1457565b6005545f548181018091116109fe575f556006549081018091116109fe57600655610b3d610ab7565b565b905042115f610b0d565b60075460ff8160081c161561092d5760ff16610b9557610b67610a2c565b610b86575f5460011c11610b7757565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b336001600160601b0360a01b600354161760035561012c42018042116109fe57600455600555565b6001198101919082116109fe57565b5f198101919082116109fe57565b919082039182116109fe57565b67ffffffffffffffff81116109b457601f01601f191660200190565b929192610c1e82610bf6565b91610c2c6040519384610992565b8294818452818301116101af578281602093845f960137010152565b634e487b7160e01b5f52603260045260245ffd5b9015610c655790565b610c48565b90821015610c65570190565b90610c818183611130565b905f5b60058110610cd15750600560fd1b906001600160f81b031990610ca990849086610c6a565b351603610cc2576001810181116109fe57016001013590565b633954003560e11b5f5260045ffd5b91610cdf6001918386611264565b9201610c84565b610cfc610d0492939495610d0a98973691610c12565b923691610c12565b906113ec565b90565b60ff60f6199116019060ff82116109fe57565b60ff607f199116019060ff82116109fe57565b60ff60bf199116019060ff82116109fe57565b60ff60b6199116019060ff82116109fe57565b60ff166001019060ff82116109fe57565b9594939291905f818881151580610ee8575b610eda575b610daa610da4610d968560c09560ff95610c6a565b356001600160f81b03191690565b60f81c90565b1610610ea457808860f860ff610dc8610da4610d9688978887610c6a565b1610610eca57610df5610df0610deb610da4610d9686610e0198610dfb97610c6a565b610d0d565b610d59565b60ff1690565b90610a1f565b81885f5b60038110610eb35750610df5610da4610d968560c095610e2495610c6a565b10610ea457808860f8610e42610df5610da4610d9688978887610c6a565b10610e9357610df5610df0610deb610da4610d9686610e6498610dfb97610c6a565b915b5f905b808210610e7c575050610d0a9596611599565b9092610e8b600191848b611264565b930190610e69565b50610e9e91506109f0565b91610e66565b631bd5dcf760e31b5f5260045ffd5b92600192610ec092611264565b9101888391610e05565b50610ed591506109f0565b610e01565b506001915082905088610d81565b50608060ff610efd610da4610d968686610c5c565b1610610d7c565b610f0c611669565b6003546001600160a01b0316610f496001600160601b0360a01b600354166003555f6005555f60045561ff0019600754166007555f6001555f8055565b4662aa36a703610fe557604051633419e74d60e21b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91610fc6575b505b1561038b57565b610fdf915060203d6020116103c2576103b48183610992565b5f610fbd565b60405163a9059cbb60e01b81526001600160a01b0390911660048201526024810191909152602081806044810103815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af19081156103c9575f91611055575b50610fbf565b61106e915060203d6020116103c2576103b48183610992565b5f61104f565b61107e8282611130565b915f5b6008811061111b575061109b610da4610d96858486610c6a565b925f9260ff851694608086105f146110b557505050505090565b6110c69193949550610df590610d20565b915f935b8385106110d957505050505090565b90919293946110ea60019160081b90565b61110f610df5610da4610d966111088b6111038b6109f0565b610a1f565b8789610c6a565b179501939291906110ca565b926111296001918385611264565b9301611081565b5f600360fe1b6001600160f81b031961114c610d968686610c5c565b161061122c57601f60fb1b6001600160f81b031961116d610d968686610c5c565b161061125b5780610dfb610df5610df0610deb610da4610d96611191978a8a610c6a565b905b61a5bd46148015611250575b6111aa575b50905090565b5f5b6003811061123b5750600360fe1b6111d86111cb610d96858786610c6a565b6001600160f81b03191690565b1061122c57601f60fb1b6111f36111cb610d96858786610c6a565b1061121c57610df5610df0610deb610da4610d968661121598610dfb97610c6a565b805f6111a4565b5061122791506109f0565b611215565b63c0098bd960e01b5f5260045ffd5b916112496001918584611264565b92016111ac565b5061a5bf461461119f565b50600190611193565b9190808210156113bf5761127f610da4610d96848487610c6a565b9060ff8216608081101561129a57505050610d0a91506109f0565b91929160b88110156112c2575050610d0a9250610df56112bc610dfb926109f0565b92610d20565b90929060c08110156113385750610df56112de91949394610d46565b915f935f915b8483106112ff57505050610d0a9291611103611103926109f0565b90919461130e60019160081b90565b61132e610df5610da4610d966113278b6111038b6109f0565b8888610c6a565b17950191906112e4565b90929060f8111561135e5750610d0a9250610df5611358610dfb926109f0565b92610d33565b9291610df561136c91610d0d565b915f935f915b84831061138d57505050610d0a9291611103611103926109f0565b90919461139c60019160081b90565b6113b5610df5610da4610d966113278b6111038b6109f0565b1795019190611372565b6318d76ae160e11b5f5260045ffd5b805115610c655760200190565b908151811015610c65570160200190565b919390929190600360fe1b6001600160f81b031961140d610d968689610c5c565b161061158a57601f60fb1b6001600160f81b031961142e610d968689610c5c565b16106115805761145261144d610df5610deb610da4610d96888b610c5c565b610a03565b9492905b945f5b82821061146b57505050505050505f90565b6114896114828361147d36878a610c12565b6116da565b9093610a1f565b96825160208401200361151e57600360fe1b6114b86111cb6114aa856113ce565b516001600160f81b03191690565b1061151e578590846001601f60fb1b6114d66111cb6114aa886113ce565b1015611562575b6114e78186611881565b6011810361152957506114f994611a0c565b94911561151e5784156115125793915b91959093611459565b50505050505050600190565b505050505050505f90565b90935060021415905061155657848792611542946118c6565b94911561151e578415611512579391611509565b50505050505050505f90565b5061157b61144d610df5610deb610da46114aa896113ce565b6114dd565b6001949290611456565b63ebb47d1d60e01b5f5260045ffd5b91949392948060c060ff6115b4610da4610d9685888a610c6a565b1610610ea45760f860ff6115cf610da4610d9685888a610c6a565b1610611659575080610dfb610df5610df0610deb610da4610d966115f497898b610c6a565b945b609460ff61160b610da4610d968a8789610c6a565b160361164a576001600160a01b03168286016001013560601c0361163b57611635610d0a95610a11565b91611b21565b63a087f96f60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b61166391506109f0565b946115f6565b6005545f5481018091116109fe5760015481018091116109fe5790565b604080519091906116978382610992565b6001815291601f1901366020840137565b906116b282610bf6565b6116bf6040519182610992565b82815280926116d0601f1991610bf6565b0190602036910137565b80518210156113bf576116f3610da46114aa84846113db565b9160ff8316608081101561172c5750505061170c611686565b9060f81b6001600160f81b0319165f1a611725826113ce565b5390600190565b919392909160b88110156117965750610df561174791610d20565b90611751826116a8565b935f5b83811061176757505050610d0a90610a03565b806117836114aa61177d600194611103886109f0565b856113db565b5f1a61178f82896113db565b5301611754565b60c0111561183457610df56117aa91610d46565b5f915f5b82811061180657506117bf836116a8565b945f5b8481106117d95750505090611103610d0a92610a03565b806117f36114aa61177d600194611103896111038a6109f0565b5f1a6117ff828a6113db565b53016117c2565b9260019060081b61182c610df5610da46114aa61182689611103896109f0565b8b6113db565b1793016117ae565b50916118408382611cd8565b9261184a846116a8565b915f5b85811061185b575050509190565b8061186e6114aa61177d60019487610a1f565b5f1a61187a82876113db565b530161184d565b5f92915b81518110156118ac576118988183611cd8565b81018091116109fe57600190930192611885565b5050565b908160011b91808304600214901517156109fe57565b839492916118d481836116da565b93906118f360206118ea610da46114aa856113ce565b16151591611e05565b978891156119955750611907905187610a1f565b61191182516118b0565b14611926575b505050505050505f905f905f90565b86866001928251611983575b505050611940575b80611917565b6119539261194d91610a1f565b906116da565b5060208151910120906020815191012014611971578080808061193a565b61197c915190610a1f565b6001915f90565b61198d9350611f6e565b86865f611932565b6119a6939495965061074c92611f6e565b6119ff576119b79261194d91610a1f565b50908151602081145f146119df575060206119d7920151925b5190610a1f565b916001929190565b80156119f35760206119d7930120926119d0565b505050505f905f905f90565b50505050505f905f905f90565b91909293611a1a82516118b0565b851015611ac45750610da46114aa611a3c92611a368760011c90565b906113db565b60018416611abb5760041c600f16915b905f925b60ff81168410611a9b5750611a6592506116da565b5080518015611a90576119d79160208203611a8657602091500151916109f0565b60200120916109f0565b5050505f905f905f90565b90916001611aaf82610dfb60ff9487611cd8565b94019392919050611a50565b600f1691611a4c565b9290509392935f915b60108310611b0757611adf92506116da565b50602081519101209060208151910120145f14611afe57600191905f90565b5f915081908190565b90611b1881610dfb60019385611cd8565b92019190611acd565b929190918160c060ff611b3b610da4610d9687898b610c6a565b1610610ea45760f860ff611b56610da4610d9687898b610c6a565b1610611cc95780610dfb610df5610df0610deb610da4610d96611b7a978b8d610c6a565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611ba682868861202c565b03611cba57610765610765611bc9611bc2611bd094888a611264565b8789611264565b868861202c565b6001600160a01b03918216911603611cab57611bed908284611264565b905f91611c01610da4610d96838588610c6a565b60ff811694906080861015611c2f5750505050505b03611c2057600190565b6355e97b0d60e01b5f5260045ffd5b9091929394608081145f14611c4a575050505050505f611c16565b60a010610ea457610df5611c6091939293610d20565b915f935b838510611c75575050505050611c16565b9091929394611c8660019160081b90565b611c9f610df5610da4610d966111088b6111038b6109f0565b17950193929190611c64565b634cd4b7b160e01b5f5260045ffd5b6324da545d60e11b5f5260045ffd5b50611cd3826109f0565b611b7a565b9081518110156113bf57611cf2610da46114aa83856113db565b9160ff83166080811015611d095750505050600190565b60b8811015611d2457505050610df5610df0610d0a92610d20565b60c0811015611d90575091610df5611d3b91610d46565b905f925f915b838310611d585750505090611103610d0a92610a03565b909193611d6760019160081b90565b611d86610df5610da46114aa611d808a611103896109f0565b886113db565b1794019190611d41565b60f81115611da9575050610df5610df0610d0a92610d33565b91610df5611db691610d0d565b905f925f915b838310611dd35750505090611103610d0a92610a03565b909193611de260019160081b90565b611dfb610df5610da46114aa611d808a611103896109f0565b1794019190611dbc565b90815115610b3d57611e1c610da46114aa846113ce565b6010811615611eeb57611e3f611e3a611e3585516118b0565b610bdb565b6116a8565b9060f81b600f60f81b165f1a611e54826113ce565b5360015b8351811015611ee65780611e93611e83611e7a610da46114aa6001968a6113db565b60041c600f1690565b60f81b6001600160f81b03191690565b611eac611ea2611e35846118b0565b915f1a91856113db565b53611ed3600f611ec2610da46114aa858a6113db565b1660f81b6001600160f81b03191690565b611edf611ea2836118b0565b5301611e58565b509150565b50611f01611e3a611efc84516118b0565b610bcc565b60015b8351811015611ee65780611f26611e83611e7a610da46114aa6001968a6113db565b611f3a611ea2611f3584610bdb565b6118b0565b53611f50600f611ec2610da46114aa858a6113db565b611f67611ea2611f62611f3585610bdb565b6109f0565b5301611f04565b919091611f7c825184610a1f565b611f8682516118b0565b10612025575f5b825181101561201c57611fa9611fa38286610a1f565b60011690565b611ffe57611fd2611e7a610da46114aa611fcc611fc6868a610a1f565b60011c90565b866113db565b60ff611fe7610df5610da46114aa86896113db565b911603611ff657600101611f8d565b505050505f90565b600f612016610da46114aa611fcc611fc6868a610a1f565b16611fd2565b50505050600190565b5050505f90565b9190600560fd1b906001600160f81b03199061204a90849086610c6a565b35160361205957016001013590565b63f0ff325b60e01b5f5260045ffdfea264697066735822122028c96b0e3c2075e4a273041c863c4e813c898fa651607c92e57dad2760f392cd64736f6c634300081e0033","sourceMap":"426:4679:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;426:4679:22;;;;2363:15:20;-1:-1:-1;;;;;426:4679:22;2349:10:20;:29;2345:56;;2411:27;426:4679:22;;-1:-1:-1;;426:4679:22;;;;2345:56:20;2387:14;;;426:4679:22;2387:14:20;426:4679:22;;2387:14:20;426:4679:22;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;1263:29:20;426:4679:22;;;-1:-1:-1;;;;;426:4679:22;;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;;963:39:20;426:4679:22;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;1407:31:20;426:4679:22;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;;1085:3:20;426:4679:22;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;735:38;-1:-1:-1;;;;;426:4679:22;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;4710:26;4732:4;426:4679;;4710:26;426:4679;;;4710:26;426:4679;;4710:26;;;:::i;:::-;;;:::i;:::-;4834:30;;:::i;:::-;4805:59;426:4679;;5686:14:20;426:4679:22;;5686:14:20;426:4679:22;5695:5:20;426:4679:22;;5695:5:20;426:4679:22;;5636:138:20;4805:59:22;4911:23;;4907:57;;426:4679;;-1:-1:-1;;;4980:62:22;;5011:10;426:4679;4980:62;;426:4679;;;;;;;;4980:62;426:4679;;;-1:-1:-1;;;;;;4987:13:22;426:4679;4980:62;;;;;;;426:4679;4980:62;;;426:4679;4979:63;;4975:122;;426:4679;4975:122;5065:21;;;426:4679;5065:21;426:4679;;5065:21;4980:62;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;4907:57::-;4943:21;;;426:4679;4943:21;426:4679;;4943:21;426:4679;;;;;;-1:-1:-1;;426:4679:22;;;;;1336:25:20;426:4679:22;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;2113:15:20;-1:-1:-1;;;;;426:4679:22;2099:10:20;:29;2095:56;;2161:26;426:4679:22;;-1:-1:-1;;426:4679:22;2183:4:20;426:4679:22;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;873:42:20;-1:-1:-1;;;;;426:4679:22;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;727:35:20;426:4679:22;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;2783:388;;:::i;:::-;2972:11;;;:::i;:::-;426:4679;;-1:-1:-1;;;3000:74:22;;3035:10;426:4679;3000:74;;426:4679;3055:4;426:4679;;;;;;;;;;;;;;-1:-1:-1;;;;;;3007:13:22;426:4679;3000:74;;;;;;;-1:-1:-1;3000:74:22;;;426:4679;2999:75;;2995:134;;3152:11;;;:::i;:::-;426:4679;3000:74;;;;426:4679;3000:74;426:4679;3000:74;;;;;;;:::i;:::-;;;;426:4679;;;;;;-1:-1:-1;;426:4679:22;;;;;;;;1901:15;-1:-1:-1;;;;;426:4679:22;1887:10;:29;1883:56;;1953:6;426:4679;;;;;1949:34;;1997:25;;1993:56;;2063:26;;2059:58;;2180:43;426:4679;2233:44;426:4679;-1:-1:-1;426:4679:22;2180:43;426:4679;;2180:43;2233:44;426:4679;;2233:44;2292:106;426:4679;2354:43;2180;426:4679;2233:44;426:4679;2354:43;;:::i;:::-;426:4679;;-1:-1:-1;;;2292:106:22;;1887:10;426:4679;2292:106;;426:4679;2347:4;426:4679;;;;;;;;;;;;;;;;;;;;;2292:106;;426:4679;-1:-1:-1;2299:13:22;-1:-1:-1;;;;;426:4679:22;2292:106;;;;;;;-1:-1:-1;2292:106:22;;;426:4679;2291:107;;2287:174;;2470:13;426:4679;;;1953:6;426:4679;;;1953:6;426:4679;;2292:106;;;;426:4679;2292:106;426:4679;2292:106;;;;;;;:::i;:::-;;;;2059:58;2098:19;;;-1:-1:-1;2098:19:22;426:4679;-1:-1:-1;2098:19:22;1993:56;2031:18;;;-1:-1:-1;2031:18:22;426:4679;-1:-1:-1;2031:18:22;1949:34;1968:15;;;-1:-1:-1;1968:15:22;426:4679;-1:-1:-1;1968:15:22;426:4679;;;;;;-1:-1:-1;;426:4679:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;768:35:20;426:4679:22;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;;;;;;;;;;;;;;;;;;;;;;3397:17;;;;:::i;:::-;2843:6:20;426:4679:22;2842:7:20;;426:4679:22;;;;2842:7:20;;426:4679:22;;2842:7:20;;426:4679:22;2842:7:20;2838:31;;2897:14;426:4679:22;2883:28:20;;-1:-1:-1;;;;;426:4679:22;;-1:-1:-1;;;;;426:4679:22;;;2883:28:20;:10;:28;;;:44;;;426:4679:22;2879:77:20;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;426:4679:22;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;3530:56:22;3568:17;;;;:::i;:::-;3530:56;;:::i;:::-;3632:16;3600:100;3601:99;426:4679;3632:16;;;;;;;:::i;:::-;3650;;;;;;;:::i;:::-;3668:17;;;;;;;:::i;:::-;3601:99;;;;:::i;3600:100::-;3596:159;;3887:14;3869:16;3808:157;3869:16;3809:156;3869:16;;:::i;:::-;3937:14;;3918:17;;3903:13;;3887:14;;426:4679;;3887:14;3809:156;:::i;3808:157::-;3804:217;;;;:::i;:::-;3988:22;;;-1:-1:-1;3988:22:22;426:4679;-1:-1:-1;3988:22:22;3596:159;3723:21;;;-1:-1:-1;3723:21:22;426:4679;-1:-1:-1;3723:21:22;3361:104:20;3444:21;;;-1:-1:-1;3444:21:20;426:4679:22;-1:-1:-1;3444:21:20;3276:75;3330:21;;;-1:-1:-1;3330:21:20;426:4679:22;-1:-1:-1;3330:21:20;3202:64;3244:22;;;-1:-1:-1;3244:22:20;426:4679:22;-1:-1:-1;3244:22:20;3042:85;3108:19;;;-1:-1:-1;3108:19:20;426:4679:22;-1:-1:-1;3108:19:20;2966:66;3011:21;;;-1:-1:-1;3011:21:20;426:4679:22;-1:-1:-1;3011:21:20;2879:77;2936:20;;;-1:-1:-1;2936:20:20;426:4679:22;-1:-1:-1;2936:20:20;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;2838:31;2858:11;;;-1:-1:-1;2858:11:20;426:4679:22;-1:-1:-1;2858:11:20;426:4679:22;;;;;;-1:-1:-1;;426:4679:22;;;;;;1444:18:20;426:4679:22;;;;;;;;;;;;;;;;;;-1:-1:-1;;426:4679:22;;;;;1367:34:20;426:4679:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;1814:1:27;426:4679:22;;;;;;;:::o;:::-;;:::i;:::-;1984:1:25;426:4679:22;;;1984:1:25;426:4679:22;;;:::o;:::-;;3908:2:27;426:4679:22;;;;;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;426:4679:22;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;426:4679:22:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5203:157:20:-;426:4679:22;5261:6:20;426:4679:22;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;426:4679:22;5301:10:20;:29;5297:56;;5203:157::o;3533:184::-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;426:4679:22;;3628:27:20;426:4679:22;;3628:27:20;426:4679:22;3653:1:20;3665:14;426:4679:22;3653:1:20;3689:21;426:4679:22;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;426:4679:22;5550:20:20;426:4679:22;;;;;;;;5438:139:20;:::o;3797:259::-;3850:17;426:4679:22;3850:21:20;;;:60;;;;3797:259;3846:204;;;3797:259::o;3846:204::-;3949:10;426:4679:22;-1:-1:-1;426:4679:22;;;;;;;;;-1:-1:-1;426:4679:22;3973:33:20;426:4679:22;;;;;;;;;3973:33:20;426:4679:22;3973:33:20;;:::i;:::-;3797:259::o;3850:60::-;3875:15;;;:35;3850:60;;;4115:318;4200:6;426:4679:22;;;;;;4199:7:20;4195:31;;426:4679:22;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;-1:-1:-1;426:4679:22;;;-1:-1:-1;4358:68:20;;4115:318::o;4358:68::-;4408:18;;;-1:-1:-1;4408:18:20;;-1:-1:-1;4408:18:20;4301:47;4325:23;;;-1:-1:-1;4325:23:20;;-1:-1:-1;4325:23:20;4236:55;4268:23;;;-1:-1:-1;4268:23:20;;-1:-1:-1;4268:23:20;4479:187;4558:10;-1:-1:-1;;;;;426:4679:22;;4541:27:20;426:4679:22;;;4541:27:20;426:4679:22;4616:9:20;4598:15;426:4679:22;4598:15:20;;426:4679:22;;;4578:47:20;426:4679:22;4635:24:20;426:4679:22;4479:187:20:o;426:4679:22:-;-1:-1:-1;;426:4679:22;;;;;;;;:::o;:::-;-1:-1:-1;;426:4679:22;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;-1:-1:-1;;426:4679:22;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;426:4679:22;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;3219:769:19:-;;3335:33;;;;:::i;:::-;3539:13;3551:1;3554:5;3558:1;3554:5;;;;-1:-1:-1;;;;426:4679:22;-1:-1:-1;;;;;;426:4679:22;3740:19:19;;426:4679:22;;3740:19:19;;:::i;:::-;;426:4679:22;3740:27:19;3736:60;;426:4679:22;;;;;;;3858:94:19;426:4679:22;3858:94:19;;;3219:769::o;3736:60::-;3776:20;;;3551:1;3776:20;;3551:1;3776:20;3539:13;3585:28;;426:4679:22;3585:28:19;;;;:::i;:::-;426:4679:22;;3539:13:19;;720:484:25;426:4679:22;;720:484:25;;;;1148:49;720:484;;426:4679:22;;;:::i;:::-;;;;;:::i;:::-;1148:49:25;;:::i;:::-;720:484;:::o;426:4679:22:-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;1136:1511:27:-;;;;;;;1384:1;1444:21;;;;;:52;;;1136:1511;1440:123;;1136:1511;1609:25;1615:18;;;1637:4;1615:18;426:4679:22;1615:18:27;;:::i;:::-;;-1:-1:-1;;;;;;426:4679:22;;;1615:18:27;426:4679:22;;;;1609:25:27;426:4679:22;1609:32:27;1605:57;;1682:18;;1705:4;426:4679:22;1676:25:27;1682:18;;;;;;;:::i;1676:25::-;426:4679:22;1676:33:27;1705:4;;1735:38;1740:32;:25;1746:18;;;1725:48;1746:18;1725:48;1746:18;;:::i;1740:25::-;:32;:::i;:::-;1735:38;:::i;:::-;426:4679:22;;;;1725:48:27;;;:::i;:::-;1905:13;;1384:1;1920:5;1924:1;1920:5;;;;2097:18;2091:25;2097:18;;;1637:4;2097:18;2091:32;2097:18;;:::i;2091:32::-;;2087:57;;2164:18;;1705:4;2158:33;:25;2164:18;;;;;;;:::i;2158:33::-;;1705:4;;2217:38;2222:32;:25;2228:18;;;2207:48;2228:18;2207:48;2228:18;;:::i;2207:48::-;2154:154;;1384:1;2352:155;2372:12;;;;;;2559:81;;;;;;:::i;2357:13::-;2410:27;;;426:4679:22;2410:27:27;;;;:::i;:::-;426:4679:22;;2357:13:27;;;2154:154;2286:11;;;;;:::i;:::-;2154:154;;;2087:57;1650:12;;;1384:1;2132:12;;1384:1;2132:12;1905:13;1951:27;426:4679:22;1951:27:27;;;;:::i;:::-;426:4679:22;;1905:13:27;;;;;1672:154;1804:11;;;;;:::i;:::-;1672:154;;1440:123;-1:-1:-1;1522:1:27;;-1:-1:-1;1512:11:27;;-1:-1:-1;1512:11:27;1440:123;;1444:52;1475:13;1492:4;426:4679:22;1469:20:27;1475:13;;;;;:::i;1469:20::-;426:4679:22;1469:27:27;1444:52;;4053:490:22;4108:18;;:::i;:::-;4155:14;426:4679;-1:-1:-1;;;;;426:4679:22;4136:33;-1:-1:-1;;;;;426:4679:22;;4765:27:20;426:4679:22;;4765:27:20;426:4679:22;4790:1:20;4802:14;426:4679:22;4790:1:20;4826:21;426:4679:22;;;4857:14:20;426:4679:22;;4857:14:20;426:4679:22;4790:1:20;426:4679:22;;4790:1:20;426:4679:22;;4717:228:20;4136:33:22;4236:13;4253:8;4236:25;4253:8;;426:4679;;-1:-1:-1;;;4341:44:22;;-1:-1:-1;;;;;426:4679:22;;;4341:44;;;426:4679;;;;;;;;4341:44;426:4679;;;;;4341:44;426:4679;-1:-1:-1;4348:13:22;-1:-1:-1;;;;;426:4679:22;4341:44;;;;;;;-1:-1:-1;4341:44:22;;;4232:253;4331:54;4232:253;4498:8;4494:42;;4053:490::o;4341:44::-;;;;;;;;;;;;;;:::i;:::-;;;;4232:253;426:4679;;-1:-1:-1;;;4426:48:22;;-1:-1:-1;;;;;426:4679:22;;;4426:48;;;426:4679;;;;;;;;4426:48;426:4679;;;;;4426:48;426:4679;-1:-1:-1;4433:13:22;-1:-1:-1;;;;;426:4679:22;4426:48;;;;;;;-1:-1:-1;4426:48:22;;;4232:253;4416:58;4232:253;;4426:48;;;;;;;;;;;;;;:::i;:::-;;;;2036:1012:19;2151:33;;;;:::i;:::-;2386:13;426:4679:22;2401:5:19;2405:1;2401:5;;;;2616:19;2610:26;2616:19;;;;;;:::i;2610:26::-;2646:19;426:4679:22;;;;;2679:13:19;2688:4;2679:13;;2675:338;2688:4;;;2708:20;;;;;2036:1012;:::o;2675:338::-;2759:27;2773:13;;;;;;;;:::i;2759:27::-;2805:13;426:4679:22;2800:203:19;2820:7;;;;;;2675:338;;;;;2036:1012;:::o;2805:13::-;2863:16;;;;;;426:4679:22;2863:16:19;426:4679:22;;;;2863:16:19;2862:55;2883:34;2889:27;;2901:14;:10;;;;:::i;:::-;:14;:::i;:::-;2889:27;;;:::i;2862:55::-;;426:4679:22;;2805:13:19;;;;;;2386;2432:28;;426:4679:22;2432:28:19;;;;:::i;:::-;426:4679:22;;2386:13:19;;738:1134;854:1;-1:-1:-1;;;;;;;;;908:19:19;;;;;:::i;:::-;426:4679:22;908:26:19;904:55;;-1:-1:-1;;;;;;;;;973:19:19;;;;;:::i;:::-;426:4679:22;973:27:19;426:4679:22;;1037:19:19;1016:49;1026:39;1031:33;:26;1037:19;;1016:49;1037:19;;;;:::i;1016:49::-;969:149;;1221:5;1204:13;:22;:48;;;;969:149;1200:642;;969:149;1852:13;;;738:1134;:::o;1200:642::-;854:1;1380:5;1384:1;1380:5;;;;-1:-1:-1;;;;1602:26:19;:19;;;;;;:::i;:::-;-1:-1:-1;;;;;;426:4679:22;;;1602:26:19;;1598:55;;-1:-1:-1;;;1671:27:19;:19;;;;;;:::i;:27::-;;426:4679:22;;1728:39:19;1733:33;:26;1739:19;;;1718:49;1739:19;1718:49;1739:19;;:::i;1718:49::-;1200:642;;;;1667:165;1806:11;;;;;:::i;:::-;1667:165;;1598:55;943:16;;;854:1;1637:16;;854:1;1637:16;1365:13;1415:28;;426:4679:22;1415:28:19;;;;:::i;:::-;426:4679:22;;1365:13:19;;1204:48;:13;1247:5;1204:13;1230:22;1204:48;;969:149;1096:11;1522:1:27;969:149:19;;;541:1316:26;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;426:4679:22;;;;763:4:26;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;426:4679:22;1103:13:26;426:4679:22;1098:194:26;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;426:4679:22;;;;1164:11:26;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;426:4679:22;;1103:13:26;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:26;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;426:4679:22;1598:13:26;426:4679:22;1593:194:26;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;426:4679:22;;;;1659:11:26;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;426:4679:22;;1598:13:26;;;;638:56;672:22;;;426:4679:22;672:22:26;;426:4679:22;672:22:26;426:4679:22;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1567:2467:25:-;;;;;;;-1:-1:-1;;;;;;;;;1809:13:25;;1567:2467;;1809:13;:::i;:::-;426:4679:22;1809:20:25;1805:50;;-1:-1:-1;;;;;;;;;1870:13:25;;;;;:::i;:::-;426:4679:22;1870:21:25;426:4679:22;;1984:15:25;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;426:4679:22;2184:31:25;;;;;;4015:12;;;;;;;426:4679:22;1567:2467:25;:::o;2177:1828::-;2368:25;2321:33;426:4679:22;;;;;;:::i;:::-;2321:33:25;:::i;:::-;2368:25;;;:::i;:::-;426:4679:22;;;;;;2465:15:25;:30;2461:81;;-1:-1:-1;;;2641:15:25;:7;;;;:::i;:::-;426:4679:22;-1:-1:-1;;;;;;426:4679:22;;;2641:15:25;;426:4679:22;;2676:14:25;;;2689:1;-1:-1:-1;;;2712:15:25;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;426:4679:22;3139:12:25;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:25;3330:10;3339:1;;-1:-1:-1;3339:1:25;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;426:4679:22;3899:12:25;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;426:4679:22;1838:17:25;;426:4679:22;1838:17:25;3008:1033:27;;;;;;3233:26;3357:4;426:4679:22;3329:25:27;3335:18;;;;;;:::i;3329:25::-;426:4679:22;3329:32:27;3325:57;;3425:4;426:4679:22;3396:25:27;3402:18;;;;;;:::i;3396:25::-;426:4679:22;3396:33:27;3425:4;;3466:18;;3445:48;3455:38;3460:32;:25;3466:18;;3445:48;3466:18;;;;:::i;3445:48::-;3392:154;;3653:4;426:4679:22;3624:25:27;3630:18;;;;;;:::i;3624:25::-;426:4679:22;3624:33:27;3620:62;;-1:-1:-1;;;;;426:4679:22;3717:105:27;;;426:4679:22;3717:105:27;;;;3835:24;3831:57;;3898:12;3965:69;3898:12;;:::i;:::-;3965:69;;:::i;3831:57::-;3868:20;;;-1:-1:-1;3868:20:27;;-1:-1:-1;3868:20:27;3620:62;3666:16;;;;;;;;3392:154;3524:11;;;;:::i;:::-;3392:154;;;5001:139:20;5078:10;426:4679:22;-1:-1:-1;426:4679:22;;;;;;;;5113:20:20;426:4679:22;;;;;;;;5001:139:20;:::o;426:4679:22:-;;;;;;;;;;;:::i;:::-;2457:1:26;426:4679:22;;;-1:-1:-1;;426:4679:22;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;2143:1860:26:-;426:4679:22;;2257:21:26;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;426:4679:22;;;;2378:4:26;2369:13;;2378:4;;;2447:12;;;;;:::i;:::-;426:4679:22;;;-1:-1:-1;;;;;;426:4679:22;;2473:26:26;;426:4679:22;2473:26:26;:::i;:::-;;2513:18;2457:1;2513:18;:::o;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;426:4679:22;2726:10:26;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;426:4679:22;2757:32:26;;;;;:::i;:::-;;426:4679:22;2711:13:26;;2548:1449;2945:4;-1:-1:-1;2945:4:26;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;426:4679:22;3078:13:26;426:4679:22;3093:15:26;;;;;;3302:17;;;;:::i;:::-;3338:13;426:4679:22;3353:10:26;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;426:4679:22;3384:46:26;;;;;:::i;:::-;;426:4679:22;3338:13:26;;3078;3139:11;3174:1;;426:4679:22;;3138:43:26;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;426:4679:22;;3078:13:26;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;426:4679:22;3795:15:26;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;426:4679:22;3848:10:26;;;:::i;3843:16::-;426:4679:22;3831:28:26;;;;;:::i;:::-;;426:4679:22;3780:13:26;;4233:351:25;4392:1;;4233:351;4403:153;426:4679:22;;4410:20:25;;;;;4456:26;;;;:::i;:::-;426:4679:22;;;;;;;;4446:36:25;426:4679:22;;4403:153:25;;;4410:20;;;4233:351::o;426:4679:22:-;;;;;;;;;7928:1:25;426:4679:22;;;;;;;:::o;7310:1816:25:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;426:4679:22;7885:26:25;426:4679:22;;7885:26:25;;:::i;:::-;7915:14;426:4679:22;;7915:14:25;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;426:4679:22;;;7989:114:25;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;426:4679:22;7686:4:25;426:4679:22;;;;8251:20:25;426:4679:22;7686:4:25;426:4679:22;;;;8275:16:25;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;426:4679:22;;8333:26:25;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;426:4679:22;;7686:4:25;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;426:4679:22;9076:26:25;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;426:4679:22;;8947:18:25;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;426:4679:22;;5315:14:25;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;426:4679:22;;;;5998:13:25;5994:18;;:::i;5988:25::-;426:4679:22;;;6027:13:25;;426:4679:22;;;;6023:122:25;;6244:13;-1:-1:-1;6239:165:25;6259:10;426:4679:22;;;6259:10:25;;;;6441:28;;;;;:::i;:::-;426:4679:22;;;6483:20:25;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;426:4679:22;6758:19:25;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:25;-1:-1:-1;6519:29:25;-1:-1:-1;6519:29:25;:::o;6244:13::-;6302:32;;426:4679:22;6286:48:25;6302:32;;426:4679:22;6302:32:25;;;:::i;6286:48::-;426:4679:22;;;;6244:13:25;;-1:-1:-1;6244:13:25;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:25;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;426:4679:22;;;;;;5712:20:25;426:4679:22;;;;;;5736:16:25;5712:40;5708:210;5736:16;;;426:4679:22;5772:36:25;;-1:-1:-1;5772:36:25;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:25:o;5452:13::-;5509:31;5494:46;5509:31;;426:4679:22;5509:31:25;;;:::i;5494:46::-;426:4679:22;;5452:13:25;;;;4358:1914:27;;;;;4558:29;4660:4;426:4679:22;4632:25:27;4638:18;;;;;;:::i;4632:25::-;426:4679:22;4632:32:27;4628:57;;4728:4;426:4679:22;4699:25:27;4705:18;;;;;;:::i;4699:25::-;426:4679:22;4699:33:27;4728:4;;4769:18;4748:48;4758:38;4763:32;:25;4769:18;;4748:48;4769:18;;;;:::i;4748:48::-;735:66;4925:33;;;;;:::i;:::-;4972:30;4968:64;;5316:27;5261:33;5204:27;5115;5308:36;5115:27;;;;:::i;:::-;5204;;;:::i;:::-;5261:33;;;:::i;5308:36::-;-1:-1:-1;;;;;426:4679:22;;;;;5308:49:27;5304:81;;5457:33;;;;;:::i;:::-;5528:17;426:4679:22;5594:18:27;5588:25;5594:18;;;;;;:::i;5588:25::-;426:4679:22;;;;;5644:4:27;5631:17;;5644:4;;;5668:22;;;;;5627:541;6191:27;6187:56;;6261:4;4358:1914;:::o;6187:56::-;6227:16;;;426:4679:22;6227:16:27;;426:4679:22;6227:16:27;5627:541;5715:18;;;;;5644:4;5715:18;;5711:457;5644:4;;;5753:13;;;;;;426:4679:22;5627:541:27;;5711:457;5805:4;-1:-1:-1;5805:4:27;;5843:17;5829:31;5843:17;;;;;:::i;5829:31::-;5883:13;426:4679:22;5878:218:27;5898:7;;;;;;5787:381;;;;;5627:541;;5883:13;5943:14;;;;;;5987:1;5943:14;426:4679:22;;;;5943:14:27;5942:52;5961:33;5967:26;;5978:14;:10;;;;:::i;5942:52::-;;426:4679:22;;5883:13:27;;;;;;5304:81;5366:19;;;426:4679:22;5366:19:27;;426:4679:22;5366:19:27;4968:64;5011:21;;;426:4679:22;5011:21:27;;426:4679:22;5011:21:27;4695:154;4827:11;;;;:::i;:::-;4695:154;;4217:1141:26;;426:4679:22;;4321:21:26;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;426:4679:22;;;;4442:4:26;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;426:4679:22;4682:13:26;426:4679:22;4677:194:26;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;426:4679:22;;;;4743:11:26;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;426:4679:22;;4682:13:26;;;;4563:789;4945:4;-1:-1:-1;4945:4:26;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;426:4679:22;5108:13:26;426:4679:22;5103:194:26;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;426:4679:22;;;;5169:11:26;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;426:4679:22;;5108:13:26;;;;9295:1058:25;;426:4679:22;;9395:19:25;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;426:4679:22;;9606:18:25;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;426:4679:22;;;-1:-1:-1;;;426:4679:22;9413:1:25;9643:36;;426:4679:22;9643:36:25;:::i;:::-;;9627:1;9698:13;426:4679:22;;9713:18:25;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;426:4679:22;;;;;;9779:22:25;426:4679:22;;-1:-1:-1;;;;;;426:4679:22;;;9772:30:25;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;426:4679:22;;-1:-1:-1;;;;;;426:4679:22;;;9836:32:25;9820:48;9827:5;;;:::i;9820:48::-;;426:4679:22;9698:13:25;;9713:18;-1:-1:-1;9713:18:25;-1:-1:-1;9295:1058:25:o;9562:761::-;426:4679:22;9993:33:25;10003:22;:18;426:4679:22;;10003:18:25;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;426:4679:22;;10060:18:25;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;426:4679:22;10045:13:25;;10590:651;;;;10709:23;426:4679:22;;10709:23:25;;:::i;:::-;10735:14;426:4679:22;;10735:14:25;:::i;:::-;-1:-1:-1;10705:58:25;;-1:-1:-1;10779:13:25;426:4679:22;;10794:18:25;;;;;10862:16;10863:10;;;;:::i;:::-;426:4679:22;;;;10862:16:25;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;426:4679:22;;;;10925:16:25;10921:21;;:::i;10915:33::-;426:4679:22;11067:30:25;11080:17;11086:10;;;;;:::i;11067:30::-;426:4679:22;;11067:30:25;11063:81;;426:4679:22;;10779:13:25;;11063:81;11117:12;;;;-1:-1:-1;11117:12:25;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;426:4679:22;10590:651:25;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:25;:::o;5563:305:26:-;;;-1:-1:-1;;;426:4679:22;-1:-1:-1;;;;;;426:4679:22;5670:12:26;;5563:305;;;5670:12;:::i;:::-;;426:4679:22;5670:20:26;5666:50;;5750:89;;;;;5563:305::o;5666:50::-;5699:17;;;-1:-1:-1;5699:17:26;;-1:-1:-1;5699:17:26","linkReferences":{},"immutableReferences":{"40183":[{"start":358,"length":32},{"start":1036,"length":32},{"start":1401,"length":32},{"start":2695,"length":32}],"40191":[{"start":1118,"length":32},{"start":2124,"length":32}],"40193":[{"start":498,"length":32},{"start":2090,"length":32}],"43292":[{"start":645,"length":32},{"start":851,"length":32},{"start":1280,"length":32},{"start":1562,"length":32},{"start":2158,"length":32},{"start":3973,"length":32},{"start":4119,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond(uint256)":"9940686e","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancelAndWithdraw()":"6b892b22","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,uint256),uint256)":"ede7f6a3","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","tokenContract()":"55a373d6","totalBondsDeposited()":"fe03a460"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedBytes32\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransferEvent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ToAddressMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongEventSignature\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongTokenContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bondAmount\",\"type\":\"uint256\"}],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAndWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptPath\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"logIndex\",\"type\":\"uint256\"}],\"internalType\":\"struct EscrowERC20.ReceiptProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"cancelAndWithdraw()\":{\"notice\":\"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowERC20.sol\":\"EscrowERC20\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6\",\"dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowERC20.sol\":{\"keccak256\":\"0x33e054750cf105681bbcb49f94245b6c415845657f0a843f53f40b947713f68c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cd2751e798bf4cfa05f0c6ba80320d993ed0cf7053a5f5878d524dd67049401f\",\"dweb:/ipfs/QmUumceDHvrTdqh5V4L1PpiJjDphxhsXXcsXfPD8qxA3zR\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f\",\"dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedBytes32"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTransferEvent"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"ToAddressMismatch"},{"inputs":[],"type":"error","name":"TokenTransferFailed"},{"inputs":[],"type":"error","name":"WrongEventSignature"},{"inputs":[],"type":"error","name":"WrongTokenContract"},{"inputs":[],"type":"error","name":"ZeroAddress"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"_bondAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"cancelAndWithdraw"},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowERC20.ReceiptProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"proofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptPath","type":"bytes"},{"internalType":"uint256","name":"logIndex","type":"uint256"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"cancelAndWithdraw()":{"notice":"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded."}},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowERC20.sol":"EscrowERC20"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550","urls":["bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6","dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowERC20.sol":{"keccak256":"0x33e054750cf105681bbcb49f94245b6c415845657f0a843f53f40b947713f68c","urls":["bzz-raw://cd2751e798bf4cfa05f0c6ba80320d993ed0cf7053a5f5878d524dd67049401f","dweb:/ipfs/QmUumceDHvrTdqh5V4L1PpiJjDphxhsXXcsXfPD8qxA3zR"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728","urls":["bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f","dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH"],"license":"UNLICENSED"}},"version":1},"id":22} \ No newline at end of file diff --git a/out/EscrowNative.sol/EscrowNative.json b/out/EscrowNative.sol/EscrowNative.json index ec219c2..ec1efb0 100644 --- a/out/EscrowNative.sol/EscrowNative.json +++ b/out/EscrowNative.sol/EscrowNative.json @@ -1 +1 @@ -{"abi":[{"type":"constructor","inputs":[{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancelAndWithdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowNative.NativeTransferProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"transactionRlp","type":"bytes","internalType":"bytes"},{"name":"txProofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"receiptProofNodes","type":"bytes","internalType":"bytes"},{"name":"path","type":"bytes","internalType":"bytes"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ETHTransferFailed","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"IncorrectETHAmount","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidNativeTransfer","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTxProof","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"ReceiptStatusNotSuccess","inputs":[]},{"type":"error","name":"RecipientMismatch","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"TxFailed","inputs":[]},{"type":"error","name":"UnsupportedTxType","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x60e0601f611e5838819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611d23908161013582396080518181816101560152818161051e015281816105de0152610690015260a0518181816103070152610630015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633d2691bc146101265780635a4fd6451461012157806364c9ec6f1461011c5780636b892b221461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107b1565b61078c565b61076f565b61074b565b61067c565b61065f565b61061b565b6105cc565b6105af565b6104f4565b610427565b61040b565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107ce565b9061093e565b61022a61022483806107ce565b90610aae565b602482019161026b61026761023f85876107ce565b61024f60448697939701896107ce565b60a48701979161025f898c6107ce565b949093610bb7565b1590565b610367576102676102b491608461028b61028588806107ce565b90610bde565b9161025f60648201966102ab6102a1898c6107ce565b959094018b6107ce565b9290918b6107ce565b610358576102676102c86102ce92856107ce565b90610c3f565b610349576102e26102679161032c936107ce565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d0f565b61033a57610338610f2a565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f5760045480151590816104ea575b506104b7575b60075460ff8160081c16156104a85760ff16610499576104636108d1565b61048a575f5460011c341061047b5761033834610f90565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b6005545f548181018091116104e5575f556006549081018091116104e5576006556104e0610fb8565b610445565b610886565b905042115f61043f565b3461019f575f36600319011261019f5760ff6001811960075416178060075560081c16156104a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610554610fb8565b61055c610fef565b61057361ff0019600754166007555f6001555f8055565b80156105a0575f80808093335af161058961085c565b501561059157005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff1661073c57811561072d57801561071e576106e181836108c4565b340361070f576106f6826106fb935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f5760206107656108d1565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083b57604052565b610801565b67ffffffffffffffff811161083b57601f01601f191660200190565b3d15610881573d9061087561087083610840565b610815565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b90600182018092116104e557565b90601582018092116104e557565b60010190816001116104e557565b919082018092116104e557565b60045480151590816108e1575090565b905042111590565b6001198101919082116104e557565b5f198101919082116104e557565b919082039182116104e557565b92919261092261087083610840565b938285528282011161019f57815f926020928387013784010152565b9061095261026760075460ff9060081c1690565b6104a8576003546001600160a01b03163314801590610a12575b610a03574383116109f4576101006109848443610906565b116109e557824080156109d65761099c368385610913565b60208151910120036109c7576109b191611001565b036109b857565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a1e6102676108d1565b61096c565b634e487b7160e01b5f52603260045260245ffd5b9015610a405790565b610a23565b90821015610a40570190565b60ff60f6199116019060ff82116104e557565b60ff607f199116019060ff82116104e557565b60ff60bf199116019060ff82116104e557565b60ff60b6199116019060ff82116104e557565b60ff166001019060ff82116104e557565b905f600360fe1b6001600160f81b0319610ad9610acb8587610a37565b356001600160f81b03191690565b1610610ba857601f60fb1b6001600160f81b0319610afa610acb8587610a37565b1610610b9f5780610b34610b2e610b29610b24610b1e610acb610b3a97898b610a45565b60f81c90565b610a51565b610a9d565b60ff1690565b906108c4565b905b5f5b60048110610b8a5750600560fd1b906001600160f81b031990610b6790610acb90859087610a45565b1603610b7b57610b769061089a565b013590565b633954003560e11b5f5260045ffd5b91610b9860019183866110b1565b9201610b3e565b50600190610b3c565b63c0098bd960e01b5f5260045ffd5b610bcd610bd592939495610bdb98973691610913565b923691610913565b90611239565b90565b90610be981836113f3565b905f5b60058110610c2a5750600560fd1b906001600160f81b031990610c1190849086610a45565b351603610b7b576001810181116104e557016001013590565b91610c3860019183866110b1565b9201610bec565b5f9082151580610cf3575b610cea575b60c060ff610c64610b1e610acb868887610a45565b1610610cdb57610b1e610acb82858560f860ff610c8e610b1e610acb839b60019d610cb89c610a45565b1610610cd25780610b34610b2e610b29610b24610b1e610acb610cb297898b610a45565b91610a45565b1603610cc357600190565b63e9dd8a9d60e01b5f5260045ffd5b610cb29061089a565b631bd5dcf760e31b5f5260045ffd5b60019150610c4f565b50608060ff610d08610b1e610acb8786610a37565b1610610c4a565b90916003905f84151580610f0e575b610ec6575b60c060ff610d38610b1e610acb858a8a610a45565b1610610cdb578060f860ff610d57610b1e610acb610d7d968b8b610a45565b1610610ebd5760ff610d76610b29610b24610b1e610acb868c8c610a45565b16906108c4565b915f905b808210610ea6575050609460ff610d9f610b1e610acb868989610a45565b1603610e97576001600160a01b03168282016001013560601c03610e8857610dc6906108a8565b91610dd8610b1e610acb858486610a45565b925f9260ff851694608086105f14610e095750505050505b03610dfa57600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e225750505050505f610df0565b610b2e610e3191939293610a64565b915f935b838510610e46575050505050610df0565b9091929394610e5760019160081b90565b610e7c610b2e610b1e610acb610e758b610e708b61089a565b6108c4565b8789610a45565b17950193929190610e35565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eb560019187876110b1565b930190610d81565b60ff6001610d76565b509050610ed9610b1e610acb8585610a37565b6001919060ff16808303610ef05750600491610d23565b600203610eff57600591610d23565b636fc3daa360e11b5f5260045ffd5b50608060ff610f23610b1e610acb8989610a37565b1610610d1e565b6005545f5481018091116104e55760015481018091116104e5575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f8861085c565b501561059157565b336001600160601b0360a01b600354161760035561012c42018042116104e557600455600555565b610fc06108d1565b610fe0576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116104e55790565b61100b82826113f3565b915f5b6008811061109c5750611028610b1e610acb858486610a45565b925f9260ff851694608086105f1461104257505050505090565b6110539193949550610b2e90610a64565b915f935b83851061106657505050505090565b909192939461107760019160081b90565b611090610b2e610b1e610acb610e758b610e708b61089a565b17950193929190611057565b926110aa60019183856110b1565b930161100e565b91908082101561120c576110cc610b1e610acb848487610a45565b9060ff821660808110156110e757505050610bdb915061089a565b91929160b881101561110f575050610bdb9250610b2e611109610b349261089a565b92610a64565b90929060c08110156111855750610b2e61112b91949394610a8a565b915f935f915b84831061114c57505050610bdb9291610e70610e709261089a565b90919461115b60019160081b90565b61117b610b2e610b1e610acb6111748b610e708b61089a565b8888610a45565b1795019190611131565b90929060f811156111ab5750610bdb9250610b2e6111a5610b349261089a565b92610a77565b9291610b2e6111b991610a51565b915f935f915b8483106111da57505050610bdb9291610e70610e709261089a565b9091946111e960019160081b90565b611202610b2e610b1e610acb6111748b610e708b61089a565b17950191906111bf565b6318d76ae160e11b5f5260045ffd5b805115610a405760200190565b908151811015610a40570160200190565b919390929190600360fe1b6001600160f81b031961125a610acb8689610a37565b16106113e457601f60fb1b6001600160f81b031961127b610acb8689610a37565b16106113da5761129f61129a610b2e610b24610b1e610acb888b610a37565b6108b6565b9492905b945f5b8282106112b857505050505050505f90565b6112d66112cf836112ca36878a610913565b611550565b90936108c4565b96825160208401200361137857600360fe1b6113126113056112f78561121b565b516001600160f81b03191690565b6001600160f81b03191690565b10611378578590846001601f60fb1b6113306113056112f78861121b565b10156113bc575b61134181866116f7565b60118103611383575061135394611882565b94911561137857841561136c5793915b919590936112a6565b50505050505050600190565b505050505050505f90565b9093506002141590506113b05784879261139c9461173c565b94911561137857841561136c579391611363565b50505050505050505f90565b506113d561129a610b2e610b24610b1e6112f78961121b565b611337565b60019492906112a3565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b031961140f610acb8686610a37565b1610610ba857601f60fb1b6001600160f81b0319611430610acb8686610a37565b16106115025780610b34610b2e610b29610b24610b1e610acb611454978a8a610a45565b905b61a5bd461480156114f7575b61146d575b50905090565b5f5b600381106114e25750600360fe1b61148e611305610acb858786610a45565b10610ba857601f60fb1b6114a9611305610acb858786610a45565b106114d257610b2e610b29610b24610b1e610acb866114cb98610b3497610a45565b805f611467565b506114dd915061089a565b6114cb565b916114f060019185846110b1565b920161146f565b5061a5bf4614611462565b50600190611456565b60409061151782610815565b6001815291601f1901366020840137565b9061153561087083610840565b8281528092611546601f1991610840565b0190602036910137565b805182101561120c57611569610b1e6112f78484611228565b9160ff831660808110156115a25750505061158261150b565b9060f81b6001600160f81b0319165f1a61159b8261121b565b5390600190565b919392909160b881101561160c5750610b2e6115bd91610a64565b906115c782611528565b935f5b8381106115dd57505050610bdb906108b6565b806115f96112f76115f3600194610e708861089a565b85611228565b5f1a6116058289611228565b53016115ca565b60c011156116aa57610b2e61162091610a8a565b5f915f5b82811061167c575061163583611528565b945f5b84811061164f5750505090610e70610bdb926108b6565b806116696112f76115f3600194610e7089610e708a61089a565b5f1a611675828a611228565b5301611638565b9260019060081b6116a2610b2e610b1e6112f761169c89610e708961089a565b8b611228565b179301611624565b50916116b68382611997565b926116c084611528565b915f5b8581106116d1575050509190565b806116e46112f76115f3600194876108c4565b5f1a6116f08287611228565b53016116c3565b5f92915b81518110156117225761170e8183611997565b81018091116104e5576001909301926116fb565b5050565b908160011b91808304600214901517156104e557565b8394929161174a8183611550565b93906117696020611760610b1e6112f78561121b565b16151591611ac4565b9788911561180b575061177d9051876108c4565b6117878251611726565b1461179c575b505050505050505f905f905f90565b868660019282516117f9575b5050506117b6575b8061178d565b6117c9926117c3916108c4565b90611550565b50602081519101209060208151910120146117e757808080806117b0565b6117f29151906108c4565b6001915f90565b6118039350611c2f565b86865f6117a8565b61181c939495965061026792611c2f565b6118755761182d926117c3916108c4565b50908151602081145f146118555750602061184d920151925b51906108c4565b916001929190565b801561186957602061184d93012092611846565b505050505f905f905f90565b50505050505f905f905f90565b919092936118908251611726565b85101561193a5750610b1e6112f76118b2926118ac8760011c90565b90611228565b600184166119315760041c600f16915b905f925b60ff8116841061191157506118db9250611550565b50805180156119065761184d91602082036118fc576020915001519161089a565b602001209161089a565b5050505f905f905f90565b9091600161192582610b3460ff9487611997565b940193929190506118c6565b600f16916118c2565b9290509392935f915b6010831061197d576119559250611550565b50602081519101209060208151910120145f1461197457600191905f90565b5f915081908190565b9061198e81610b3460019385611997565b92019190611943565b90815181101561120c576119b1610b1e6112f78385611228565b9160ff831660808110156119c85750505050600190565b60b88110156119e357505050610b2e610b29610bdb92610a64565b60c0811015611a4f575091610b2e6119fa91610a8a565b905f925f915b838310611a175750505090610e70610bdb926108b6565b909193611a2660019160081b90565b611a45610b2e610b1e6112f7611a3f8a610e708961089a565b88611228565b1794019190611a00565b60f81115611a68575050610b2e610b29610bdb92610a77565b91610b2e611a7591610a51565b905f925f915b838310611a925750505090610e70610bdb926108b6565b909193611aa160019160081b90565b611aba610b2e610b1e6112f7611a3f8a610e708961089a565b1794019190611a7b565b90815115611c2d57611adb610b1e6112f78461121b565b6010811615611baa57611afe611af9611af48551611726565b6108f8565b611528565b9060f81b600f60f81b165f1a611b138261121b565b5360015b8351811015611ba55780611b52611b42611b39610b1e6112f76001968a611228565b60041c600f1690565b60f81b6001600160f81b03191690565b611b6b611b61611af484611726565b915f1a9185611228565b53611b92600f611b81610b1e6112f7858a611228565b1660f81b6001600160f81b03191690565b611b9e611b6183611726565b5301611b17565b509150565b50611bc0611af9611bbb8451611726565b6108e9565b60015b8351811015611ba55780611be5611b42611b39610b1e6112f76001968a611228565b611bf9611b61611bf4846108f8565b611726565b53611c0f600f611b81610b1e6112f7858a611228565b611c26611b61611c21611bf4856108f8565b61089a565b5301611bc3565b565b919091611c3d8251846108c4565b611c478251611726565b10611ce6575f5b8251811015611cdd57611c6a611c6482866108c4565b60011690565b611cbf57611c93611b39610b1e6112f7611c8d611c87868a6108c4565b60011c90565b86611228565b60ff611ca8610b2e610b1e6112f78689611228565b911603611cb757600101611c4e565b505050505f90565b600f611cd7610b1e6112f7611c8d611c87868a6108c4565b16611c93565b50505050600190565b5050505f9056fea2646970667358221220f4598e927f93dbeaa4a20f290936343400629961d598e1f51e8a971f4c36efcc64736f6c634300081e0033","sourceMap":"92:4594:22:-:0;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;-1:-1:-1;;;;;92:4594:22;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;92:4594:22;;;;;;;;;;;;;;;;;;1670:38:20;;;1718:32;;1778:10;92:4594:22;1760:28:20;1248:24:22;;;:53;;;-1:-1:-1;1244:372:22;;-1:-1:-1;92:4594:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1670:38:20;92:4594:22;;;;;;;;;;1718:32:20;92:4594:22;;;;;;;;;;;1244:372;92:4594;;;;;;;;1321:9;:57;1317:90;;92:4594;-1:-1:-1;92:4594:22;1477:43;92:4594;;;;;;1592:13;92:4594;;;1592:13;92:4594;1244:372;;;;1317:90;1387:20;;;-1:-1:-1;1387:20:22;;-1:-1:-1;1387:20:22;92:4594;;;;-1:-1:-1;92:4594:22;;;;;-1:-1:-1;92:4594:22;1248:53;1276:25;;;;1248:53;;92:4594;-1:-1:-1;92:4594:22;;;;;;-1:-1:-1;92:4594:22;;;;;-1:-1:-1;92:4594:22","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633d2691bc146101265780635a4fd6451461012157806364c9ec6f1461011c5780636b892b221461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107b1565b61078c565b61076f565b61074b565b61067c565b61065f565b61061b565b6105cc565b6105af565b6104f4565b610427565b61040b565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107ce565b9061093e565b61022a61022483806107ce565b90610aae565b602482019161026b61026761023f85876107ce565b61024f60448697939701896107ce565b60a48701979161025f898c6107ce565b949093610bb7565b1590565b610367576102676102b491608461028b61028588806107ce565b90610bde565b9161025f60648201966102ab6102a1898c6107ce565b959094018b6107ce565b9290918b6107ce565b610358576102676102c86102ce92856107ce565b90610c3f565b610349576102e26102679161032c936107ce565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d0f565b61033a57610338610f2a565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f5760045480151590816104ea575b506104b7575b60075460ff8160081c16156104a85760ff16610499576104636108d1565b61048a575f5460011c341061047b5761033834610f90565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b6005545f548181018091116104e5575f556006549081018091116104e5576006556104e0610fb8565b610445565b610886565b905042115f61043f565b3461019f575f36600319011261019f5760ff6001811960075416178060075560081c16156104a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610554610fb8565b61055c610fef565b61057361ff0019600754166007555f6001555f8055565b80156105a0575f80808093335af161058961085c565b501561059157005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff1661073c57811561072d57801561071e576106e181836108c4565b340361070f576106f6826106fb935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f5760206107656108d1565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083b57604052565b610801565b67ffffffffffffffff811161083b57601f01601f191660200190565b3d15610881573d9061087561087083610840565b610815565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b90600182018092116104e557565b90601582018092116104e557565b60010190816001116104e557565b919082018092116104e557565b60045480151590816108e1575090565b905042111590565b6001198101919082116104e557565b5f198101919082116104e557565b919082039182116104e557565b92919261092261087083610840565b938285528282011161019f57815f926020928387013784010152565b9061095261026760075460ff9060081c1690565b6104a8576003546001600160a01b03163314801590610a12575b610a03574383116109f4576101006109848443610906565b116109e557824080156109d65761099c368385610913565b60208151910120036109c7576109b191611001565b036109b857565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a1e6102676108d1565b61096c565b634e487b7160e01b5f52603260045260245ffd5b9015610a405790565b610a23565b90821015610a40570190565b60ff60f6199116019060ff82116104e557565b60ff607f199116019060ff82116104e557565b60ff60bf199116019060ff82116104e557565b60ff60b6199116019060ff82116104e557565b60ff166001019060ff82116104e557565b905f600360fe1b6001600160f81b0319610ad9610acb8587610a37565b356001600160f81b03191690565b1610610ba857601f60fb1b6001600160f81b0319610afa610acb8587610a37565b1610610b9f5780610b34610b2e610b29610b24610b1e610acb610b3a97898b610a45565b60f81c90565b610a51565b610a9d565b60ff1690565b906108c4565b905b5f5b60048110610b8a5750600560fd1b906001600160f81b031990610b6790610acb90859087610a45565b1603610b7b57610b769061089a565b013590565b633954003560e11b5f5260045ffd5b91610b9860019183866110b1565b9201610b3e565b50600190610b3c565b63c0098bd960e01b5f5260045ffd5b610bcd610bd592939495610bdb98973691610913565b923691610913565b90611239565b90565b90610be981836113f3565b905f5b60058110610c2a5750600560fd1b906001600160f81b031990610c1190849086610a45565b351603610b7b576001810181116104e557016001013590565b91610c3860019183866110b1565b9201610bec565b5f9082151580610cf3575b610cea575b60c060ff610c64610b1e610acb868887610a45565b1610610cdb57610b1e610acb82858560f860ff610c8e610b1e610acb839b60019d610cb89c610a45565b1610610cd25780610b34610b2e610b29610b24610b1e610acb610cb297898b610a45565b91610a45565b1603610cc357600190565b63e9dd8a9d60e01b5f5260045ffd5b610cb29061089a565b631bd5dcf760e31b5f5260045ffd5b60019150610c4f565b50608060ff610d08610b1e610acb8786610a37565b1610610c4a565b90916003905f84151580610f0e575b610ec6575b60c060ff610d38610b1e610acb858a8a610a45565b1610610cdb578060f860ff610d57610b1e610acb610d7d968b8b610a45565b1610610ebd5760ff610d76610b29610b24610b1e610acb868c8c610a45565b16906108c4565b915f905b808210610ea6575050609460ff610d9f610b1e610acb868989610a45565b1603610e97576001600160a01b03168282016001013560601c03610e8857610dc6906108a8565b91610dd8610b1e610acb858486610a45565b925f9260ff851694608086105f14610e095750505050505b03610dfa57600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e225750505050505f610df0565b610b2e610e3191939293610a64565b915f935b838510610e46575050505050610df0565b9091929394610e5760019160081b90565b610e7c610b2e610b1e610acb610e758b610e708b61089a565b6108c4565b8789610a45565b17950193929190610e35565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eb560019187876110b1565b930190610d81565b60ff6001610d76565b509050610ed9610b1e610acb8585610a37565b6001919060ff16808303610ef05750600491610d23565b600203610eff57600591610d23565b636fc3daa360e11b5f5260045ffd5b50608060ff610f23610b1e610acb8989610a37565b1610610d1e565b6005545f5481018091116104e55760015481018091116104e5575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f8861085c565b501561059157565b336001600160601b0360a01b600354161760035561012c42018042116104e557600455600555565b610fc06108d1565b610fe0576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116104e55790565b61100b82826113f3565b915f5b6008811061109c5750611028610b1e610acb858486610a45565b925f9260ff851694608086105f1461104257505050505090565b6110539193949550610b2e90610a64565b915f935b83851061106657505050505090565b909192939461107760019160081b90565b611090610b2e610b1e610acb610e758b610e708b61089a565b17950193929190611057565b926110aa60019183856110b1565b930161100e565b91908082101561120c576110cc610b1e610acb848487610a45565b9060ff821660808110156110e757505050610bdb915061089a565b91929160b881101561110f575050610bdb9250610b2e611109610b349261089a565b92610a64565b90929060c08110156111855750610b2e61112b91949394610a8a565b915f935f915b84831061114c57505050610bdb9291610e70610e709261089a565b90919461115b60019160081b90565b61117b610b2e610b1e610acb6111748b610e708b61089a565b8888610a45565b1795019190611131565b90929060f811156111ab5750610bdb9250610b2e6111a5610b349261089a565b92610a77565b9291610b2e6111b991610a51565b915f935f915b8483106111da57505050610bdb9291610e70610e709261089a565b9091946111e960019160081b90565b611202610b2e610b1e610acb6111748b610e708b61089a565b17950191906111bf565b6318d76ae160e11b5f5260045ffd5b805115610a405760200190565b908151811015610a40570160200190565b919390929190600360fe1b6001600160f81b031961125a610acb8689610a37565b16106113e457601f60fb1b6001600160f81b031961127b610acb8689610a37565b16106113da5761129f61129a610b2e610b24610b1e610acb888b610a37565b6108b6565b9492905b945f5b8282106112b857505050505050505f90565b6112d66112cf836112ca36878a610913565b611550565b90936108c4565b96825160208401200361137857600360fe1b6113126113056112f78561121b565b516001600160f81b03191690565b6001600160f81b03191690565b10611378578590846001601f60fb1b6113306113056112f78861121b565b10156113bc575b61134181866116f7565b60118103611383575061135394611882565b94911561137857841561136c5793915b919590936112a6565b50505050505050600190565b505050505050505f90565b9093506002141590506113b05784879261139c9461173c565b94911561137857841561136c579391611363565b50505050505050505f90565b506113d561129a610b2e610b24610b1e6112f78961121b565b611337565b60019492906112a3565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b031961140f610acb8686610a37565b1610610ba857601f60fb1b6001600160f81b0319611430610acb8686610a37565b16106115025780610b34610b2e610b29610b24610b1e610acb611454978a8a610a45565b905b61a5bd461480156114f7575b61146d575b50905090565b5f5b600381106114e25750600360fe1b61148e611305610acb858786610a45565b10610ba857601f60fb1b6114a9611305610acb858786610a45565b106114d257610b2e610b29610b24610b1e610acb866114cb98610b3497610a45565b805f611467565b506114dd915061089a565b6114cb565b916114f060019185846110b1565b920161146f565b5061a5bf4614611462565b50600190611456565b60409061151782610815565b6001815291601f1901366020840137565b9061153561087083610840565b8281528092611546601f1991610840565b0190602036910137565b805182101561120c57611569610b1e6112f78484611228565b9160ff831660808110156115a25750505061158261150b565b9060f81b6001600160f81b0319165f1a61159b8261121b565b5390600190565b919392909160b881101561160c5750610b2e6115bd91610a64565b906115c782611528565b935f5b8381106115dd57505050610bdb906108b6565b806115f96112f76115f3600194610e708861089a565b85611228565b5f1a6116058289611228565b53016115ca565b60c011156116aa57610b2e61162091610a8a565b5f915f5b82811061167c575061163583611528565b945f5b84811061164f5750505090610e70610bdb926108b6565b806116696112f76115f3600194610e7089610e708a61089a565b5f1a611675828a611228565b5301611638565b9260019060081b6116a2610b2e610b1e6112f761169c89610e708961089a565b8b611228565b179301611624565b50916116b68382611997565b926116c084611528565b915f5b8581106116d1575050509190565b806116e46112f76115f3600194876108c4565b5f1a6116f08287611228565b53016116c3565b5f92915b81518110156117225761170e8183611997565b81018091116104e5576001909301926116fb565b5050565b908160011b91808304600214901517156104e557565b8394929161174a8183611550565b93906117696020611760610b1e6112f78561121b565b16151591611ac4565b9788911561180b575061177d9051876108c4565b6117878251611726565b1461179c575b505050505050505f905f905f90565b868660019282516117f9575b5050506117b6575b8061178d565b6117c9926117c3916108c4565b90611550565b50602081519101209060208151910120146117e757808080806117b0565b6117f29151906108c4565b6001915f90565b6118039350611c2f565b86865f6117a8565b61181c939495965061026792611c2f565b6118755761182d926117c3916108c4565b50908151602081145f146118555750602061184d920151925b51906108c4565b916001929190565b801561186957602061184d93012092611846565b505050505f905f905f90565b50505050505f905f905f90565b919092936118908251611726565b85101561193a5750610b1e6112f76118b2926118ac8760011c90565b90611228565b600184166119315760041c600f16915b905f925b60ff8116841061191157506118db9250611550565b50805180156119065761184d91602082036118fc576020915001519161089a565b602001209161089a565b5050505f905f905f90565b9091600161192582610b3460ff9487611997565b940193929190506118c6565b600f16916118c2565b9290509392935f915b6010831061197d576119559250611550565b50602081519101209060208151910120145f1461197457600191905f90565b5f915081908190565b9061198e81610b3460019385611997565b92019190611943565b90815181101561120c576119b1610b1e6112f78385611228565b9160ff831660808110156119c85750505050600190565b60b88110156119e357505050610b2e610b29610bdb92610a64565b60c0811015611a4f575091610b2e6119fa91610a8a565b905f925f915b838310611a175750505090610e70610bdb926108b6565b909193611a2660019160081b90565b611a45610b2e610b1e6112f7611a3f8a610e708961089a565b88611228565b1794019190611a00565b60f81115611a68575050610b2e610b29610bdb92610a77565b91610b2e611a7591610a51565b905f925f915b838310611a925750505090610e70610bdb926108b6565b909193611aa160019160081b90565b611aba610b2e610b1e6112f7611a3f8a610e708961089a565b1794019190611a7b565b90815115611c2d57611adb610b1e6112f78461121b565b6010811615611baa57611afe611af9611af48551611726565b6108f8565b611528565b9060f81b600f60f81b165f1a611b138261121b565b5360015b8351811015611ba55780611b52611b42611b39610b1e6112f76001968a611228565b60041c600f1690565b60f81b6001600160f81b03191690565b611b6b611b61611af484611726565b915f1a9185611228565b53611b92600f611b81610b1e6112f7858a611228565b1660f81b6001600160f81b03191690565b611b9e611b6183611726565b5301611b17565b509150565b50611bc0611af9611bbb8451611726565b6108e9565b60015b8351811015611ba55780611be5611b42611b39610b1e6112f76001968a611228565b611bf9611b61611bf4846108f8565b611726565b53611c0f600f611b81610b1e6112f7858a611228565b611c26611b61611c21611bf4856108f8565b61089a565b5301611bc3565b565b919091611c3d8251846108c4565b611c478251611726565b10611ce6575f5b8251811015611cdd57611c6a611c6482866108c4565b60011690565b611cbf57611c93611b39610b1e6112f7611c8d611c87868a6108c4565b60011c90565b86611228565b60ff611ca8610b2e610b1e6112f78689611228565b911603611cb757600101611c4e565b505050505f90565b600f611cd7610b1e6112f7611c8d611c87868a6108c4565b16611c93565b50505050600190565b5050505f9056fea2646970667358221220f4598e927f93dbeaa4a20f290936343400629961d598e1f51e8a971f4c36efcc64736f6c634300081e0033","sourceMap":"92:4594:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;92:4594:22;;;;2363:15:20;-1:-1:-1;;;;;92:4594:22;2349:10:20;:29;2345:56;;2411:27;92:4594:22;;-1:-1:-1;;92:4594:22;;;;2345:56:20;2387:14;;;92:4594:22;2387:14:20;92:4594:22;;2387:14:20;92:4594:22;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;1263:29:20;92:4594:22;;;-1:-1:-1;;;;;92:4594:22;;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;;;;;;;;;;;;;;;;;;;;2799:17;92:4594;;2780:17;;;;:::i;:::-;2799;;:::i;:::-;2916:60;2958:17;;;;:::i;:::-;2916:60;;:::i;:::-;92:4594;3022:20;;;2990:103;2991:102;3022:20;;;;:::i;:::-;3044:18;;;;;;;;;:::i;:::-;3064:10;;;;;;;;;:::i;:::-;2991:102;;;;:::i;:::-;2990:103;;92:4594;2990:103;2986:157;;3300:99;3299:100;3267:17;3349:23;3229:56;3267:17;;;;:::i;:::-;3229:56;;:::i;:::-;3331:16;3374:10;3331:16;;;;3349:23;3331:16;;;;:::i;:::-;3349:23;;;;;;:::i;:::-;3374:10;;;;;:::i;3299:100::-;3295:159;;3525:56;3564:16;3524:57;3564:16;;;:::i;:::-;3525:56;;:::i;3524:57::-;3520:80;;3722:20;3682:96;3722:20;3681:97;3722:20;;:::i;:::-;3763:14;;3744:17;;3682:96;;:::i;3681:97::-;3677:158;;;;:::i;:::-;92:4594;3677:158;3801:23;;;-1:-1:-1;3801:23:22;92:4594;-1:-1:-1;3801:23:22;3520:80;3590:10;;;-1:-1:-1;3590:10:22;92:4594;-1:-1:-1;3590:10:22;3295:159;3422:21;;;-1:-1:-1;3422:21:22;92:4594;-1:-1:-1;3422:21:22;2986:157;3116:16;;;-1:-1:-1;3116:16:22;92:4594;-1:-1:-1;3116:16:22;92:4594;;;;;;-1:-1:-1;;92:4594:22;;;;;;;963:39:20;92:4594:22;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;1407:31:20;92:4594:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;;1085:3:20;92:4594:22;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;3850:21:20;;;:60;;;;92:4594:22;3846:204:20;;;92:4594:22;4200:6:20;92:4594:22;;;;;;4199:7:20;4195:31;;92:4594:22;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;92:4594:22;;;;2438:9;4362:37:20;4358:68;;2472:9:22;2438;2472;:::i;4358:68:20:-;4408:18;;;92:4594:22;4408:18:20;92:4594:22;;4408:18:20;4301:47;4325:23;;;92:4594:22;4325:23:20;92:4594:22;;4325:23:20;4236:55;4268:23;;;92:4594:22;4268:23:20;92:4594:22;;4268:23:20;4195:31;4215:11;;;92:4594:22;4215:11:20;92:4594:22;;4215:11:20;3846:204;3949:10;92:4594:22;;;;;;;;;;;;;3973:33:20;92:4594:22;;;;;;;;;3973:33:20;92:4594:22;3973:33:20;;:::i;:::-;3846:204;;92:4594:22;;:::i;3850:60:20:-;3875:15;;;:35;3850:60;;;92:4594:22;;;;;;-1:-1:-1;;92:4594:22;;;;;4320:4;92:4594;;4298:26;92:4594;;;;4298:26;92:4594;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;92:4594:22;5301:10:20;:29;5297:56;;4298:26:22;;:::i;:::-;4422:30;;:::i;:::-;4393:59;92:4594;;5686:14:20;92:4594:22;;5686:14:20;92:4594:22;5695:5:20;92:4594:22;;5695:5:20;92:4594:22;;5636:138:20;4393:59:22;4499:23;;4495:57;;92:4594;5301:10:20;;;;;4581:46:22;;;;:::i;:::-;;4641:8;4637:40;;92:4594;4637:40;4658:19;;;92:4594;4658:19;92:4594;;4658:19;4495:57;4531:21;;;92:4594;4531:21;92:4594;;4531:21;92:4594;;;;;;-1:-1:-1;;92:4594:22;;;;;1336:25:20;92:4594:22;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;2113:15:20;-1:-1:-1;;;;;92:4594:22;2099:10:20;:29;2095:56;;2161:26;92:4594:22;;-1:-1:-1;;92:4594:22;2183:4:20;92:4594:22;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;873:42:20;-1:-1:-1;;;;;92:4594:22;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;727:35:20;92:4594:22;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;;;1748:15;-1:-1:-1;;;;;92:4594:22;1734:10;:29;1730:56;;1800:6;92:4594;;;;;1796:34;;1844:25;;1840:56;;1910:26;;1906:58;;1991:44;;;;:::i;:::-;1978:9;:57;1974:90;;2127:43;92:4594;2180:44;92:4594;-1:-1:-1;92:4594:22;2127:43;92:4594;;2127:43;2180:44;92:4594;;2180:44;2234:13;92:4594;;;1800:6;92:4594;;;1800:6;92:4594;;1974:90;2044:20;;;-1:-1:-1;2044:20:22;92:4594;-1:-1:-1;2044:20:22;1906:58;1945:19;;;-1:-1:-1;1945:19:22;92:4594;-1:-1:-1;1945:19:22;1840:56;1878:18;;;-1:-1:-1;1878:18:22;92:4594;-1:-1:-1;1878:18:22;1796:34;1815:15;;;-1:-1:-1;1815:15:22;92:4594;-1:-1:-1;1815:15:22;92:4594;;;;;;-1:-1:-1;;92:4594:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;768:35:20;92:4594:22;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;1444:18:20;92:4594:22;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;1367:34:20;92:4594:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:22;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;-1:-1:-1;;92:4594:22;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;92:4594:22;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;9151:2:25;92:4594:22;;;;;;;:::o;:::-;1984:1:23;92:4594:22;;;1984:1:23;92:4594:22;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;92:4594:22;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;92:4594:22:-;-1:-1:-1;;92:4594:22;;;;;;;;:::o;:::-;-1:-1:-1;;92:4594:22;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2729:743:20:-;;2842:7;92:4594:22;2843:6:20;92:4594:22;;;;;;;;2842:7:20;2838:31;;2897:14;92:4594:22;-1:-1:-1;;;;;92:4594:22;2883:10:20;:28;;;:44;;;2729:743;2879:77;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;92:4594:22;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;2729:743::o;3361:104::-;3444:21;;;3233:1;3444:21;;3233:1;3444:21;3276:75;3330:21;;;3233:1;3330:21;;3233:1;3330:21;3202:64;3244:22;;;3233:1;3244:22;;3233:1;3244:22;3042:85;3108:19;;;;;;;;2966:66;3011:21;;;;;;;;2879:77;2936:20;;;;;;;;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;92:4594:22;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;4155:926:19:-;;4275:1;-1:-1:-1;;;;;;;;;4323:19:19;;4155:926;;4323:19;:::i;:::-;;-1:-1:-1;;;;;;92:4594:22;;;4323:19:19;92:4594:22;4323:26:19;4319:55;;-1:-1:-1;;;;;;;;;4388:19:19;;;;;:::i;:::-;92:4594:22;4388:27:19;92:4594:22;;4452:19:19;4431:49;4441:39;4446:33;:26;4452:19;;4431:49;4452:19;;;;:::i;:::-;92:4594:22;;;;4446:26:19;:33;:::i;:::-;4441:39;:::i;:::-;92:4594:22;;;;4431:49:19;;;:::i;:::-;4384:149;;4275:1;4631:5;4635:1;4631:5;;;;-1:-1:-1;;;;92:4594:22;-1:-1:-1;;;;;;92:4594:22;4821:19:19;;;;92:4594:22;;4821:19:19;;:::i;:::-;92:4594:22;4821:27:19;4817:60;;4887:11;;;:::i;:::-;4943:98;;4155:926;:::o;4817:60::-;4857:20;;;4275:1;4857:20;4635:1;4275;4857:20;4616:13;4662:28;;92:4594:22;4662:28:19;;;;:::i;:::-;92:4594:22;;4616:13:19;;4384:149;4511:11;4521:1;4384:149;;;4319:55;4358:16;;;4275:1;4358:16;;4275:1;4358:16;720:484:23;92:4594:22;;720:484:23;;;;1148:49;720:484;;92:4594:22;;;:::i;:::-;;;;;:::i;:::-;1148:49:23;;:::i;:::-;720:484;:::o;3219:769:19:-;;3335:33;;;;:::i;:::-;3539:13;3551:1;3554:5;3558:1;3554:5;;;;-1:-1:-1;;;;92:4594:22;-1:-1:-1;;;;;;92:4594:22;3740:19:19;;92:4594:22;;3740:19:19;;:::i;:::-;;92:4594:22;3740:27:19;3736:60;;92:4594:22;;;;;;;3858:94:19;92:4594:22;3858:94:19;;;3219:769::o;3539:13::-;3585:28;;92:4594:22;3585:28:19;;;;:::i;:::-;92:4594:22;;3539:13:19;;6516:993:25;6630:1;6690:21;;;;:52;;;6516:993;6686:123;;6516:993;6883:4;92:4594:22;6855:25:25;6861:18;;;;;;:::i;6855:25::-;92:4594:22;6855:32:25;6851:57;;7235:18;;6928;;;6951:4;92:4594:22;6922:25:25;6928:18;;;;7442:4;6928:18;7229:25;6928:18;;:::i;6922:25::-;92:4594:22;6922:33:25;6951:4;;6992:18;6971:48;6981:38;6986:32;:25;6992:18;;6971:48;6992:18;;;;:::i;6971:48::-;6918:154;7235:18;:::i;7229:25::-;92:4594:22;7428:18:25;7424:56;;7442:4;6516:993;:::o;7424:56::-;7455:25;;;6630:1;7455:25;;6630:1;7455:25;6918:154;7050:11;;;:::i;6851:57::-;6896:12;;;6630:1;6896:12;;6630:1;6896:12;6686:123;4521:1:19;;-1:-1:-1;6686:123:25;;6690:52;6721:13;6738:4;92:4594:22;6715:20:25;6721:13;;;;;:::i;6715:20::-;92:4594:22;6715:27:25;6690:52;;7611:2113;;;7892:1;;92:4594:22;7962:16:25;;;;:42;;7611:2113;7958:485;;7611:2113;8508:4;92:4594:22;8485:20:25;8491:13;;;;;;:::i;8485:20::-;92:4594:22;8485:27:25;8481:52;;8559:13;8577:4;92:4594:22;8553:20:25;8559:13;;8543:78;8559:13;;;;:::i;8553:20::-;92:4594:22;8553:28:25;:68;;92:4594:22;8584:33:25;8589:27;:20;8595:13;;;;;;:::i;8584:33::-;92:4594:22;8543:78:25;;:::i;:::-;8667:13;92:4594:22;8662:149:25;8682:11;;;;;;8895:13;;8913:4;92:4594:22;8889:20:25;8895:13;;;;;;:::i;8889:20::-;92:4594:22;8889:28:25;8885:57;;-1:-1:-1;;;;;92:4594:22;8972:95:25;;;92:4594:22;8972:95:25;;;;9080:23;9076:55;;9141:12;;;:::i;:::-;9213:13;9207:20;9213:13;;;;;;:::i;9207:20::-;9237:13;92:4594:22;;;;;9264:13:25;9273:4;9264:13;;9260:374;9273:4;;;9293:14;;;;;9260:374;9647:23;9643:52;;92:4594:22;7611:2113:25;:::o;9643:52::-;9679:16;;;92:4594:22;9679:16:25;;92:4594:22;9679:16:25;9260:374;9328:14;;;;;9273:4;9328:14;9324:310;9273:4;;;9358:9;;;;;92:4594:22;9260:374:25;;9324:310;9412:13;9398:27;9412:13;;;;;:::i;9398:27::-;9444:13;92:4594:22;9439:185:25;9459:7;;;;;;9324:310;;;;;9260:374;;9444:13;9496:10;;;;;;92:4594:22;9496:10:25;92:4594:22;;;;9496:10:25;9495:43;9510:28;9516:21;;9522:14;:10;;;;:::i;:::-;:14;:::i;:::-;9516:21;;;:::i;9495:43::-;;92:4594:22;;9444:13:25;;;;;;9076:55;9112:19;;;92:4594:22;9112:19:25;;92:4594:22;9112:19:25;8885:57;8926:16;;;92:4594:22;8926:16:25;;92:4594:22;8926:16:25;8667:13;8719:22;;;92:4594:22;8719:22:25;;;;:::i;:::-;92:4594:22;;8667:13:25;;;8553:68;92:4594:22;8620:1:25;8553:68;;7958:485;8041:8;;;8035:15;8041:8;;;;;:::i;8035:15::-;8073:1;;8064:10;92:4594:22;;8092:14:25;;;8073:1;;8126:11;8136:1;8088:345;7958:485;;8088:345;8238:4;8228:14;8238:4;;8272:1;8224:209;7958:485;;8224:209;8399:19;;;92:4594:22;8399:19:25;;92:4594:22;8399:19:25;7962:42;7988:8;8000:4;92:4594:22;7982:15:25;7988:8;;;;;:::i;7982:15::-;92:4594:22;7982:22:25;7962:42;;3867:264:22;5078:10:20;92:4594:22;-1:-1:-1;92:4594:22;;;;;;;;5113:20:20;92:4594:22;;;;;;;;-1:-1:-1;92:4594:22;;;;3969:14;92:4594;-1:-1:-1;;;;;92:4594:22;;;;3969:14;92:4594;;5078:10:20;92:4594:22;;4826:21:20;92:4594:22;;;4857:14:20;92:4594:22;;4857:14:20;92:4594:22;;5113:20:20;92:4594:22;;;;;;;;;;4042:32;;;;:::i;:::-;;4088:8;4084:40;;3867:264::o;4479:187:20:-;4558:10;-1:-1:-1;;;;;92:4594:22;;4541:27:20;92:4594:22;;;4541:27:20;92:4594:22;4616:9:20;4598:15;92:4594:22;4598:15:20;;92:4594:22;;;4578:47:20;92:4594:22;4635:24:20;92:4594:22;4479:187:20:o;3533:184::-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;92:4594:22;;3628:27:20;92:4594:22;;3628:27:20;92:4594:22;3653:1:20;3665:14;92:4594:22;3653:1:20;3689:21;92:4594:22;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;92:4594:22;5550:20:20;92:4594:22;;;;;;;;5438:139:20;:::o;2036:1012:19:-;2151:33;;;;:::i;:::-;2386:13;92:4594:22;2401:5:19;2405:1;2401:5;;;;2616:19;2610:26;2616:19;;;;;;:::i;2610:26::-;2646:19;92:4594:22;;;;;2679:13:19;2688:4;2679:13;;2675:338;2688:4;;;2708:20;;;;;2036:1012;:::o;2675:338::-;2759:27;2773:13;;;;;;;;:::i;2759:27::-;2805:13;92:4594:22;2800:203:19;2820:7;;;;;;2675:338;;;;;2036:1012;:::o;2805:13::-;2863:16;;;;;;92:4594:22;2863:16:19;92:4594:22;;;;2863:16:19;2862:55;2883:34;2889:27;;2901:14;:10;;;;:::i;2862:55::-;;92:4594:22;;2805:13:19;;;;;;2386;2432:28;;92:4594:22;2432:28:19;;;;:::i;:::-;92:4594:22;;2386:13:19;;541:1316:24;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;92:4594:22;;;;763:4:24;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;92:4594:22;1103:13:24;92:4594:22;1098:194:24;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;92:4594:22;;;;1164:11:24;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;92:4594:22;;1103:13:24;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:24;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;92:4594:22;1598:13:24;92:4594:22;1593:194:24;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;92:4594:22;;;;1659:11:24;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;92:4594:22;;1598:13:24;;;;638:56;672:22;;;92:4594:22;672:22:24;;92:4594:22;672:22:24;92:4594:22;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1567:2467:23:-;;;;;;;-1:-1:-1;;;;;;;;;1809:13:23;;1567:2467;;1809:13;:::i;:::-;92:4594:22;1809:20:23;1805:50;;-1:-1:-1;;;;;;;;;1870:13:23;;;;;:::i;:::-;92:4594:22;1870:21:23;92:4594:22;;1984:15:23;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;92:4594:22;2184:31:23;;;;;;4015:12;;;;;;;92:4594:22;1567:2467:23;:::o;2177:1828::-;2368:25;2321:33;92:4594:22;;;;;;:::i;:::-;2321:33:23;:::i;:::-;2368:25;;;:::i;:::-;92:4594:22;;;;;;2465:15:23;:30;2461:81;;-1:-1:-1;;;2641:15:23;:7;;;;:::i;:::-;92:4594:22;-1:-1:-1;;;;;;92:4594:22;;;2641:7:23;-1:-1:-1;;;;;;92:4594:22;;;2641:15:23;;92:4594:22;;2676:14:23;;;2689:1;-1:-1:-1;;;2712:15:23;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;92:4594:22;3139:12:23;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:23;3330:10;3339:1;;-1:-1:-1;3339:1:23;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;92:4594:22;3899:12:23;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;92:4594:22;1838:17:23;;92:4594:22;1838:17:23;738:1134:19;854:1;-1:-1:-1;;;;;;;;;908:19:19;;;;;:::i;:::-;92:4594:22;908:26:19;904:55;;-1:-1:-1;;;;;;;;;973:19:19;;;;;:::i;:::-;92:4594:22;973:27:19;92:4594:22;;1037:19:19;1016:49;1026:39;1031:33;:26;1037:19;;1016:49;1037:19;;;;:::i;1016:49::-;969:149;;1221:5;1204:13;:22;:48;;;;969:149;1200:642;;969:149;1852:13;;;738:1134;:::o;1200:642::-;854:1;1380:5;1384:1;1380:5;;;;-1:-1:-1;;;;1602:26:19;:19;;;;;;:::i;:26::-;;1598:55;;-1:-1:-1;;;1671:27:19;:19;;;;;;:::i;:27::-;;92:4594:22;;1728:39:19;1733:33;:26;1739:19;;;1718:49;1739:19;1718:49;1739:19;;:::i;1718:49::-;1200:642;;;;1667:165;1806:11;;;;;:::i;:::-;1667:165;;1365:13;1415:28;;92:4594:22;1415:28:19;;;;:::i;:::-;92:4594:22;;1365:13:19;;1204:48;:13;1247:5;1204:13;1230:22;1204:48;;969:149;1096:11;4521:1;969:149;;;92:4594:22;;;;;;:::i;:::-;2457:1:24;92:4594:22;;;-1:-1:-1;;92:4594:22;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;2143:1860:24:-;92:4594:22;;2257:21:24;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;92:4594:22;;;;2378:4:24;2369:13;;2378:4;;;2447:12;;;;;:::i;:::-;92:4594:22;;;-1:-1:-1;;;;;;92:4594:22;;2473:26:24;;92:4594:22;2473:26:24;:::i;:::-;;2513:18;2457:1;2513:18;:::o;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;92:4594:22;2726:10:24;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;92:4594:22;2757:32:24;;;;;:::i;:::-;;92:4594:22;2711:13:24;;2548:1449;2945:4;-1:-1:-1;2945:4:24;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;92:4594:22;3078:13:24;92:4594:22;3093:15:24;;;;;;3302:17;;;;:::i;:::-;3338:13;92:4594:22;3353:10:24;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;92:4594:22;3384:46:24;;;;;:::i;:::-;;92:4594:22;3338:13:24;;3078;3139:11;3174:1;;92:4594:22;;3138:43:24;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;92:4594:22;;3078:13:24;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;92:4594:22;3795:15:24;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;92:4594:22;3848:10:24;;;:::i;3843:16::-;92:4594:22;3831:28:24;;;;;:::i;:::-;;92:4594:22;3780:13:24;;4233:351:23;4392:1;;4233:351;4403:153;92:4594:22;;4410:20:23;;;;;4456:26;;;;:::i;:::-;92:4594:22;;;;;;;;4446:36:23;92:4594:22;;4403:153:23;;;4410:20;;;4233:351::o;92:4594:22:-;;;;;;;;;7928:1:23;92:4594:22;;;;;;;:::o;7310:1816:23:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;92:4594:22;7885:26:23;92:4594:22;;7885:26:23;;:::i;:::-;7915:14;92:4594:22;;7915:14:23;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;92:4594:22;;;7989:114:23;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;92:4594:22;7686:4:23;92:4594:22;;;;8251:20:23;92:4594:22;7686:4:23;92:4594:22;;;;8275:16:23;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;92:4594:22;;8333:26:23;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;92:4594:22;;7686:4:23;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;92:4594:22;9076:26:23;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;92:4594:22;;8947:18:23;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;92:4594:22;;5315:14:23;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;92:4594:22;;;;5998:13:23;5994:18;;:::i;5988:25::-;92:4594:22;;;6027:13:23;;92:4594:22;;;;6023:122:23;;6244:13;-1:-1:-1;6239:165:23;6259:10;92:4594:22;;;6259:10:23;;;;6441:28;;;;;:::i;:::-;92:4594:22;;;6483:20:23;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;92:4594:22;6758:19:23;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;-1:-1:-1;6519:29:23;:::o;6244:13::-;6302:32;;92:4594:22;6286:48:23;6302:32;;92:4594:22;6302:32:23;;;:::i;6286:48::-;92:4594:22;;;;6244:13:23;;-1:-1:-1;6244:13:23;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:23;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;92:4594:22;;;;;;5712:20:23;92:4594:22;;;;;;5736:16:23;5712:40;5708:210;5736:16;;;92:4594:22;5772:36:23;;-1:-1:-1;5772:36:23;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:23:o;5452:13::-;5509:31;5494:46;5509:31;;92:4594:22;5509:31:23;;;:::i;5494:46::-;92:4594:22;;5452:13:23;;;;4217:1141:24;;92:4594:22;;4321:21:24;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;92:4594:22;;;;4442:4:24;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;92:4594:22;4682:13:24;92:4594:22;4677:194:24;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;92:4594:22;;;;4743:11:24;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;92:4594:22;;4682:13:24;;;;4563:789;4945:4;-1:-1:-1;4945:4:24;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;92:4594:22;5108:13:24;92:4594:22;5103:194:24;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;92:4594:22;;;;5169:11:24;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;92:4594:22;;5108:13:24;;;;9295:1058:23;;92:4594:22;;9395:19:23;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;92:4594:22;;9606:18:23;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;92:4594:22;;;-1:-1:-1;;;92:4594:22;9413:1:23;9643:36;;92:4594:22;9643:36:23;:::i;:::-;;9627:1;9698:13;92:4594:22;;9713:18:23;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;92:4594:22;;;;;;9779:22:23;92:4594:22;;-1:-1:-1;;;;;;92:4594:22;;;9772:30:23;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;92:4594:22;;-1:-1:-1;;;;;;92:4594:22;;;9836:32:23;9820:48;9827:5;;;:::i;9820:48::-;;92:4594:22;9698:13:23;;9713:18;-1:-1:-1;9713:18:23;-1:-1:-1;9295:1058:23:o;9562:761::-;92:4594:22;9993:33:23;10003:22;:18;92:4594:22;;10003:18:23;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;92:4594:22;;10060:18:23;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;92:4594:22;10045:13:23;;9391:39;9416:14::o;10590:651::-;;;;10709:23;92:4594:22;;10709:23:23;;:::i;:::-;10735:14;92:4594:22;;10735:14:23;:::i;:::-;-1:-1:-1;10705:58:23;;-1:-1:-1;10779:13:23;92:4594:22;;10794:18:23;;;;;10862:16;10863:10;;;;:::i;:::-;92:4594:22;;;;10862:16:23;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;92:4594:22;;;;10925:16:23;10921:21;;:::i;10915:33::-;92:4594:22;11067:30:23;11080:17;11086:10;;;;;:::i;11067:30::-;92:4594:22;;11067:30:23;11063:81;;92:4594:22;;10779:13:23;;11063:81;11117:12;;;;-1:-1:-1;11117:12:23;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;92:4594:22;10590:651:23;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:23;:::o","linkReferences":{},"immutableReferences":{"40183":[{"start":342,"length":32},{"start":1310,"length":32},{"start":1502,"length":32},{"start":1680,"length":32}],"40191":[{"start":775,"length":32},{"start":1584,"length":32}],"40193":[{"start":741,"length":32},{"start":909,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond()":"64c9ec6f","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancelAndWithdraw()":"6b892b22","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,bytes,bytes),uint256)":"23a8b41a","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","totalBondsDeposited()":"fe03a460"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ETHTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectETHAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNativeTransfer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTxProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReceiptStatusNotSuccess\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TxFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedTxType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAndWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transactionRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"txProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"path\",\"type\":\"bytes\"}],\"internalType\":\"struct EscrowNative.NativeTransferProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"cancelAndWithdraw()\":{\"notice\":\"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowNative.sol\":\"EscrowNative\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6\",\"dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowNative.sol\":{\"keccak256\":\"0xd82f8fe348a32f78d337dcf5e63020ac0179fd3652b4e23be3f1b26228350573\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://08add7d17c04c7e59ff6fb28e4a563d0133077779c085b4745e33dfd8be864b4\",\"dweb:/ipfs/Qmdrb9BPtfagU1ztLg8ZsQsUWLU7fhrZd7Sba1Gv4RdDCY\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f\",\"dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ETHTransferFailed"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"IncorrectETHAmount"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidNativeTransfer"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTxProof"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"ReceiptStatusNotSuccess"},{"inputs":[],"type":"error","name":"RecipientMismatch"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"TxFailed"},{"inputs":[],"type":"error","name":"UnsupportedTxType"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"cancelAndWithdraw"},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowNative.NativeTransferProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"transactionRlp","type":"bytes"},{"internalType":"bytes","name":"txProofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"receiptProofNodes","type":"bytes"},{"internalType":"bytes","name":"path","type":"bytes"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"cancelAndWithdraw()":{"notice":"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded."}},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowNative.sol":"EscrowNative"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550","urls":["bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6","dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowNative.sol":{"keccak256":"0xd82f8fe348a32f78d337dcf5e63020ac0179fd3652b4e23be3f1b26228350573","urls":["bzz-raw://08add7d17c04c7e59ff6fb28e4a563d0133077779c085b4745e33dfd8be864b4","dweb:/ipfs/Qmdrb9BPtfagU1ztLg8ZsQsUWLU7fhrZd7Sba1Gv4RdDCY"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728","urls":["bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f","dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH"],"license":"UNLICENSED"}},"version":1},"id":22} \ No newline at end of file +{"abi":[{"type":"constructor","inputs":[{"name":"_expectedRecipient","type":"address","internalType":"address"},{"name":"_expectedAmount","type":"uint256","internalType":"uint256"},{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"MAX_BLOCK_LOOKBACK","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bond","inputs":[],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"bondAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"bondedExecutor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"cancelAndWithdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancellationRequest","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"collect","inputs":[{"name":"proof","type":"tuple","internalType":"struct EscrowNative.NativeTransferProof","components":[{"name":"blockHeader","type":"bytes","internalType":"bytes"},{"name":"transactionRlp","type":"bytes","internalType":"bytes"},{"name":"txProofNodes","type":"bytes","internalType":"bytes"},{"name":"receiptRlp","type":"bytes","internalType":"bytes"},{"name":"receiptProofNodes","type":"bytes","internalType":"bytes"},{"name":"path","type":"bytes","internalType":"bytes"}]},{"name":"targetBlockNumber","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"currentPaymentAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"currentRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"executionDeadline","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"expectedRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"fund","inputs":[{"name":"_currentRewardAmount","type":"uint256","internalType":"uint256"},{"name":"_currentPaymentAmount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"funded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"is_bonded","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"originalRewardAmount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"requestCancellation","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"totalBondsDeposited","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"error","name":"AlreadyFunded","inputs":[]},{"type":"error","name":"AmountMismatch","inputs":[]},{"type":"error","name":"BlockHashUnavailable","inputs":[]},{"type":"error","name":"BlockHeaderMismatch","inputs":[]},{"type":"error","name":"BlockNumberMismatch","inputs":[]},{"type":"error","name":"BondActive","inputs":[]},{"type":"error","name":"CancellationRequested","inputs":[]},{"type":"error","name":"ETHTransferFailed","inputs":[]},{"type":"error","name":"ExecutorAlreadyBonded","inputs":[]},{"type":"error","name":"ExpectedRLPList","inputs":[]},{"type":"error","name":"IncorrectETHAmount","inputs":[]},{"type":"error","name":"InsufficientBond","inputs":[]},{"type":"error","name":"InvalidAddress","inputs":[]},{"type":"error","name":"InvalidNativeTransfer","inputs":[]},{"type":"error","name":"InvalidRLP","inputs":[]},{"type":"error","name":"InvalidRLPEncoding","inputs":[]},{"type":"error","name":"InvalidRLPList","inputs":[]},{"type":"error","name":"InvalidReceiptProof","inputs":[]},{"type":"error","name":"InvalidTxProof","inputs":[]},{"type":"error","name":"NoWithdrawableFunds","inputs":[]},{"type":"error","name":"NotFunded","inputs":[]},{"type":"error","name":"OnlyBondedExecutor","inputs":[]},{"type":"error","name":"OnlyDeployer","inputs":[]},{"type":"error","name":"RLPOffsetOutOfBounds","inputs":[]},{"type":"error","name":"ReceiptStatusNotSuccess","inputs":[]},{"type":"error","name":"RecipientMismatch","inputs":[]},{"type":"error","name":"TargetBlockInFuture","inputs":[]},{"type":"error","name":"TargetBlockTooOld","inputs":[]},{"type":"error","name":"TxFailed","inputs":[]},{"type":"error","name":"UnsupportedTxType","inputs":[]},{"type":"error","name":"ZeroPaymentAmount","inputs":[]},{"type":"error","name":"ZeroRewardAmount","inputs":[]}],"bytecode":{"object":"0x60e0601f611e5838819003918201601f19168301916001600160401b038311848410176101205780849260809460405283398101031261011c578051906001600160a01b038216820361011c576020810151606060408301519201519260a05260c0523360805280151580610113575b6100c1575b604051611d23908161013582396080518181816101560152818161051e015281816105de0152610690015260a0518181816103070152610630015260c0518181816102e5015261038d0152f35b8181018082116100ff5734036100f057805f5560025560015561010061ff001960075416176007555f80610074565b63201c04ab60e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b5081151561006f565b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633d2691bc146101265780635a4fd6451461012157806364c9ec6f1461011c5780636b892b221461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107b1565b61078c565b61076f565b61074b565b61067c565b61065f565b61061b565b6105cc565b6105af565b6104f4565b610427565b61040b565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107ce565b9061093e565b61022a61022483806107ce565b90610aae565b602482019161026b61026761023f85876107ce565b61024f60448697939701896107ce565b60a48701979161025f898c6107ce565b949093610bb7565b1590565b610367576102676102b491608461028b61028588806107ce565b90610bde565b9161025f60648201966102ab6102a1898c6107ce565b959094018b6107ce565b9290918b6107ce565b610358576102676102c86102ce92856107ce565b90610c3f565b610349576102e26102679161032c936107ce565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d0f565b61033a57610338610f2a565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f5760045480151590816104ea575b506104b7575b60075460ff8160081c16156104a85760ff16610499576104636108d1565b61048a575f5460011c341061047b5761033834610f90565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b6005545f548181018091116104e5575f556006549081018091116104e5576006556104e0610fb8565b610445565b610886565b905042115f61043f565b3461019f575f36600319011261019f5760ff6001811960075416178060075560081c16156104a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610554610fb8565b61055c610fef565b61057361ff0019600754166007555f6001555f8055565b80156105a0575f80808093335af161058961085c565b501561059157005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff1661073c57811561072d57801561071e576106e181836108c4565b340361070f576106f6826106fb935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f5760206107656108d1565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083b57604052565b610801565b67ffffffffffffffff811161083b57601f01601f191660200190565b3d15610881573d9061087561087083610840565b610815565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b90600182018092116104e557565b90601582018092116104e557565b60010190816001116104e557565b919082018092116104e557565b60045480151590816108e1575090565b905042111590565b6001198101919082116104e557565b5f198101919082116104e557565b919082039182116104e557565b92919261092261087083610840565b938285528282011161019f57815f926020928387013784010152565b9061095261026760075460ff9060081c1690565b6104a8576003546001600160a01b03163314801590610a12575b610a03574383116109f4576101006109848443610906565b116109e557824080156109d65761099c368385610913565b60208151910120036109c7576109b191611001565b036109b857565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a1e6102676108d1565b61096c565b634e487b7160e01b5f52603260045260245ffd5b9015610a405790565b610a23565b90821015610a40570190565b60ff60f6199116019060ff82116104e557565b60ff607f199116019060ff82116104e557565b60ff60bf199116019060ff82116104e557565b60ff60b6199116019060ff82116104e557565b60ff166001019060ff82116104e557565b905f600360fe1b6001600160f81b0319610ad9610acb8587610a37565b356001600160f81b03191690565b1610610ba857601f60fb1b6001600160f81b0319610afa610acb8587610a37565b1610610b9f5780610b34610b2e610b29610b24610b1e610acb610b3a97898b610a45565b60f81c90565b610a51565b610a9d565b60ff1690565b906108c4565b905b5f5b60048110610b8a5750600560fd1b906001600160f81b031990610b6790610acb90859087610a45565b1603610b7b57610b769061089a565b013590565b633954003560e11b5f5260045ffd5b91610b9860019183866110b1565b9201610b3e565b50600190610b3c565b63c0098bd960e01b5f5260045ffd5b610bcd610bd592939495610bdb98973691610913565b923691610913565b90611239565b90565b90610be981836113f3565b905f5b60058110610c2a5750600560fd1b906001600160f81b031990610c1190849086610a45565b351603610b7b576001810181116104e557016001013590565b91610c3860019183866110b1565b9201610bec565b5f9082151580610cf3575b610cea575b60c060ff610c64610b1e610acb868887610a45565b1610610cdb57610b1e610acb82858560f860ff610c8e610b1e610acb839b60019d610cb89c610a45565b1610610cd25780610b34610b2e610b29610b24610b1e610acb610cb297898b610a45565b91610a45565b1603610cc357600190565b63e9dd8a9d60e01b5f5260045ffd5b610cb29061089a565b631bd5dcf760e31b5f5260045ffd5b60019150610c4f565b50608060ff610d08610b1e610acb8786610a37565b1610610c4a565b90916003905f84151580610f0e575b610ec6575b60c060ff610d38610b1e610acb858a8a610a45565b1610610cdb578060f860ff610d57610b1e610acb610d7d968b8b610a45565b1610610ebd5760ff610d76610b29610b24610b1e610acb868c8c610a45565b16906108c4565b915f905b808210610ea6575050609460ff610d9f610b1e610acb868989610a45565b1603610e97576001600160a01b03168282016001013560601c03610e8857610dc6906108a8565b91610dd8610b1e610acb858486610a45565b925f9260ff851694608086105f14610e095750505050505b03610dfa57600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e225750505050505f610df0565b610b2e610e3191939293610a64565b915f935b838510610e46575050505050610df0565b9091929394610e5760019160081b90565b610e7c610b2e610b1e610acb610e758b610e708b61089a565b6108c4565b8789610a45565b17950193929190610e35565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eb560019187876110b1565b930190610d81565b60ff6001610d76565b509050610ed9610b1e610acb8585610a37565b6001919060ff16808303610ef05750600491610d23565b600203610eff57600591610d23565b636fc3daa360e11b5f5260045ffd5b50608060ff610f23610b1e610acb8989610a37565b1610610d1e565b6005545f5481018091116104e55760015481018091116104e5575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f8861085c565b501561059157565b336001600160601b0360a01b600354161760035561012c42018042116104e557600455600555565b610fc06108d1565b610fe0576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116104e55790565b61100b82826113f3565b915f5b6008811061109c5750611028610b1e610acb858486610a45565b925f9260ff851694608086105f1461104257505050505090565b6110539193949550610b2e90610a64565b915f935b83851061106657505050505090565b909192939461107760019160081b90565b611090610b2e610b1e610acb610e758b610e708b61089a565b17950193929190611057565b926110aa60019183856110b1565b930161100e565b91908082101561120c576110cc610b1e610acb848487610a45565b9060ff821660808110156110e757505050610bdb915061089a565b91929160b881101561110f575050610bdb9250610b2e611109610b349261089a565b92610a64565b90929060c08110156111855750610b2e61112b91949394610a8a565b915f935f915b84831061114c57505050610bdb9291610e70610e709261089a565b90919461115b60019160081b90565b61117b610b2e610b1e610acb6111748b610e708b61089a565b8888610a45565b1795019190611131565b90929060f811156111ab5750610bdb9250610b2e6111a5610b349261089a565b92610a77565b9291610b2e6111b991610a51565b915f935f915b8483106111da57505050610bdb9291610e70610e709261089a565b9091946111e960019160081b90565b611202610b2e610b1e610acb6111748b610e708b61089a565b17950191906111bf565b6318d76ae160e11b5f5260045ffd5b805115610a405760200190565b908151811015610a40570160200190565b919390929190600360fe1b6001600160f81b031961125a610acb8689610a37565b16106113e457601f60fb1b6001600160f81b031961127b610acb8689610a37565b16106113da5761129f61129a610b2e610b24610b1e610acb888b610a37565b6108b6565b9492905b945f5b8282106112b857505050505050505f90565b6112d66112cf836112ca36878a610913565b611550565b90936108c4565b96825160208401200361137857600360fe1b6113126113056112f78561121b565b516001600160f81b03191690565b6001600160f81b03191690565b10611378578590846001601f60fb1b6113306113056112f78861121b565b10156113bc575b61134181866116f7565b60118103611383575061135394611882565b94911561137857841561136c5793915b919590936112a6565b50505050505050600190565b505050505050505f90565b9093506002141590506113b05784879261139c9461173c565b94911561137857841561136c579391611363565b50505050505050505f90565b506113d561129a610b2e610b24610b1e6112f78961121b565b611337565b60019492906112a3565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b031961140f610acb8686610a37565b1610610ba857601f60fb1b6001600160f81b0319611430610acb8686610a37565b16106115025780610b34610b2e610b29610b24610b1e610acb611454978a8a610a45565b905b61a5bd461480156114f7575b61146d575b50905090565b5f5b600381106114e25750600360fe1b61148e611305610acb858786610a45565b10610ba857601f60fb1b6114a9611305610acb858786610a45565b106114d257610b2e610b29610b24610b1e610acb866114cb98610b3497610a45565b805f611467565b506114dd915061089a565b6114cb565b916114f060019185846110b1565b920161146f565b5061a5bf4614611462565b50600190611456565b60409061151782610815565b6001815291601f1901366020840137565b9061153561087083610840565b8281528092611546601f1991610840565b0190602036910137565b805182101561120c57611569610b1e6112f78484611228565b9160ff831660808110156115a25750505061158261150b565b9060f81b6001600160f81b0319165f1a61159b8261121b565b5390600190565b919392909160b881101561160c5750610b2e6115bd91610a64565b906115c782611528565b935f5b8381106115dd57505050610bdb906108b6565b806115f96112f76115f3600194610e708861089a565b85611228565b5f1a6116058289611228565b53016115ca565b60c011156116aa57610b2e61162091610a8a565b5f915f5b82811061167c575061163583611528565b945f5b84811061164f5750505090610e70610bdb926108b6565b806116696112f76115f3600194610e7089610e708a61089a565b5f1a611675828a611228565b5301611638565b9260019060081b6116a2610b2e610b1e6112f761169c89610e708961089a565b8b611228565b179301611624565b50916116b68382611997565b926116c084611528565b915f5b8581106116d1575050509190565b806116e46112f76115f3600194876108c4565b5f1a6116f08287611228565b53016116c3565b5f92915b81518110156117225761170e8183611997565b81018091116104e5576001909301926116fb565b5050565b908160011b91808304600214901517156104e557565b8394929161174a8183611550565b93906117696020611760610b1e6112f78561121b565b16151591611ac4565b9788911561180b575061177d9051876108c4565b6117878251611726565b1461179c575b505050505050505f905f905f90565b868660019282516117f9575b5050506117b6575b8061178d565b6117c9926117c3916108c4565b90611550565b50602081519101209060208151910120146117e757808080806117b0565b6117f29151906108c4565b6001915f90565b6118039350611c2f565b86865f6117a8565b61181c939495965061026792611c2f565b6118755761182d926117c3916108c4565b50908151602081145f146118555750602061184d920151925b51906108c4565b916001929190565b801561186957602061184d93012092611846565b505050505f905f905f90565b50505050505f905f905f90565b919092936118908251611726565b85101561193a5750610b1e6112f76118b2926118ac8760011c90565b90611228565b600184166119315760041c600f16915b905f925b60ff8116841061191157506118db9250611550565b50805180156119065761184d91602082036118fc576020915001519161089a565b602001209161089a565b5050505f905f905f90565b9091600161192582610b3460ff9487611997565b940193929190506118c6565b600f16916118c2565b9290509392935f915b6010831061197d576119559250611550565b50602081519101209060208151910120145f1461197457600191905f90565b5f915081908190565b9061198e81610b3460019385611997565b92019190611943565b90815181101561120c576119b1610b1e6112f78385611228565b9160ff831660808110156119c85750505050600190565b60b88110156119e357505050610b2e610b29610bdb92610a64565b60c0811015611a4f575091610b2e6119fa91610a8a565b905f925f915b838310611a175750505090610e70610bdb926108b6565b909193611a2660019160081b90565b611a45610b2e610b1e6112f7611a3f8a610e708961089a565b88611228565b1794019190611a00565b60f81115611a68575050610b2e610b29610bdb92610a77565b91610b2e611a7591610a51565b905f925f915b838310611a925750505090610e70610bdb926108b6565b909193611aa160019160081b90565b611aba610b2e610b1e6112f7611a3f8a610e708961089a565b1794019190611a7b565b90815115611c2d57611adb610b1e6112f78461121b565b6010811615611baa57611afe611af9611af48551611726565b6108f8565b611528565b9060f81b600f60f81b165f1a611b138261121b565b5360015b8351811015611ba55780611b52611b42611b39610b1e6112f76001968a611228565b60041c600f1690565b60f81b6001600160f81b03191690565b611b6b611b61611af484611726565b915f1a9185611228565b53611b92600f611b81610b1e6112f7858a611228565b1660f81b6001600160f81b03191690565b611b9e611b6183611726565b5301611b17565b509150565b50611bc0611af9611bbb8451611726565b6108e9565b60015b8351811015611ba55780611be5611b42611b39610b1e6112f76001968a611228565b611bf9611b61611bf4846108f8565b611726565b53611c0f600f611b81610b1e6112f7858a611228565b611c26611b61611c21611bf4856108f8565b61089a565b5301611bc3565b565b919091611c3d8251846108c4565b611c478251611726565b10611ce6575f5b8251811015611cdd57611c6a611c6482866108c4565b60011690565b611cbf57611c93611b39610b1e6112f7611c8d611c87868a6108c4565b60011c90565b86611228565b60ff611ca8610b2e610b1e6112f78689611228565b911603611cb757600101611c4e565b505050505f90565b600f611cd7610b1e6112f7611c8d611c87868a6108c4565b16611c93565b50505050600190565b5050505f9056fea2646970667358221220f4598e927f93dbeaa4a20f290936343400629961d598e1f51e8a971f4c36efcc64736f6c634300081e0033","sourceMap":"92:4594:23:-:0;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;-1:-1:-1;;;;;92:4594:23;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;92:4594:23;;;;;;;;;;;;;;;;;;1670:38:20;;;1718:32;;1778:10;92:4594:23;1760:28:20;1248:24:23;;;:53;;;-1:-1:-1;1244:372:23;;-1:-1:-1;92:4594:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1670:38:20;92:4594:23;;;;;;;;;;1718:32:20;92:4594:23;;;;;;;;;;;1244:372;92:4594;;;;;;;;1321:9;:57;1317:90;;92:4594;-1:-1:-1;92:4594:23;1477:43;92:4594;;;;;;1592:13;92:4594;;;1592:13;92:4594;1244:372;;;;1317:90;1387:20;;;-1:-1:-1;1387:20:23;;-1:-1:-1;1387:20:23;92:4594;;;;-1:-1:-1;92:4594:23;;;;;-1:-1:-1;92:4594:23;1248:53;1276:25;;;;1248:53;;92:4594;-1:-1:-1;92:4594:23;;;;;;-1:-1:-1;92:4594:23;;;;;-1:-1:-1;92:4594:23","linkReferences":{}},"deployedBytecode":{"object":"0x60806040526004361015610011575f80fd5b5f3560e01c8063046f7da2146101445780631aa7c0ec1461013f57806323a8b41a1461013a5780632feef2ec14610135578063308657d71461013057806333ee5f351461012b5780633d2691bc146101265780635a4fd6451461012157806364c9ec6f1461011c5780636b892b221461011757806380f323a71461011257806381972d001461010d5780638677ab23146101085780638bd03d0a14610103578063a65e2cfd146100fe578063cb766a56146100f9578063d415b3f9146100f4578063f3a504f2146100ef5763fe03a460146100ea575f80fd5b6107b1565b61078c565b61076f565b61074b565b61067c565b61065f565b61061b565b6105cc565b6105af565b6104f4565b610427565b61040b565b6103ef565b6103d2565b6103b0565b610376565b6101cb565b6101a3565b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19169055005b63618bbdd560e01b5f5260045ffd5b5f80fd5b3461019f575f36600319011261019f576003546040516001600160a01b039091168152602090f35b3461019f57604036600319011261019f5760043567ffffffffffffffff811161019f57806004019060c0600319823603011261019f5761021760243561021184806107ce565b9061093e565b61022a61022483806107ce565b90610aae565b602482019161026b61026761023f85876107ce565b61024f60448697939701896107ce565b60a48701979161025f898c6107ce565b949093610bb7565b1590565b610367576102676102b491608461028b61028588806107ce565b90610bde565b9161025f60648201966102ab6102a1898c6107ce565b959094018b6107ce565b9290918b6107ce565b610358576102676102c86102ce92856107ce565b90610c3f565b610349576102e26102679161032c936107ce565b907f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091610d0f565b61033a57610338610f2a565b005b633cff557560e11b5f5260045ffd5b632b96f51360e01b5f5260045ffd5b637b374dd160e01b5f5260045ffd5b63c89e37db60e01b5f5260045ffd5b3461019f575f36600319011261019f5760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b3461019f575f36600319011261019f57602060ff600754166040519015158152f35b3461019f575f36600319011261019f576020600454604051908152f35b3461019f575f36600319011261019f5760206040516101008152f35b3461019f575f36600319011261019f5760205f54604051908152f35b5f36600319011261019f5760045480151590816104ea575b506104b7575b60075460ff8160081c16156104a85760ff16610499576104636108d1565b61048a575f5460011c341061047b5761033834610f90565b63e92c469f60e01b5f5260045ffd5b63129f78e960e11b5f5260045ffd5b632479328960e01b5f5260045ffd5b636af784dd60e11b5f5260045ffd5b6005545f548181018091116104e5575f556006549081018091116104e5576006556104e0610fb8565b610445565b610886565b905042115f61043f565b3461019f575f36600319011261019f5760ff6001811960075416178060075560081c16156104a8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361019057610554610fb8565b61055c610fef565b61057361ff0019600754166007555f6001555f8055565b80156105a0575f80808093335af161058961085c565b501561059157005b63b12d13eb60e01b5f5260045ffd5b6353cd7f7960e01b5f5260045ffd5b3461019f575f36600319011261019f576020600554604051908152f35b3461019f575f36600319011261019f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610190576007805460ff19166001179055005b3461019f575f36600319011261019f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461019f575f36600319011261019f576020600154604051908152f35b604036600319011261019f576004356024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101905760075460081c60ff1661073c57811561072d57801561071e576106e181836108c4565b340361070f576106f6826106fb935f55600255565b600155565b61033861010061ff00196007541617600755565b63201c04ab60e01b5f5260045ffd5b63932ca0a360e01b5f5260045ffd5b63ea1083a760e01b5f5260045ffd5b635adf638760e01b5f5260045ffd5b3461019f575f36600319011261019f5760206107656108d1565b6040519015158152f35b3461019f575f36600319011261019f576020600254604051908152f35b3461019f575f36600319011261019f57602060ff60075460081c166040519015158152f35b3461019f575f36600319011261019f576020600654604051908152f35b903590601e198136030182121561019f570180359067ffffffffffffffff821161019f5760200191813603831361019f57565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f1916820167ffffffffffffffff81118382101761083b57604052565b610801565b67ffffffffffffffff811161083b57601f01601f191660200190565b3d15610881573d9061087561087083610840565b610815565b9182523d5f602084013e565b606090565b634e487b7160e01b5f52601160045260245ffd5b90600182018092116104e557565b90601582018092116104e557565b60010190816001116104e557565b919082018092116104e557565b60045480151590816108e1575090565b905042111590565b6001198101919082116104e557565b5f198101919082116104e557565b919082039182116104e557565b92919261092261087083610840565b938285528282011161019f57815f926020928387013784010152565b9061095261026760075460ff9060081c1690565b6104a8576003546001600160a01b03163314801590610a12575b610a03574383116109f4576101006109848443610906565b116109e557824080156109d65761099c368385610913565b60208151910120036109c7576109b191611001565b036109b857565b63048a12f560e11b5f5260045ffd5b63ff28378760e01b5f5260045ffd5b63bfc9f0d360e01b5f5260045ffd5b63c42a018560e01b5f5260045ffd5b63058968cf60e41b5f5260045ffd5b6337b5f20360e21b5f5260045ffd5b50610a1e6102676108d1565b61096c565b634e487b7160e01b5f52603260045260245ffd5b9015610a405790565b610a23565b90821015610a40570190565b60ff60f6199116019060ff82116104e557565b60ff607f199116019060ff82116104e557565b60ff60bf199116019060ff82116104e557565b60ff60b6199116019060ff82116104e557565b60ff166001019060ff82116104e557565b905f600360fe1b6001600160f81b0319610ad9610acb8587610a37565b356001600160f81b03191690565b1610610ba857601f60fb1b6001600160f81b0319610afa610acb8587610a37565b1610610b9f5780610b34610b2e610b29610b24610b1e610acb610b3a97898b610a45565b60f81c90565b610a51565b610a9d565b60ff1690565b906108c4565b905b5f5b60048110610b8a5750600560fd1b906001600160f81b031990610b6790610acb90859087610a45565b1603610b7b57610b769061089a565b013590565b633954003560e11b5f5260045ffd5b91610b9860019183866110b1565b9201610b3e565b50600190610b3c565b63c0098bd960e01b5f5260045ffd5b610bcd610bd592939495610bdb98973691610913565b923691610913565b90611239565b90565b90610be981836113f3565b905f5b60058110610c2a5750600560fd1b906001600160f81b031990610c1190849086610a45565b351603610b7b576001810181116104e557016001013590565b91610c3860019183866110b1565b9201610bec565b5f9082151580610cf3575b610cea575b60c060ff610c64610b1e610acb868887610a45565b1610610cdb57610b1e610acb82858560f860ff610c8e610b1e610acb839b60019d610cb89c610a45565b1610610cd25780610b34610b2e610b29610b24610b1e610acb610cb297898b610a45565b91610a45565b1603610cc357600190565b63e9dd8a9d60e01b5f5260045ffd5b610cb29061089a565b631bd5dcf760e31b5f5260045ffd5b60019150610c4f565b50608060ff610d08610b1e610acb8786610a37565b1610610c4a565b90916003905f84151580610f0e575b610ec6575b60c060ff610d38610b1e610acb858a8a610a45565b1610610cdb578060f860ff610d57610b1e610acb610d7d968b8b610a45565b1610610ebd5760ff610d76610b29610b24610b1e610acb868c8c610a45565b16906108c4565b915f905b808210610ea6575050609460ff610d9f610b1e610acb868989610a45565b1603610e97576001600160a01b03168282016001013560601c03610e8857610dc6906108a8565b91610dd8610b1e610acb858486610a45565b925f9260ff851694608086105f14610e095750505050505b03610dfa57600190565b6355e97b0d60e01b5f5260045ffd5b90919293946080145f14610e225750505050505f610df0565b610b2e610e3191939293610a64565b915f935b838510610e46575050505050610df0565b9091929394610e5760019160081b90565b610e7c610b2e610b1e610acb610e758b610e708b61089a565b6108c4565b8789610a45565b17950193929190610e35565b63c0ee95bb60e01b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b9092610eb560019187876110b1565b930190610d81565b60ff6001610d76565b509050610ed9610b1e610acb8585610a37565b6001919060ff16808303610ef05750600491610d23565b600203610eff57600591610d23565b636fc3daa360e11b5f5260045ffd5b50608060ff610f23610b1e610acb8989610a37565b1610610d1e565b6005545f5481018091116104e55760015481018091116104e5575f808080936003546001600160601b0360a01b8116600355826005558260045561ff0019600754166007558260015582805560018060a01b03165af1610f8861085c565b501561059157565b336001600160601b0360a01b600354161760035561012c42018042116104e557600455600555565b610fc06108d1565b610fe0576001600160601b0360a01b600354166003555f6005555f600455565b639cbc1de160e01b5f5260045ffd5b60015460025481018091116104e55790565b61100b82826113f3565b915f5b6008811061109c5750611028610b1e610acb858486610a45565b925f9260ff851694608086105f1461104257505050505090565b6110539193949550610b2e90610a64565b915f935b83851061106657505050505090565b909192939461107760019160081b90565b611090610b2e610b1e610acb610e758b610e708b61089a565b17950193929190611057565b926110aa60019183856110b1565b930161100e565b91908082101561120c576110cc610b1e610acb848487610a45565b9060ff821660808110156110e757505050610bdb915061089a565b91929160b881101561110f575050610bdb9250610b2e611109610b349261089a565b92610a64565b90929060c08110156111855750610b2e61112b91949394610a8a565b915f935f915b84831061114c57505050610bdb9291610e70610e709261089a565b90919461115b60019160081b90565b61117b610b2e610b1e610acb6111748b610e708b61089a565b8888610a45565b1795019190611131565b90929060f811156111ab5750610bdb9250610b2e6111a5610b349261089a565b92610a77565b9291610b2e6111b991610a51565b915f935f915b8483106111da57505050610bdb9291610e70610e709261089a565b9091946111e960019160081b90565b611202610b2e610b1e610acb6111748b610e708b61089a565b17950191906111bf565b6318d76ae160e11b5f5260045ffd5b805115610a405760200190565b908151811015610a40570160200190565b919390929190600360fe1b6001600160f81b031961125a610acb8689610a37565b16106113e457601f60fb1b6001600160f81b031961127b610acb8689610a37565b16106113da5761129f61129a610b2e610b24610b1e610acb888b610a37565b6108b6565b9492905b945f5b8282106112b857505050505050505f90565b6112d66112cf836112ca36878a610913565b611550565b90936108c4565b96825160208401200361137857600360fe1b6113126113056112f78561121b565b516001600160f81b03191690565b6001600160f81b03191690565b10611378578590846001601f60fb1b6113306113056112f78861121b565b10156113bc575b61134181866116f7565b60118103611383575061135394611882565b94911561137857841561136c5793915b919590936112a6565b50505050505050600190565b505050505050505f90565b9093506002141590506113b05784879261139c9461173c565b94911561137857841561136c579391611363565b50505050505050505f90565b506113d561129a610b2e610b24610b1e6112f78961121b565b611337565b60019492906112a3565b63ebb47d1d60e01b5f5260045ffd5b5f600360fe1b6001600160f81b031961140f610acb8686610a37565b1610610ba857601f60fb1b6001600160f81b0319611430610acb8686610a37565b16106115025780610b34610b2e610b29610b24610b1e610acb611454978a8a610a45565b905b61a5bd461480156114f7575b61146d575b50905090565b5f5b600381106114e25750600360fe1b61148e611305610acb858786610a45565b10610ba857601f60fb1b6114a9611305610acb858786610a45565b106114d257610b2e610b29610b24610b1e610acb866114cb98610b3497610a45565b805f611467565b506114dd915061089a565b6114cb565b916114f060019185846110b1565b920161146f565b5061a5bf4614611462565b50600190611456565b60409061151782610815565b6001815291601f1901366020840137565b9061153561087083610840565b8281528092611546601f1991610840565b0190602036910137565b805182101561120c57611569610b1e6112f78484611228565b9160ff831660808110156115a25750505061158261150b565b9060f81b6001600160f81b0319165f1a61159b8261121b565b5390600190565b919392909160b881101561160c5750610b2e6115bd91610a64565b906115c782611528565b935f5b8381106115dd57505050610bdb906108b6565b806115f96112f76115f3600194610e708861089a565b85611228565b5f1a6116058289611228565b53016115ca565b60c011156116aa57610b2e61162091610a8a565b5f915f5b82811061167c575061163583611528565b945f5b84811061164f5750505090610e70610bdb926108b6565b806116696112f76115f3600194610e7089610e708a61089a565b5f1a611675828a611228565b5301611638565b9260019060081b6116a2610b2e610b1e6112f761169c89610e708961089a565b8b611228565b179301611624565b50916116b68382611997565b926116c084611528565b915f5b8581106116d1575050509190565b806116e46112f76115f3600194876108c4565b5f1a6116f08287611228565b53016116c3565b5f92915b81518110156117225761170e8183611997565b81018091116104e5576001909301926116fb565b5050565b908160011b91808304600214901517156104e557565b8394929161174a8183611550565b93906117696020611760610b1e6112f78561121b565b16151591611ac4565b9788911561180b575061177d9051876108c4565b6117878251611726565b1461179c575b505050505050505f905f905f90565b868660019282516117f9575b5050506117b6575b8061178d565b6117c9926117c3916108c4565b90611550565b50602081519101209060208151910120146117e757808080806117b0565b6117f29151906108c4565b6001915f90565b6118039350611c2f565b86865f6117a8565b61181c939495965061026792611c2f565b6118755761182d926117c3916108c4565b50908151602081145f146118555750602061184d920151925b51906108c4565b916001929190565b801561186957602061184d93012092611846565b505050505f905f905f90565b50505050505f905f905f90565b919092936118908251611726565b85101561193a5750610b1e6112f76118b2926118ac8760011c90565b90611228565b600184166119315760041c600f16915b905f925b60ff8116841061191157506118db9250611550565b50805180156119065761184d91602082036118fc576020915001519161089a565b602001209161089a565b5050505f905f905f90565b9091600161192582610b3460ff9487611997565b940193929190506118c6565b600f16916118c2565b9290509392935f915b6010831061197d576119559250611550565b50602081519101209060208151910120145f1461197457600191905f90565b5f915081908190565b9061198e81610b3460019385611997565b92019190611943565b90815181101561120c576119b1610b1e6112f78385611228565b9160ff831660808110156119c85750505050600190565b60b88110156119e357505050610b2e610b29610bdb92610a64565b60c0811015611a4f575091610b2e6119fa91610a8a565b905f925f915b838310611a175750505090610e70610bdb926108b6565b909193611a2660019160081b90565b611a45610b2e610b1e6112f7611a3f8a610e708961089a565b88611228565b1794019190611a00565b60f81115611a68575050610b2e610b29610bdb92610a77565b91610b2e611a7591610a51565b905f925f915b838310611a925750505090610e70610bdb926108b6565b909193611aa160019160081b90565b611aba610b2e610b1e6112f7611a3f8a610e708961089a565b1794019190611a7b565b90815115611c2d57611adb610b1e6112f78461121b565b6010811615611baa57611afe611af9611af48551611726565b6108f8565b611528565b9060f81b600f60f81b165f1a611b138261121b565b5360015b8351811015611ba55780611b52611b42611b39610b1e6112f76001968a611228565b60041c600f1690565b60f81b6001600160f81b03191690565b611b6b611b61611af484611726565b915f1a9185611228565b53611b92600f611b81610b1e6112f7858a611228565b1660f81b6001600160f81b03191690565b611b9e611b6183611726565b5301611b17565b509150565b50611bc0611af9611bbb8451611726565b6108e9565b60015b8351811015611ba55780611be5611b42611b39610b1e6112f76001968a611228565b611bf9611b61611bf4846108f8565b611726565b53611c0f600f611b81610b1e6112f7858a611228565b611c26611b61611c21611bf4856108f8565b61089a565b5301611bc3565b565b919091611c3d8251846108c4565b611c478251611726565b10611ce6575f5b8251811015611cdd57611c6a611c6482866108c4565b60011690565b611cbf57611c93611b39610b1e6112f7611c8d611c87868a6108c4565b60011c90565b86611228565b60ff611ca8610b2e610b1e6112f78689611228565b911603611cb757600101611c4e565b505050505f90565b600f611cd7610b1e6112f7611c8d611c87868a6108c4565b16611c93565b50505050600190565b5050505f9056fea2646970667358221220f4598e927f93dbeaa4a20f290936343400629961d598e1f51e8a971f4c36efcc64736f6c634300081e0033","sourceMap":"92:4594:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;-1:-1:-1;;92:4594:23;;;;2363:15:20;-1:-1:-1;;;;;92:4594:23;2349:10:20;:29;2345:56;;2411:27;92:4594:23;;-1:-1:-1;;92:4594:23;;;;2345:56:20;2387:14;;;92:4594:23;2387:14:20;92:4594:23;;2387:14:20;92:4594:23;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;1263:29:20;92:4594:23;;;-1:-1:-1;;;;;92:4594:23;;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;;;;;;;;;;;;;;;;;;;;2799:17;92:4594;;2780:17;;;;:::i;:::-;2799;;:::i;:::-;2916:60;2958:17;;;;:::i;:::-;2916:60;;:::i;:::-;92:4594;3022:20;;;2990:103;2991:102;3022:20;;;;:::i;:::-;3044:18;;;;;;;;;:::i;:::-;3064:10;;;;;;;;;:::i;:::-;2991:102;;;;:::i;:::-;2990:103;;92:4594;2990:103;2986:157;;3300:99;3299:100;3267:17;3349:23;3229:56;3267:17;;;;:::i;:::-;3229:56;;:::i;:::-;3331:16;3374:10;3331:16;;;;3349:23;3331:16;;;;:::i;:::-;3349:23;;;;;;:::i;:::-;3374:10;;;;;:::i;3299:100::-;3295:159;;3525:56;3564:16;3524:57;3564:16;;;:::i;:::-;3525:56;;:::i;3524:57::-;3520:80;;3722:20;3682:96;3722:20;3681:97;3722:20;;:::i;:::-;3763:14;;3744:17;;3682:96;;:::i;3681:97::-;3677:158;;;;:::i;:::-;92:4594;3677:158;3801:23;;;-1:-1:-1;3801:23:23;92:4594;-1:-1:-1;3801:23:23;3520:80;3590:10;;;-1:-1:-1;3590:10:23;92:4594;-1:-1:-1;3590:10:23;3295:159;3422:21;;;-1:-1:-1;3422:21:23;92:4594;-1:-1:-1;3422:21:23;2986:157;3116:16;;;-1:-1:-1;3116:16:23;92:4594;-1:-1:-1;3116:16:23;92:4594;;;;;;-1:-1:-1;;92:4594:23;;;;;;;963:39:20;92:4594:23;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;1407:31:20;92:4594:23;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;;1085:3:20;92:4594:23;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;3850:21:20;;;:60;;;;92:4594:23;3846:204:20;;;92:4594:23;4200:6:20;92:4594:23;;;;;;4199:7:20;4195:31;;92:4594:23;;4236:55:20;;4305:11;;:::i;:::-;4301:47;;92:4594:23;;;;2438:9;4362:37:20;4358:68;;2472:9:23;2438;2472;:::i;4358:68:20:-;4408:18;;;92:4594:23;4408:18:20;92:4594:23;;4408:18:20;4301:47;4325:23;;;92:4594:23;4325:23:20;92:4594:23;;4325:23:20;4236:55;4268:23;;;92:4594:23;4268:23:20;92:4594:23;;4268:23:20;4195:31;4215:11;;;92:4594:23;4215:11:20;92:4594:23;;4215:11:20;3846:204;3949:10;92:4594:23;;;;;;;;;;;;;3973:33:20;92:4594:23;;;;;;;;;3973:33:20;92:4594:23;3973:33:20;;:::i;:::-;3846:204;;92:4594:23;;:::i;3850:60:20:-;3875:15;;;:35;3850:60;;;92:4594:23;;;;;;-1:-1:-1;;92:4594:23;;;;;4320:4;92:4594;;4298:26;92:4594;;;;4298:26;92:4594;;;;5260:7:20;5256:31;;5315:15;-1:-1:-1;;;;;92:4594:23;5301:10:20;:29;5297:56;;4298:26:23;;:::i;:::-;4422:30;;:::i;:::-;4393:59;92:4594;;5686:14:20;92:4594:23;;5686:14:20;92:4594:23;5695:5:20;92:4594:23;;5695:5:20;92:4594:23;;5636:138:20;4393:59:23;4499:23;;4495:57;;92:4594;5301:10:20;;;;;4581:46:23;;;;:::i;:::-;;4641:8;4637:40;;92:4594;4637:40;4658:19;;;92:4594;4658:19;92:4594;;4658:19;4495:57;4531:21;;;92:4594;4531:21;92:4594;;4531:21;92:4594;;;;;;-1:-1:-1;;92:4594:23;;;;;1336:25:20;92:4594:23;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;2113:15:20;-1:-1:-1;;;;;92:4594:23;2099:10:20;:29;2095:56;;2161:26;92:4594:23;;-1:-1:-1;;92:4594:23;2183:4:20;92:4594:23;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;873:42:20;-1:-1:-1;;;;;92:4594:23;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;727:35:20;92:4594:23;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;;;1748:15;-1:-1:-1;;;;;92:4594:23;1734:10;:29;1730:56;;1800:6;92:4594;;;;;1796:34;;1844:25;;1840:56;;1910:26;;1906:58;;1991:44;;;;:::i;:::-;1978:9;:57;1974:90;;2127:43;92:4594;2180:44;92:4594;-1:-1:-1;92:4594:23;2127:43;92:4594;;2127:43;2180:44;92:4594;;2180:44;2234:13;92:4594;;;1800:6;92:4594;;;1800:6;92:4594;;1974:90;2044:20;;;-1:-1:-1;2044:20:23;92:4594;-1:-1:-1;2044:20:23;1906:58;1945:19;;;-1:-1:-1;1945:19:23;92:4594;-1:-1:-1;1945:19:23;1840:56;1878:18;;;-1:-1:-1;1878:18:23;92:4594;-1:-1:-1;1878:18:23;1796:34;1815:15;;;-1:-1:-1;1815:15:23;92:4594;-1:-1:-1;1815:15:23;92:4594;;;;;;-1:-1:-1;;92:4594:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;768:35:20;92:4594:23;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;1444:18:20;92:4594:23;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;1367:34:20;92:4594:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;92:4594:23;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;-1:-1:-1;;92:4594:23;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;-1:-1:-1;92:4594:23;;;;:::o;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;9151:2:27;92:4594:23;;;;;;;:::o;:::-;1984:1:25;92:4594:23;;;1984:1:25;92:4594:23;;;:::o;:::-;;;;;;;;;;:::o;2519:133:20:-;2584:17;92:4594:23;2584:21:20;;;:61;;;;2577:68;2519:133;:::o;2584:61::-;2609:15;;;:36;;2519:133;:::o;92:4594:23:-;-1:-1:-1;;92:4594:23;;;;;;;;:::o;:::-;-1:-1:-1;;92:4594:23;;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2729:743:20:-;;2842:7;92:4594:23;2843:6:20;92:4594:23;;;;;;;;2842:7:20;2838:31;;2897:14;92:4594:23;-1:-1:-1;;;;;92:4594:23;2883:10:20;:28;;;:44;;;2729:743;2879:77;;2990:12;2970:32;;2966:66;;1085:3;3046:32;2990:12;;3046:32;:::i;:::-;:53;3042:85;;3164:28;;3206:29;;3202:64;;92:4594:23;;;;;:::i;:::-;;;;;;3280:22:20;:41;3276:75;;3365:49;;;:::i;:::-;:70;3361:104;;2729:743::o;3361:104::-;3444:21;;;3233:1;3444:21;;3233:1;3444:21;3276:75;3330:21;;;3233:1;3330:21;;3233:1;3330:21;3202:64;3244:22;;;3233:1;3244:22;;3233:1;3244:22;3042:85;3108:19;;;;;;;;2966:66;3011:21;;;;;;;;2879:77;2936:20;;;;;;;;2883:44;2916:11;2915:12;2916:11;;:::i;2915:12::-;2883:44;;92:4594:23;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::o;4155:926:19:-;;4275:1;-1:-1:-1;;;;;;;;;4323:19:19;;4155:926;;4323:19;:::i;:::-;;-1:-1:-1;;;;;;92:4594:23;;;4323:19:19;92:4594:23;4323:26:19;4319:55;;-1:-1:-1;;;;;;;;;4388:19:19;;;;;:::i;:::-;92:4594:23;4388:27:19;92:4594:23;;4452:19:19;4431:49;4441:39;4446:33;:26;4452:19;;4431:49;4452:19;;;;:::i;:::-;92:4594:23;;;;4446:26:19;:33;:::i;:::-;4441:39;:::i;:::-;92:4594:23;;;;4431:49:19;;;:::i;:::-;4384:149;;4275:1;4631:5;4635:1;4631:5;;;;-1:-1:-1;;;;92:4594:23;-1:-1:-1;;;;;;92:4594:23;4821:19:19;;;;92:4594:23;;4821:19:19;;:::i;:::-;92:4594:23;4821:27:19;4817:60;;4887:11;;;:::i;:::-;4943:98;;4155:926;:::o;4817:60::-;4857:20;;;4275:1;4857:20;4635:1;4275;4857:20;4616:13;4662:28;;92:4594:23;4662:28:19;;;;:::i;:::-;92:4594:23;;4616:13:19;;4384:149;4511:11;4521:1;4384:149;;;4319:55;4358:16;;;4275:1;4358:16;;4275:1;4358:16;720:484:25;92:4594:23;;720:484:25;;;;1148:49;720:484;;92:4594:23;;;:::i;:::-;;;;;:::i;:::-;1148:49:25;;:::i;:::-;720:484;:::o;3219:769:19:-;;3335:33;;;;:::i;:::-;3539:13;3551:1;3554:5;3558:1;3554:5;;;;-1:-1:-1;;;;92:4594:23;-1:-1:-1;;;;;;92:4594:23;3740:19:19;;92:4594:23;;3740:19:19;;:::i;:::-;;92:4594:23;3740:27:19;3736:60;;92:4594:23;;;;;;;3858:94:19;92:4594:23;3858:94:19;;;3219:769::o;3539:13::-;3585:28;;92:4594:23;3585:28:19;;;;:::i;:::-;92:4594:23;;3539:13:19;;6516:993:27;6630:1;6690:21;;;;:52;;;6516:993;6686:123;;6516:993;6883:4;92:4594:23;6855:25:27;6861:18;;;;;;:::i;6855:25::-;92:4594:23;6855:32:27;6851:57;;7235:18;;6928;;;6951:4;92:4594:23;6922:25:27;6928:18;;;;7442:4;6928:18;7229:25;6928:18;;:::i;6922:25::-;92:4594:23;6922:33:27;6951:4;;6992:18;6971:48;6981:38;6986:32;:25;6992:18;;6971:48;6992:18;;;;:::i;6971:48::-;6918:154;7235:18;:::i;7229:25::-;92:4594:23;7428:18:27;7424:56;;7442:4;6516:993;:::o;7424:56::-;7455:25;;;6630:1;7455:25;;6630:1;7455:25;6918:154;7050:11;;;:::i;6851:57::-;6896:12;;;6630:1;6896:12;;6630:1;6896:12;6686:123;4521:1:19;;-1:-1:-1;6686:123:27;;6690:52;6721:13;6738:4;92:4594:23;6715:20:27;6721:13;;;;;:::i;6715:20::-;92:4594:23;6715:27:27;6690:52;;7611:2113;;;7892:1;;92:4594:23;7962:16:27;;;;:42;;7611:2113;7958:485;;7611:2113;8508:4;92:4594:23;8485:20:27;8491:13;;;;;;:::i;8485:20::-;92:4594:23;8485:27:27;8481:52;;8559:13;8577:4;92:4594:23;8553:20:27;8559:13;;8543:78;8559:13;;;;:::i;8553:20::-;92:4594:23;8553:28:27;:68;;92:4594:23;8584:33:27;8589:27;:20;8595:13;;;;;;:::i;8584:33::-;92:4594:23;8543:78:27;;:::i;:::-;8667:13;92:4594:23;8662:149:27;8682:11;;;;;;8895:13;;8913:4;92:4594:23;8889:20:27;8895:13;;;;;;:::i;8889:20::-;92:4594:23;8889:28:27;8885:57;;-1:-1:-1;;;;;92:4594:23;8972:95:27;;;92:4594:23;8972:95:27;;;;9080:23;9076:55;;9141:12;;;:::i;:::-;9213:13;9207:20;9213:13;;;;;;:::i;9207:20::-;9237:13;92:4594:23;;;;;9264:13:27;9273:4;9264:13;;9260:374;9273:4;;;9293:14;;;;;9260:374;9647:23;9643:52;;92:4594:23;7611:2113:27;:::o;9643:52::-;9679:16;;;92:4594:23;9679:16:27;;92:4594:23;9679:16:27;9260:374;9328:14;;;;;9273:4;9328:14;9324:310;9273:4;;;9358:9;;;;;92:4594:23;9260:374:27;;9324:310;9412:13;9398:27;9412:13;;;;;:::i;9398:27::-;9444:13;92:4594:23;9439:185:27;9459:7;;;;;;9324:310;;;;;9260:374;;9444:13;9496:10;;;;;;92:4594:23;9496:10:27;92:4594:23;;;;9496:10:27;9495:43;9510:28;9516:21;;9522:14;:10;;;;:::i;:::-;:14;:::i;:::-;9516:21;;;:::i;9495:43::-;;92:4594:23;;9444:13:27;;;;;;9076:55;9112:19;;;92:4594:23;9112:19:27;;92:4594:23;9112:19:27;8885:57;8926:16;;;92:4594:23;8926:16:27;;92:4594:23;8926:16:27;8667:13;8719:22;;;92:4594:23;8719:22:27;;;;:::i;:::-;92:4594:23;;8667:13:27;;;8553:68;92:4594:23;8620:1:27;8553:68;;7958:485;8041:8;;;8035:15;8041:8;;;;;:::i;8035:15::-;8073:1;;8064:10;92:4594:23;;8092:14:27;;;8073:1;;8126:11;8136:1;8088:345;7958:485;;8088:345;8238:4;8228:14;8238:4;;8272:1;8224:209;7958:485;;8224:209;8399:19;;;92:4594:23;8399:19:27;;92:4594:23;8399:19:27;7962:42;7988:8;8000:4;92:4594:23;7982:15:27;7988:8;;;;;:::i;7982:15::-;92:4594:23;7982:22:27;7962:42;;3867:264:23;5078:10:20;92:4594:23;-1:-1:-1;92:4594:23;;;;;;;;5113:20:20;92:4594:23;;;;;;;;-1:-1:-1;92:4594:23;;;;3969:14;92:4594;-1:-1:-1;;;;;92:4594:23;;;;3969:14;92:4594;;5078:10:20;92:4594:23;;4826:21:20;92:4594:23;;;4857:14:20;92:4594:23;;4857:14:20;92:4594:23;;5113:20:20;92:4594:23;;;;;;;;;;4042:32;;;;:::i;:::-;;4088:8;4084:40;;3867:264::o;4479:187:20:-;4558:10;-1:-1:-1;;;;;92:4594:23;;4541:27:20;92:4594:23;;;4541:27:20;92:4594:23;4616:9:20;4598:15;92:4594:23;4598:15:20;;92:4594:23;;;4578:47:20;92:4594:23;4635:24:20;92:4594:23;4479:187:20:o;3533:184::-;3585:11;;:::i;:::-;3581:36;;-1:-1:-1;;;;;92:4594:23;;3628:27:20;92:4594:23;;3628:27:20;92:4594:23;3653:1:20;3665:14;92:4594:23;3653:1:20;3689:21;92:4594:23;3533:184:20:o;3581:36::-;3605:12;;;;;;;;5438:139;5527:20;92:4594:23;5550:20:20;92:4594:23;;;;;;;;5438:139:20;:::o;2036:1012:19:-;2151:33;;;;:::i;:::-;2386:13;92:4594:23;2401:5:19;2405:1;2401:5;;;;2616:19;2610:26;2616:19;;;;;;:::i;2610:26::-;2646:19;92:4594:23;;;;;2679:13:19;2688:4;2679:13;;2675:338;2688:4;;;2708:20;;;;;2036:1012;:::o;2675:338::-;2759:27;2773:13;;;;;;;;:::i;2759:27::-;2805:13;92:4594:23;2800:203:19;2820:7;;;;;;2675:338;;;;;2036:1012;:::o;2805:13::-;2863:16;;;;;;92:4594:23;2863:16:19;92:4594:23;;;;2863:16:19;2862:55;2883:34;2889:27;;2901:14;:10;;;;:::i;2862:55::-;;92:4594:23;;2805:13:19;;;;;;2386;2432:28;;92:4594:23;2432:28:19;;;;:::i;:::-;92:4594:23;;2386:13:19;;541:1316:26;;;642:21;;;;638:56;;720:19;726:12;;;;;;:::i;720:19::-;92:4594:23;;;;763:4:26;754:13;;763:4;;;817:10;;;;;;;:::i;750:1101::-;848:13;;;857:4;848:13;;857:4;;;912:10;;:28;:10;;926:13;912:10;:28;:10;;:::i;:::-;926:13;;:::i;844:1007::-;961:13;;;970:4;961:13;;970:4;;;1039:13;;1017:35;1039:13;;;;;:::i;1017:35::-;1066:18;92:4594:23;1103:13:26;92:4594:23;1098:194:26;1118:15;;;;;;1312:10;;;:33;:10;;;:24;:10;;:::i;1103:13::-;1164:11;;;;1199:1;1164:11;92:4594:23;;;;1164:11:26;1163:43;1179:27;1185:20;;1190:14;:10;;;;:::i;:14::-;1185:20;;;:::i;1163:43::-;;92:4594:23;;1103:13:26;;;;957:894;1366:13;;;1375:4;-1:-1:-1;1375:4:26;;;1428:10;:28;:10;;1442:13;1428:10;:28;:10;;:::i;:::-;1442:13;;:::i;1362:489::-;1534:13;;;1512:35;1534:13;;:::i;1512:35::-;1561:18;92:4594:23;1598:13:26;92:4594:23;1593:194:26;1613:15;;;;;;1807:10;;;:33;:10;;;:24;:10;;:::i;1598:13::-;1659:11;;;;1694:1;1659:11;92:4594:23;;;;1659:11:26;1658:43;1674:27;1680:20;;1685:14;:10;;;;:::i;1658:43::-;;92:4594:23;;1598:13:26;;;;638:56;672:22;;;92:4594:23;672:22:26;;92:4594:23;672:22:26;92:4594:23;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;1567:2467:25:-;;;;;;;-1:-1:-1;;;;;;;;;1809:13:25;;1567:2467;;1809:13;:::i;:::-;92:4594:23;1809:20:25;1805:50;;-1:-1:-1;;;;;;;;;1870:13:25;;;;;:::i;:::-;92:4594:23;1870:21:25;92:4594:23;;1984:15:25;1907:49;1929:27;:20;1935:13;;;;;:::i;1907:49::-;1984:15;:::i;:::-;1866:190;;;;2102:33;92:4594:23;2184:31:25;;;;;;4015:12;;;;;;;92:4594:23;1567:2467:25;:::o;2177:1828::-;2368:25;2321:33;92:4594:23;;;;;;:::i;:::-;2321:33:25;:::i;:::-;2368:25;;;:::i;:::-;92:4594:23;;;;;;2465:15:25;:30;2461:81;;-1:-1:-1;;;2641:15:25;:7;;;;:::i;:::-;92:4594:23;-1:-1:-1;;;;;;92:4594:23;;;2641:7:25;-1:-1:-1;;;;;;92:4594:23;;;2641:15:25;;92:4594:23;;2676:14:25;;;2689:1;-1:-1:-1;;;2712:15:25;:7;;;;:::i;:15::-;;;2708:97;;2637:1358;2839:32;;;;:::i;:::-;2903:2;2894:11;;2903:2;;3044:58;;;;:::i;:::-;3129:8;;;3125:26;;3177:21;;3173:38;;3280:21;2890:1040;;2177:1828;;;;;;3173:38;3200:11;;;;;;;2689:1;3200:11;:::o;3125:26::-;3139:12;;;;;;;92:4594:23;3139:12:25;:::o;2890:1040::-;3330:10;;-1:-1:-1;3339:1:25;3330:10;3339:1;;-1:-1:-1;3339:1:25;;3490:67;;;;;;:::i;:::-;3584:8;;;3580:75;;3680:21;;3676:87;;3831:21;3326:604;2890:1040;;3326:604;3899:12;;;;;;;;92:4594:23;3899:12:25;:::o;2708:97::-;2771:7;2751:35;;2765:21;:14;2771:7;;;;:::i;2751:35::-;2708:97;;1866:190;2044:1;1866:190;;;;;1805:50;1838:17;;;92:4594:23;1838:17:25;;92:4594:23;1838:17:25;738:1134:19;854:1;-1:-1:-1;;;;;;;;;908:19:19;;;;;:::i;:::-;92:4594:23;908:26:19;904:55;;-1:-1:-1;;;;;;;;;973:19:19;;;;;:::i;:::-;92:4594:23;973:27:19;92:4594:23;;1037:19:19;1016:49;1026:39;1031:33;:26;1037:19;;1016:49;1037:19;;;;:::i;1016:49::-;969:149;;1221:5;1204:13;:22;:48;;;;969:149;1200:642;;969:149;1852:13;;;738:1134;:::o;1200:642::-;854:1;1380:5;1384:1;1380:5;;;;-1:-1:-1;;;;1602:26:19;:19;;;;;;:::i;:26::-;;1598:55;;-1:-1:-1;;;1671:27:19;:19;;;;;;:::i;:27::-;;92:4594:23;;1728:39:19;1733:33;:26;1739:19;;;1718:49;1739:19;1718:49;1739:19;;:::i;1718:49::-;1200:642;;;;1667:165;1806:11;;;;;:::i;:::-;1667:165;;1365:13;1415:28;;92:4594:23;1415:28:19;;;;:::i;:::-;92:4594:23;;1365:13:19;;1204:48;:13;1247:5;1204:13;1230:22;1204:48;;969:149;1096:11;4521:1;969:149;;;92:4594:23;;;;;;:::i;:::-;2457:1:26;92:4594:23;;;-1:-1:-1;;92:4594:23;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;2143:1860:26:-;92:4594:23;;2257:21:26;;;2253:56;;2335:19;2341:12;;;;;:::i;2335:19::-;92:4594:23;;;;2378:4:26;2369:13;;2378:4;;;2447:12;;;;;:::i;:::-;92:4594:23;;;-1:-1:-1;;;;;;92:4594:23;;2473:26:26;;92:4594:23;2473:26:26;:::i;:::-;;2513:18;2457:1;2513:18;:::o;2365:1632::-;2552:13;;;;;2561:4;2552:13;;2561:4;;;2626:13;;2609:30;2626:13;;:::i;2609:30::-;2675:17;;;;:::i;:::-;2711:13;92:4594:23;2726:10:26;;;;;;2904;;;;;;:::i;2711:13::-;2774:10;2769:20;;2774:14;2783:1;2774:10;;;;:::i;:14::-;2769:20;;:::i;:::-;92:4594:23;2757:32:26;;;;;:::i;:::-;;92:4594:23;2711:13:26;;2548:1449;2945:4;-1:-1:-1;2945:4:26;;;3014:13;2992:35;3014:13;;:::i;2992:35::-;92:4594:23;3078:13:26;92:4594:23;3093:15:26;;;;;;3302:17;;;;:::i;:::-;3338:13;92:4594:23;3353:10:26;;;;;;3545:15;;;;;:24;:15;;:::i;3338:13::-;3401:10;3396:34;;3401:28;3174:1;3401:10;:24;:10;;;;:::i;3396:34::-;92:4594:23;3384:46:26;;;;;:::i;:::-;;92:4594:23;3338:13:26;;3078;3139:11;3174:1;;92:4594:23;;3138:43:26;3154:27;3160:20;;3165:14;:10;;;;:::i;:14::-;3160:20;;:::i;3138:43::-;;92:4594:23;;3078:13:26;;2932:1065;3676:27;;;;;;:::i;:::-;3739:22;;;;:::i;:::-;3780:13;92:4594:23;3795:15:26;;;;;;3958:28;;;;;:::o;3780:13::-;3848:10;3843:16;;3848:10;92:4594:23;3848:10:26;;;:::i;3843:16::-;92:4594:23;3831:28:26;;;;;:::i;:::-;;92:4594:23;3780:13:26;;4233:351:25;4392:1;;4233:351;4403:153;92:4594:23;;4410:20:25;;;;;4456:26;;;;:::i;:::-;92:4594:23;;;;;;;;4446:36:25;92:4594:23;;4403:153:25;;;4410:20;;;4233:351::o;92:4594:23:-;;;;;;;;;7928:1:25;92:4594:23;;;;;;;:::o;7310:1816:25:-;;;;;7616:26;;;;:::i;:::-;7673:9;;7740:26;7686:4;7667:16;7673:9;;;;:::i;7667:16::-;:23;7666:30;;7740:26;;:::i;:::-;7777:1343;;;;;;92:4594:23;7885:26:25;92:4594:23;;7885:26:25;;:::i;:::-;7915:14;92:4594:23;;7915:14:25;:::i;:::-;7885:44;7881:546;;7777:1343;8441:29;;;;;;;7680:1;8441:29;7680:1;8441:29;7680:1;8441:29;:::o;7881:546::-;7949:22;;7967:4;92:4594:23;;;7989:114:25;;7881:546;8121:292;;;;;7881:546;;;;8121:292;8187:38;8202:22;;;;:::i;:::-;8187:38;;:::i;:::-;92:4594:23;7686:4:25;92:4594:23;;;;8251:20:25;92:4594:23;7686:4:25;92:4594:23;;;;8275:16:25;8251:40;8247:148;;8121:292;;;;;;8247:148;8333:26;92:4594:23;;8333:26:25;;:::i;:::-;7967:4;;7680:1;;8319:53::o;7989:114::-;8048:36;;;;:::i;:::-;7989:114;;;;;7777:1343;8535:37;8536:36;;;;;;;;:::i;8535:37::-;8531:105;;8676:38;8691:22;;;;:::i;8676:38::-;8728:12;;92:4594:23;;7686:4:25;8758:20;;8754:294;7686:4;;;8798:80;7686:4;9076:26;8798:80;;;8754:294;;92:4594:23;9076:26:25;;:::i;:::-;9062:47;9070:4;9062:47;;;:::o;8754:294::-;8902:18;;;;7686:4;9076:26;92:4594:23;;8947:18:25;8898:150;8754:294;;8898:150;9004:29;;;;7680:1;9004:29;7680:1;9004:29;7680:1;9004:29;:::o;8531:105::-;8592:29;;;;;7680:1;8592:29;7680:1;8592:29;7680:1;8592:29;:::o;5044:1795::-;;;;;5315:14;92:4594:23;;5315:14:25;:::i;:::-;5302:27;;;5298:630;;5998:13;5994:18;;5988:25;5998:13;;;92:4594:23;;;;5998:13:25;5994:18;;:::i;5988:25::-;92:4594:23;;;6027:13:25;;92:4594:23;;;;6023:122:25;;6244:13;-1:-1:-1;6239:165:25;6259:10;92:4594:23;;;6259:10:25;;;;6441:28;;;;;:::i;:::-;92:4594:23;;;6483:20:25;;6479:96;;6812:13;;6630:2;6611:21;;6630:2;;;6648:73;;;;6607:181;6812:13;:::i;6607:181::-;6630:2;92:4594:23;6758:19:25;6607:181;6812:13;:::i;6479:96::-;6519:29;;;-1:-1:-1;6519:29:25;-1:-1:-1;6519:29:25;-1:-1:-1;6519:29:25;:::o;6244:13::-;6302:32;;92:4594:23;6286:48:25;6302:32;;92:4594:23;6302:32:25;;;:::i;6286:48::-;92:4594:23;;;;6244:13:25;;-1:-1:-1;6244:13:25;;6023:122;6130:4;6121:13;6023:122;;;5298:630;5401:32;;;;;;-1:-1:-1;5447:179:25;5467:6;5471:2;5467:6;;;;5667:27;;;;:::i;:::-;92:4594:23;;;;;;5712:20:25;92:4594:23;;;;;;5736:16:25;5712:40;5708:210;5736:16;;;92:4594:23;5772:36:25;;-1:-1:-1;5772:36:25;:::o;5708:210::-;-1:-1:-1;;;;;;;5874:29:25:o;5452:13::-;5509:31;5494:46;5509:31;;92:4594:23;5509:31:25;;;:::i;5494:46::-;92:4594:23;;5452:13:25;;;;4217:1141:26;;92:4594:23;;4321:21:26;;;4317:56;;4399:19;4405:12;;;;;:::i;4399:19::-;92:4594:23;;;;4442:4:26;4433:13;;4442:4;;;4462:8;;;;4469:1;4462:8;:::o;4429:923::-;4500:4;4491:13;;4500:4;;;4532:13;;;4527:19;4532:13;4520:26;4532:13;;:::i;4487:865::-;4576:4;4567:13;;4576:4;;;4618:13;;;4596:35;4618:13;;:::i;4596:35::-;4645:18;92:4594:23;4682:13:26;92:4594:23;4677:194:26;4697:15;;;;;;4891;;;;;:24;:15;;:::i;4682:13::-;4743:11;;;;4778:1;4743:11;92:4594:23;;;;4743:11:26;4742:43;4758:27;4764:20;;4769:14;:10;;;;:::i;:14::-;4764:20;;:::i;4742:43::-;;92:4594:23;;4682:13:26;;;;4563:789;4945:4;-1:-1:-1;4945:4:26;;;4977:13;;4972:19;4977:13;4965:26;4977:13;;:::i;4932:420::-;5044:13;;5022:35;5044:13;;:::i;5022:35::-;5071:18;92:4594:23;5108:13:26;92:4594:23;5103:194:26;5123:15;;;;;;5317;;;;;:24;:15;;:::i;5108:13::-;5169:11;;;;5204:1;5169:11;92:4594:23;;;;5169:11:26;5168:43;5184:27;5190:20;;5195:14;:10;;;;:::i;5168:43::-;;92:4594:23;;5108:13:26;;;;9295:1058:25;;92:4594:23;;9395:19:25;9391:39;;9459:17;9465:10;;;;:::i;9459:17::-;9512:4;9500:16;;9499:23;9512:4;;9596:33;9606:22;:18;92:4594:23;;9606:18:25;:::i;:::-;:22;:::i;:::-;9596:33;:::i;:::-;92:4594:23;;;-1:-1:-1;;;92:4594:23;9413:1:25;9643:36;;92:4594:23;9643:36:25;:::i;:::-;;9627:1;9698:13;92:4594:23;;9713:18:25;;;;;9785:10;9772:30;9779:22;:17;9785:10;;9627:1;9785:10;;;:::i;9779:17::-;92:4594:23;;;;;;9779:22:25;92:4594:23;;-1:-1:-1;;;;;;92:4594:23;;;9772:30:25;9752:50;9759:9;:5;;;:::i;:9::-;9752:50;9413:1;9752:50;;;;:::i;:::-;;9836:32;9674:4;9843:17;9849:10;;;;;:::i;9843:17::-;:24;92:4594:23;;-1:-1:-1;;;;;;92:4594:23;;;9836:32:25;9820:48;9827:5;;;:::i;9820:48::-;;92:4594:23;9698:13:25;;9713:18;-1:-1:-1;9713:18:25;-1:-1:-1;9295:1058:25:o;9562:761::-;92:4594:23;9993:33:25;10003:22;:18;92:4594:23;;10003:18:25;:::i;:::-;:22;:::i;9993:33::-;10057:1;10045:13;92:4594:23;;10060:18:25;;;;;10134:10;10121:30;10128:22;:17;10134:10;;10057:1;10134:10;;;:::i;10121:30::-;10099:52;10106:11;10107:5;;;:::i;:::-;10106:11;:::i;10099:52::-;;10195:32;10222:4;10202:17;10208:10;;;;;:::i;10195:32::-;10169:58;10176:15;:11;10177:5;;;:::i;10176:11::-;:15;:::i;10169:58::-;;92:4594:23;10045:13:25;;9391:39;9416:14::o;10590:651::-;;;;10709:23;92:4594:23;;10709:23:25;;:::i;:::-;10735:14;92:4594:23;;10735:14:25;:::i;:::-;-1:-1:-1;10705:58:25;;-1:-1:-1;10779:13:25;92:4594:23;;10794:18:25;;;;;10862:16;10863:10;;;;:::i;:::-;92:4594:23;;;;10862:16:25;10863:10;;10915:33;:28;10921:21;;10925:16;10926:10;;;;:::i;:::-;92:4594:23;;;;10925:16:25;10921:21;;:::i;10915:33::-;92:4594:23;11067:30:25;11080:17;11086:10;;;;;:::i;11067:30::-;92:4594:23;;11067:30:25;11063:81;;92:4594:23;;10779:13:25;;11063:81;11117:12;;;;-1:-1:-1;11117:12:25;:::o;10858:191::-;11030:4;10999:28;11005:21;;11009:16;11010:10;;;;:::i;10999:28::-;:35;10858:191;;10794:18;;;;;92:4594:23;10590:651:25;:::o;10705:58::-;10751:12;;;-1:-1:-1;10751:12:25;:::o","linkReferences":{},"immutableReferences":{"40183":[{"start":342,"length":32},{"start":1310,"length":32},{"start":1502,"length":32},{"start":1680,"length":32}],"40191":[{"start":775,"length":32},{"start":1584,"length":32}],"40193":[{"start":741,"length":32},{"start":909,"length":32}]}},"methodIdentifiers":{"MAX_BLOCK_LOOKBACK()":"3d2691bc","bond()":"64c9ec6f","bondAmount()":"80f323a7","bondedExecutor()":"1aa7c0ec","cancelAndWithdraw()":"6b892b22","cancellationRequest()":"308657d7","collect((bytes,bytes,bytes,bytes,bytes,bytes),uint256)":"23a8b41a","currentPaymentAmount()":"8bd03d0a","currentRewardAmount()":"5a4fd645","executionDeadline()":"33ee5f35","expectedAmount()":"2feef2ec","expectedRecipient()":"8677ab23","fund(uint256,uint256)":"a65e2cfd","funded()":"f3a504f2","is_bonded()":"cb766a56","originalRewardAmount()":"d415b3f9","requestCancellation()":"81972d00","resume()":"046f7da2","totalBondsDeposited()":"fe03a460"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_expectedRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_expectedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AmountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHashUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockHeaderMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlockNumberMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondActive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CancellationRequested\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ETHTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExecutorAlreadyBonded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExpectedRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectETHAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBond\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNativeTransfer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLP\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPEncoding\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRLPList\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceiptProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTxProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoWithdrawableFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFunded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyBondedExecutor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDeployer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RLPOffsetOutOfBounds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReceiptStatusNotSuccess\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockInFuture\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TargetBlockTooOld\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TxFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedTxType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPaymentAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroRewardAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MAX_BLOCK_LOOKBACK\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondedExecutor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelAndWithdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancellationRequest\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"blockHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"transactionRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"txProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptRlp\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiptProofNodes\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"path\",\"type\":\"bytes\"}],\"internalType\":\"struct EscrowNative.NativeTransferProof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"targetBlockNumber\",\"type\":\"uint256\"}],\"name\":\"collect\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentPaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"executionDeadline\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"expectedRecipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_currentRewardAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_currentPaymentAmount\",\"type\":\"uint256\"}],\"name\":\"fund\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"funded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"is_bonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"originalRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestCancellation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resume\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalBondsDeposited\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"cancelAndWithdraw()\":{\"notice\":\"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/EscrowNative.sol\":\"EscrowNative\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":forge-std/=lib/forge-std/src/\"],\"viaIR\":true},\"sources\":{\"src/BlockHeaderParser.sol\":{\"keccak256\":\"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6\",\"dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p\"]},\"src/EscrowBase.sol\":{\"keccak256\":\"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649\",\"dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG\"]},\"src/EscrowNative.sol\":{\"keccak256\":\"0xd82f8fe348a32f78d337dcf5e63020ac0179fd3652b4e23be3f1b26228350573\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://08add7d17c04c7e59ff6fb28e4a563d0133077779c085b4745e33dfd8be864b4\",\"dweb:/ipfs/Qmdrb9BPtfagU1ztLg8ZsQsUWLU7fhrZd7Sba1Gv4RdDCY\"]},\"src/MPTVerifier.sol\":{\"keccak256\":\"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b\",\"dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU\"]},\"src/RLPParser.sol\":{\"keccak256\":\"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d\",\"dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk\"]},\"src/ReceiptValidator.sol\":{\"keccak256\":\"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f\",\"dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.30+commit.73712a01"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_expectedRecipient","type":"address"},{"internalType":"uint256","name":"_expectedAmount","type":"uint256"},{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"type":"error","name":"AlreadyFunded"},{"inputs":[],"type":"error","name":"AmountMismatch"},{"inputs":[],"type":"error","name":"BlockHashUnavailable"},{"inputs":[],"type":"error","name":"BlockHeaderMismatch"},{"inputs":[],"type":"error","name":"BlockNumberMismatch"},{"inputs":[],"type":"error","name":"BondActive"},{"inputs":[],"type":"error","name":"CancellationRequested"},{"inputs":[],"type":"error","name":"ETHTransferFailed"},{"inputs":[],"type":"error","name":"ExecutorAlreadyBonded"},{"inputs":[],"type":"error","name":"ExpectedRLPList"},{"inputs":[],"type":"error","name":"IncorrectETHAmount"},{"inputs":[],"type":"error","name":"InsufficientBond"},{"inputs":[],"type":"error","name":"InvalidAddress"},{"inputs":[],"type":"error","name":"InvalidNativeTransfer"},{"inputs":[],"type":"error","name":"InvalidRLP"},{"inputs":[],"type":"error","name":"InvalidRLPEncoding"},{"inputs":[],"type":"error","name":"InvalidRLPList"},{"inputs":[],"type":"error","name":"InvalidReceiptProof"},{"inputs":[],"type":"error","name":"InvalidTxProof"},{"inputs":[],"type":"error","name":"NoWithdrawableFunds"},{"inputs":[],"type":"error","name":"NotFunded"},{"inputs":[],"type":"error","name":"OnlyBondedExecutor"},{"inputs":[],"type":"error","name":"OnlyDeployer"},{"inputs":[],"type":"error","name":"RLPOffsetOutOfBounds"},{"inputs":[],"type":"error","name":"ReceiptStatusNotSuccess"},{"inputs":[],"type":"error","name":"RecipientMismatch"},{"inputs":[],"type":"error","name":"TargetBlockInFuture"},{"inputs":[],"type":"error","name":"TargetBlockTooOld"},{"inputs":[],"type":"error","name":"TxFailed"},{"inputs":[],"type":"error","name":"UnsupportedTxType"},{"inputs":[],"type":"error","name":"ZeroPaymentAmount"},{"inputs":[],"type":"error","name":"ZeroRewardAmount"},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_BLOCK_LOOKBACK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"payable","type":"function","name":"bond"},{"inputs":[],"stateMutability":"view","type":"function","name":"bondAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"bondedExecutor","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"cancelAndWithdraw"},{"inputs":[],"stateMutability":"view","type":"function","name":"cancellationRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"struct EscrowNative.NativeTransferProof","name":"proof","type":"tuple","components":[{"internalType":"bytes","name":"blockHeader","type":"bytes"},{"internalType":"bytes","name":"transactionRlp","type":"bytes"},{"internalType":"bytes","name":"txProofNodes","type":"bytes"},{"internalType":"bytes","name":"receiptRlp","type":"bytes"},{"internalType":"bytes","name":"receiptProofNodes","type":"bytes"},{"internalType":"bytes","name":"path","type":"bytes"}]},{"internalType":"uint256","name":"targetBlockNumber","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"collect"},{"inputs":[],"stateMutability":"view","type":"function","name":"currentPaymentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"currentRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"executionDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"expectedRecipient","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"_currentRewardAmount","type":"uint256"},{"internalType":"uint256","name":"_currentPaymentAmount","type":"uint256"}],"stateMutability":"payable","type":"function","name":"fund"},{"inputs":[],"stateMutability":"view","type":"function","name":"funded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"is_bonded","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"originalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"requestCancellation"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"resume"},{"inputs":[],"stateMutability":"view","type":"function","name":"totalBondsDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"cancelAndWithdraw()":{"notice":"Cancel and withdraw funds in a single transaction. Reverts if a node has already bonded."}},"version":1}},"settings":{"remappings":["forge-std/=lib/forge-std/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/EscrowNative.sol":"EscrowNative"},"evmVersion":"prague","libraries":{},"viaIR":true},"sources":{"src/BlockHeaderParser.sol":{"keccak256":"0xf8a84bae1ea886c0519edb32e55f4c661d1e1cb036550967502148d033f08550","urls":["bzz-raw://766da07581e5dac7eda20d25debe9c381ed466204608502522b53266624bafa6","dweb:/ipfs/QmPyjTUV3zL6h9oeQjbbbw3WiypQQYqdws6vTWSAXRUg7p"],"license":"UNLICENSED"},"src/EscrowBase.sol":{"keccak256":"0x53fd262562c9dbc7779339bafbeca6b86b690aec7ac864e30c57e0e42288a11d","urls":["bzz-raw://cb43380f5b0a131e1ac4405a43a67b9d2b07718eb05ba675fe46c106b8a12649","dweb:/ipfs/QmNk5QkryXnDspEGc8mdyFYJSRXWRSP8V6yirLC98EKZYG"],"license":"UNLICENSED"},"src/EscrowNative.sol":{"keccak256":"0xd82f8fe348a32f78d337dcf5e63020ac0179fd3652b4e23be3f1b26228350573","urls":["bzz-raw://08add7d17c04c7e59ff6fb28e4a563d0133077779c085b4745e33dfd8be864b4","dweb:/ipfs/Qmdrb9BPtfagU1ztLg8ZsQsUWLU7fhrZd7Sba1Gv4RdDCY"],"license":"UNLICENSED"},"src/MPTVerifier.sol":{"keccak256":"0xf71ff6fc0fa054681fc67b7ca3c187141749b04895defd977d6989271b35ebeb","urls":["bzz-raw://6e2efbdee9d872e22febc5d29894e3759e72ed43850a512c9eed56a9f5e7ff3b","dweb:/ipfs/QmShY9TstL2zXVSYH7ux8D6ByW22ptm7JfiEWy2qs7bHZU"],"license":"UNLICENSED"},"src/RLPParser.sol":{"keccak256":"0x403e6fd0cbf2e3599530d724d26e75b136bd7947e35e1cf5f79b30841b2c4c6c","urls":["bzz-raw://b24f44c75ae8db00297a940d0badb6b0fd9114b494b1a5c097a04f4bccde5e1d","dweb:/ipfs/QmSoxh5vZu41RzAs8RTLXgQ5cD5pQBeQo68nYSFh4Dk5Xk"],"license":"UNLICENSED"},"src/ReceiptValidator.sol":{"keccak256":"0x625137f131a6524c06e6c7c6ddc4c3f10256ac8a306b53b2dfed4fe9a3ed9728","urls":["bzz-raw://611b99fa26ae364ea2e0aa721f62ca043ca6d5b0e2bc1c96278639792242f43f","dweb:/ipfs/QmXFkR6amwaZF1QZqZjsneEXBz8C17QmCFyirmHo7eaUaH"],"license":"UNLICENSED"}},"version":1},"id":23} \ No newline at end of file diff --git a/scripts/update_artifacts.sh b/scripts/update_artifacts.sh new file mode 100755 index 0000000..d7a4cee --- /dev/null +++ b/scripts/update_artifacts.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# Regenerate the pinned bytecode hex files in artifacts/ from the Forge build. +# Run after any change to src/ that affects compiled output. CI's bytecode +# guard requires these files to be updated in the same PR as src/ changes. +# +# Usage: +# make artifacts # from repo root (recommended) +# ./scripts/update_artifacts.sh # from repo root +# bash scripts/update_artifacts.sh # if not executable +# +# Requires: foundry (forge) and jq on PATH. + +set -euo pipefail + +cd "$(dirname "$0")/.." + +forge build --silent + +extract() { + local contract="$1" + local prefix="$2" + local json="out/${contract}.sol/${contract}.json" + + if [[ ! -f "$json" ]]; then + echo "error: $json not found — did 'forge build' succeed?" >&2 + exit 1 + fi + + jq -r '.bytecode.object' "$json" > "artifacts/${prefix}_deployment.hex" + jq -r '.deployedBytecode.object' "$json" > "artifacts/${prefix}_runtime.hex" + echo " artifacts/${prefix}_{deployment,runtime}.hex" +} + +echo "Updating bytecode artifacts:" +extract EscrowERC20 erc20 +extract EscrowNative native +extract EscrowBatch batch diff --git a/src/EscrowBatch.sol b/src/EscrowBatch.sol new file mode 100644 index 0000000..fec8c50 --- /dev/null +++ b/src/EscrowBatch.sol @@ -0,0 +1,749 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.30; + +import "./BlockHeaderParser.sol"; +import "./IEscrowBatch.sol"; +import "./MPTVerifier.sol"; +import "./ReceiptValidator.sol"; + +interface IBatchERC20 { + function send(address to, uint256 amount) external returns (bool); + function transfer(address to, uint256 amount) external returns (bool); + function transferFrom(address from, address to, uint256 amount) external returns (bool); +} + +contract EscrowBatch is IEscrowBatch { + error OnlyDeployer(); + error NotFunded(); + error OnlyBondedExecutor(); + error TargetBlockInFuture(); + error TargetBlockTooOld(); + error BlockHashUnavailable(); + error BlockHeaderMismatch(); + error BlockNumberMismatch(); + error BondActive(); + error CancellationRequested(); + error ExecutorAlreadyBonded(); + error InsufficientBond(); + error ZeroAddress(); + error EmptyBatch(); + error EmptyReservation(); + error ZeroRewardAmount(); + error ZeroPaymentAmount(); + error AlreadyFunded(); + error TokenTransferFailed(); + error ETHTransferFailed(); + error IncorrectNativeAmount(); + error InvalidBatchProofLength(); + error DuplicateLogIndex(); + error DuplicateTransferIndex(); + error InvalidTransferIndex(); + error InvalidProofType(); + error InvalidTxProof(); + error TxFailed(); + error TransferAlreadyCompleted(); + error TransferAlreadyReserved(); + error TransferNotReserved(); + error MissingTransferProof(); + error ProofBeforeReservation(); + error InvalidReceiptProof(); + error InvalidTransferEvent(); + error InvalidNativeTransfer(); + error NoWithdrawableFunds(); + error Reentrancy(); + + struct Reservation { + uint256 bondAmount; + uint256 deadline; + uint256 startBlock; + uint256 reservedRewardWeight; + uint256 reservedCount; + } + + address immutable deployerAddress; + address public immutable tokenContract; + uint256 public immutable totalPaymentAmount; + uint256 public immutable totalRewardWeight; + + uint256 public currentRewardAmount; + uint256 public currentPaymentAmount; + uint256 public originalRewardAmount; + uint256 public completedTransferCount; + uint256 public activeReservationCount; + uint256 public totalBondsDeposited; + + uint256 public constant MAX_BLOCK_LOOKBACK = 256; + uint256 private constant NOT_ENTERED = 1; + uint256 private constant ENTERED = 2; + + IEscrowBatch.BatchTransfer[] public expectedTransfers; + + mapping(address => Reservation) public reservations; + mapping(address => uint256[]) private reservedTransferIndexes; + mapping(address => uint256) private reservationExecutorPositions; + address[] private reservationExecutors; + + mapping(address => uint256) public totalAssetPaymentAmount; + mapping(address => uint256) public currentAssetPaymentAmount; + mapping(address => bool) private knownPaymentAsset; + address[] private paymentAssets; + + mapping(uint256 => address) public transferExecutor; + mapping(uint256 => bool) public transferCompleted; + + bool public cancellationRequest; + bool public funded; + bool public hasBeenFunded; + uint256 private reentrancyStatus = NOT_ENTERED; + + modifier nonReentrant() { + if (reentrancyStatus == ENTERED) revert Reentrancy(); + reentrancyStatus = ENTERED; + _; + reentrancyStatus = NOT_ENTERED; + } + + constructor( + address _tokenContract, + IEscrowBatch.BatchTransfer[] memory _expectedTransfers, + uint256 _currentRewardAmount + ) payable { + if (_tokenContract == address(0)) revert ZeroAddress(); + if (_expectedTransfers.length == 0) revert EmptyBatch(); + + tokenContract = _tokenContract; + deployerAddress = msg.sender; + + uint256 totalWeight; + for (uint256 i = 0; i < _expectedTransfers.length;) { + IEscrowBatch.BatchTransfer memory expectedTransfer = _expectedTransfers[i]; + _validateExpectedTransfer(expectedTransfer); + + address asset = _assetKey(expectedTransfer); + _trackPaymentAsset(asset); + totalAssetPaymentAmount[asset] += expectedTransfer.amount; + totalWeight += expectedTransfer.rewardWeight; + expectedTransfers.push(expectedTransfer); + + unchecked { + ++i; + } + } + + totalPaymentAmount = totalWeight; + totalRewardWeight = totalWeight; + + if (_currentRewardAmount > 0) { + _fund(_currentRewardAmount); + } else if (msg.value != 0) { + revert IncorrectNativeAmount(); + } + } + + function expectedTransferCount() external view returns (uint256) { + return expectedTransfers.length; + } + + function paymentAssetCount() external view returns (uint256) { + return paymentAssets.length; + } + + function paymentAssetAt(uint256 index) external view returns (address) { + return paymentAssets[index]; + } + + function reservedTransferCount(address executor) external view returns (uint256) { + return reservedTransferIndexes[executor].length; + } + + function reservedTransferIndex(address executor, uint256 position) external view returns (uint256) { + return reservedTransferIndexes[executor][position]; + } + + function fund(uint256 _currentRewardAmount) external payable nonReentrant { + if (msg.sender != deployerAddress) revert OnlyDeployer(); + if (funded || hasBeenFunded) revert AlreadyFunded(); + + _fund(_currentRewardAmount); + } + + function requestCancellation() external { + if (msg.sender != deployerAddress) revert OnlyDeployer(); + cancellationRequest = true; + } + + function resume() external { + if (msg.sender != deployerAddress) revert OnlyDeployer(); + cancellationRequest = false; + } + + function is_bonded() public view returns (bool) { + uint256 executorCount = reservationExecutors.length; + for (uint256 i = 0; i < executorCount;) { + Reservation storage reservation = reservations[reservationExecutors[i]]; + if (reservation.deadline > 0 && block.timestamp <= reservation.deadline) { + return true; + } + + unchecked { + ++i; + } + } + + return false; + } + + function bond(uint256[] calldata transferIndexes, uint256 _bondAmount) external nonReentrant { + _handleExpiredReservations(true); + _validateBondRequirements(transferIndexes, _bondAmount); + + (uint256 reservedRewardWeight, uint256 reservedCount) = _validateReservationIndexes(transferIndexes); + uint256 requiredBond = _calculateRewardShare(reservedRewardWeight) / 2; + if (_bondAmount < requiredBond) revert InsufficientBond(); + + _trackReservationExecutor(msg.sender); + + Reservation storage reservation = reservations[msg.sender]; + reservation.bondAmount = _bondAmount; + reservation.deadline = block.timestamp + 5 minutes; + reservation.startBlock = block.number; + reservation.reservedRewardWeight = reservedRewardWeight; + reservation.reservedCount = reservedCount; + activeReservationCount += 1; + + for (uint256 i = 0; i < transferIndexes.length;) { + uint256 transferIndex = transferIndexes[i]; + transferExecutor[transferIndex] = msg.sender; + reservedTransferIndexes[msg.sender].push(transferIndex); + + unchecked { + ++i; + } + } + + if (!IBatchERC20(tokenContract).transferFrom(msg.sender, address(this), _bondAmount)) { + revert TokenTransferFailed(); + } + } + + function collect(IEscrowBatch.BatchProof[] calldata proofs) external nonReentrant { + _handleExpiredReservations(true); + + Reservation storage reservation = reservations[msg.sender]; + if (!funded) revert NotFunded(); + if (reservation.deadline == 0 || block.timestamp > reservation.deadline) revert OnlyBondedExecutor(); + if (proofs.length == 0) revert InvalidBatchProofLength(); + + bool[] memory seenTransfers = new bool[](expectedTransfers.length); + bytes32[] memory seenProofItems = new bytes32[](expectedTransfers.length); + uint256 completedRewardWeight; + uint256 providedTransferCount; + + for (uint256 proofIndex = 0; proofIndex < proofs.length;) { + IEscrowBatch.BatchProof calldata batchProof = proofs[proofIndex]; + + if (batchProof.proofType == IEscrowBatch.AssetType.ERC20) { + (uint256 proofRewardWeight, uint256 proofTransferCount) = _validateERC20BatchProof( + batchProof, seenTransfers, seenProofItems, providedTransferCount, reservation.startBlock + ); + completedRewardWeight += proofRewardWeight; + providedTransferCount += proofTransferCount; + } else if (batchProof.proofType == IEscrowBatch.AssetType.NATIVE) { + uint256 transferIndex = _validateNativeBatchProof( + batchProof, seenTransfers, seenProofItems, providedTransferCount, reservation.startBlock + ); + completedRewardWeight += expectedTransfers[transferIndex].rewardWeight; + providedTransferCount += 1; + } else { + revert InvalidProofType(); + } + + unchecked { + ++proofIndex; + } + } + + if (providedTransferCount != reservation.reservedCount) revert MissingTransferProof(); + if (completedRewardWeight != reservation.reservedRewardWeight) revert MissingTransferProof(); + + uint256[] storage reservedIndexes = reservedTransferIndexes[msg.sender]; + for (uint256 i = 0; i < reservedIndexes.length;) { + uint256 transferIndex = reservedIndexes[i]; + if (!seenTransfers[transferIndex]) revert MissingTransferProof(); + transferCompleted[transferIndex] = true; + transferExecutor[transferIndex] = address(0); + + unchecked { + ++i; + } + } + + _payoutReservation(msg.sender, reservation.bondAmount, completedRewardWeight, reservation.reservedCount); + } + + function cancelAndWithdraw() external nonReentrant { + if (msg.sender != deployerAddress) revert OnlyDeployer(); + if (!funded) revert NotFunded(); + + cancellationRequest = true; + _handleExpiredReservations(true); + if (activeReservationCount > 0) revert BondActive(); + + uint256 rewardAmount = currentRewardAmount; + address[] memory assets = paymentAssets; + uint256[] memory amounts = new uint256[](assets.length); + uint256 withdrawableAmount = rewardAmount; + + funded = false; + currentRewardAmount = 0; + currentPaymentAmount = 0; + + for (uint256 i = 0; i < assets.length;) { + amounts[i] = currentAssetPaymentAmount[assets[i]]; + withdrawableAmount += amounts[i]; + currentAssetPaymentAmount[assets[i]] = 0; + + unchecked { + ++i; + } + } + + if (withdrawableAmount == 0) revert NoWithdrawableFunds(); + + if (rewardAmount > 0) { + _sendERC20(tokenContract, msg.sender, rewardAmount); + } + for (uint256 i = 0; i < assets.length;) { + if (amounts[i] > 0) { + _sendAsset(assets[i], msg.sender, amounts[i]); + } + + unchecked { + ++i; + } + } + } + + function _fund(uint256 _currentRewardAmount) internal { + if (_currentRewardAmount == 0) revert ZeroRewardAmount(); + if (totalRewardWeight == 0) revert ZeroPaymentAmount(); + if (msg.value != totalAssetPaymentAmount[address(0)]) revert IncorrectNativeAmount(); + + currentRewardAmount = _currentRewardAmount; + originalRewardAmount = _currentRewardAmount; + currentPaymentAmount = totalRewardWeight; + completedTransferCount = 0; + hasBeenFunded = true; + funded = true; + + if (!IBatchERC20(tokenContract).transferFrom(msg.sender, address(this), _currentRewardAmount)) { + revert TokenTransferFailed(); + } + + for (uint256 i = 0; i < paymentAssets.length;) { + address asset = paymentAssets[i]; + uint256 amount = totalAssetPaymentAmount[asset]; + currentAssetPaymentAmount[asset] = amount; + + if (asset != address(0) && !IBatchERC20(asset).transferFrom(msg.sender, address(this), amount)) { + revert TokenTransferFailed(); + } + + unchecked { + ++i; + } + } + } + + function _validateExpectedTransfer(IEscrowBatch.BatchTransfer memory expectedTransfer) internal pure { + if (expectedTransfer.recipient == address(0)) revert ZeroAddress(); + if (expectedTransfer.amount == 0) revert ZeroPaymentAmount(); + if (expectedTransfer.rewardWeight == 0) revert ZeroPaymentAmount(); + + if (expectedTransfer.assetType == IEscrowBatch.AssetType.ERC20) { + if (expectedTransfer.asset == address(0)) revert ZeroAddress(); + } else if (expectedTransfer.assetType == IEscrowBatch.AssetType.NATIVE) { + if (expectedTransfer.asset != address(0)) revert ZeroAddress(); + } else { + revert InvalidProofType(); + } + } + + function _validateBondRequirements(uint256[] calldata transferIndexes, uint256 _bondAmount) internal view { + if (!funded) revert NotFunded(); + if (cancellationRequest) revert CancellationRequested(); + if (transferIndexes.length == 0) revert EmptyReservation(); + if (reservations[msg.sender].deadline > 0) revert ExecutorAlreadyBonded(); + if (_bondAmount == 0) revert InsufficientBond(); + } + + function _validateReservationIndexes(uint256[] calldata transferIndexes) + internal + view + returns (uint256 reservedRewardWeight, uint256 reservedCount) + { + bool[] memory seenTransfers = new bool[](expectedTransfers.length); + + for (uint256 i = 0; i < transferIndexes.length;) { + uint256 transferIndex = transferIndexes[i]; + if (transferIndex >= expectedTransfers.length) revert InvalidTransferIndex(); + if (seenTransfers[transferIndex]) revert DuplicateTransferIndex(); + if (transferCompleted[transferIndex]) revert TransferAlreadyCompleted(); + if (transferExecutor[transferIndex] != address(0)) revert TransferAlreadyReserved(); + + seenTransfers[transferIndex] = true; + reservedRewardWeight += expectedTransfers[transferIndex].rewardWeight; + reservedCount += 1; + + unchecked { + ++i; + } + } + } + + function _validateERC20BatchProof( + IEscrowBatch.BatchProof calldata batchProof, + bool[] memory seenTransfers, + bytes32[] memory seenProofItems, + uint256 providedTransferCount, + uint256 reservationStartBlock + ) internal view returns (uint256 proofRewardWeight, uint256 proofTransferCount) { + if (batchProof.transferIndexes.length == 0) revert InvalidBatchProofLength(); + if (batchProof.transferIndexes.length != batchProof.logIndexes.length) revert InvalidBatchProofLength(); + _validateLogIndexesAreUnique(batchProof.logIndexes); + + for (uint256 i = 0; i < batchProof.transferIndexes.length;) { + uint256 transferIndex = _validateCollectTransfer(batchProof.transferIndexes[i], seenTransfers); + IEscrowBatch.BatchTransfer storage expectedTransfer = expectedTransfers[transferIndex]; + if (expectedTransfer.assetType != IEscrowBatch.AssetType.ERC20) revert InvalidProofType(); + + bytes32 proofItemId = keccak256( + abi.encode( + batchProof.proofType, + batchProof.receiptProof.targetBlockNumber, + batchProof.receiptProof.receiptPath, + batchProof.logIndexes[i] + ) + ); + _validateProofItemIsUnused(seenProofItems, providedTransferCount + proofTransferCount, proofItemId); + seenProofItems[providedTransferCount + proofTransferCount] = proofItemId; + + seenTransfers[transferIndex] = true; + proofRewardWeight += expectedTransfer.rewardWeight; + proofTransferCount += 1; + + unchecked { + ++i; + } + } + + if (batchProof.receiptProof.targetBlockNumber <= reservationStartBlock) revert ProofBeforeReservation(); + _validateReceiptProof(batchProof.receiptProof); + + for (uint256 i = 0; i < batchProof.transferIndexes.length;) { + uint256 transferIndex = batchProof.transferIndexes[i]; + IEscrowBatch.BatchTransfer storage expectedTransfer = expectedTransfers[transferIndex]; + if (!ReceiptValidator.validateTransferInReceipt( + batchProof.receiptProof.receiptRlp, + batchProof.logIndexes[i], + expectedTransfer.asset, + expectedTransfer.recipient, + expectedTransfer.amount + )) revert InvalidTransferEvent(); + + unchecked { + ++i; + } + } + } + + function _validateNativeBatchProof( + IEscrowBatch.BatchProof calldata batchProof, + bool[] memory seenTransfers, + bytes32[] memory seenProofItems, + uint256 providedTransferCount, + uint256 reservationStartBlock + ) internal view returns (uint256 transferIndex) { + if (batchProof.transferIndexes.length != 1 || batchProof.logIndexes.length != 0) { + revert InvalidBatchProofLength(); + } + + transferIndex = _validateCollectTransfer(batchProof.transferIndexes[0], seenTransfers); + IEscrowBatch.BatchTransfer storage expectedTransfer = expectedTransfers[transferIndex]; + if (expectedTransfer.assetType != IEscrowBatch.AssetType.NATIVE) revert InvalidProofType(); + + bytes32 proofItemId = keccak256( + abi.encode( + batchProof.proofType, batchProof.receiptProof.targetBlockNumber, batchProof.receiptProof.receiptPath + ) + ); + _validateProofItemIsUnused(seenProofItems, providedTransferCount, proofItemId); + seenProofItems[providedTransferCount] = proofItemId; + seenTransfers[transferIndex] = true; + + if (batchProof.receiptProof.targetBlockNumber <= reservationStartBlock) revert ProofBeforeReservation(); + _validateNativeProof(batchProof, expectedTransfer.recipient, expectedTransfer.amount); + } + + function _validateCollectTransfer(uint256 transferIndex, bool[] memory seenTransfers) + internal + view + returns (uint256) + { + if (transferIndex >= expectedTransfers.length) revert InvalidTransferIndex(); + if (seenTransfers[transferIndex]) revert DuplicateTransferIndex(); + if (transferExecutor[transferIndex] != msg.sender) revert TransferNotReserved(); + if (transferCompleted[transferIndex]) revert TransferAlreadyCompleted(); + return transferIndex; + } + + function _validateReceiptProof(IEscrowBatch.BatchReceiptProof calldata proof) internal view { + _validateBlockHeader(proof.blockHeader, proof.targetBlockNumber); + + bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(proof.blockHeader); + if (!MPTVerifier.verifyReceiptProof(proof.receiptRlp, proof.proofNodes, proof.receiptPath, receiptsRoot)) { + revert InvalidReceiptProof(); + } + } + + function _validateNativeProof( + IEscrowBatch.BatchProof calldata batchProof, + address expectedRecipient, + uint256 expectedAmount + ) internal view { + _validateBlockHeader(batchProof.receiptProof.blockHeader, batchProof.receiptProof.targetBlockNumber); + + bytes32 transactionsRoot = BlockHeaderParser.extractTransactionsRoot(batchProof.receiptProof.blockHeader); + if (!MPTVerifier.verifyReceiptProof( + batchProof.transactionRlp, + batchProof.txProofNodes, + batchProof.receiptProof.receiptPath, + transactionsRoot + )) revert InvalidTxProof(); + + bytes32 receiptsRoot = BlockHeaderParser.extractReceiptsRoot(batchProof.receiptProof.blockHeader); + if (!MPTVerifier.verifyReceiptProof( + batchProof.receiptProof.receiptRlp, + batchProof.receiptProof.proofNodes, + batchProof.receiptProof.receiptPath, + receiptsRoot + )) revert InvalidReceiptProof(); + + if (!ReceiptValidator.validateReceiptStatus(batchProof.receiptProof.receiptRlp)) revert TxFailed(); + if (!ReceiptValidator.validateNativeTransfer(batchProof.transactionRlp, expectedRecipient, expectedAmount)) { + revert InvalidNativeTransfer(); + } + } + + function _validateBlockHeader(bytes calldata blockHeader, uint256 targetBlockNumber) internal view { + if (targetBlockNumber > block.number) revert TargetBlockInFuture(); + if (block.number - targetBlockNumber > MAX_BLOCK_LOOKBACK) revert TargetBlockTooOld(); + + bytes32 targetBlockHash = blockhash(targetBlockNumber); + if (targetBlockHash == bytes32(0)) revert BlockHashUnavailable(); + if (keccak256(blockHeader) != targetBlockHash) revert BlockHeaderMismatch(); + if (BlockHeaderParser.extractBlockNumber(blockHeader) != targetBlockNumber) revert BlockNumberMismatch(); + } + + function _validateLogIndexesAreUnique(uint256[] calldata logIndexes) internal pure { + uint256 len = logIndexes.length; + for (uint256 i = 0; i < len;) { + uint256 current = logIndexes[i]; + for (uint256 j = 0; j < i;) { + if (current == logIndexes[j]) revert DuplicateLogIndex(); + unchecked { + ++j; + } + } + unchecked { + ++i; + } + } + } + + function _validateProofItemIsUnused(bytes32[] memory seenProofItems, uint256 seenCount, bytes32 proofItemId) + internal + pure + { + for (uint256 i = 0; i < seenCount;) { + if (seenProofItems[i] == proofItemId) revert DuplicateLogIndex(); + + unchecked { + ++i; + } + } + } + + function _handleExpiredReservations(bool addToReward) internal { + uint256 i; + while (i < reservationExecutors.length) { + if (!_releaseExpiredReservation(reservationExecutors[i], addToReward)) { + unchecked { + ++i; + } + } + } + } + + function _releaseExpiredReservation(address executor, bool addToReward) internal returns (bool released) { + Reservation storage reservation = reservations[executor]; + if (reservation.deadline == 0 || block.timestamp <= reservation.deadline) { + return false; + } + + uint256 forfeitedBond = reservation.bondAmount; + _clearReservation(executor); + + if (addToReward && forfeitedBond > 0) { + currentRewardAmount += forfeitedBond; + totalBondsDeposited += forfeitedBond; + } + + return true; + } + + function _clearReservation(address executor) internal { + Reservation storage reservation = reservations[executor]; + if (reservation.deadline == 0) { + return; + } + + uint256[] storage indexes = reservedTransferIndexes[executor]; + for (uint256 i = 0; i < indexes.length;) { + uint256 transferIndex = indexes[i]; + if (transferExecutor[transferIndex] == executor) { + transferExecutor[transferIndex] = address(0); + } + + unchecked { + ++i; + } + } + + delete reservedTransferIndexes[executor]; + delete reservations[executor]; + _untrackReservationExecutor(executor); + activeReservationCount -= 1; + } + + function _trackReservationExecutor(address executor) internal { + if (reservationExecutorPositions[executor] != 0) { + return; + } + + reservationExecutors.push(executor); + reservationExecutorPositions[executor] = reservationExecutors.length; + } + + function _untrackReservationExecutor(address executor) internal { + uint256 position = reservationExecutorPositions[executor]; + if (position == 0) { + return; + } + + uint256 index = position - 1; + uint256 lastIndex = reservationExecutors.length - 1; + + if (index != lastIndex) { + address lastExecutor = reservationExecutors[lastIndex]; + reservationExecutors[index] = lastExecutor; + reservationExecutorPositions[lastExecutor] = position; + } + + reservationExecutors.pop(); + delete reservationExecutorPositions[executor]; + } + + function _trackPaymentAsset(address asset) internal { + if (knownPaymentAsset[asset]) { + return; + } + + knownPaymentAsset[asset] = true; + paymentAssets.push(asset); + } + + function _assetKey(IEscrowBatch.BatchTransfer memory expectedTransfer) internal pure returns (address) { + return expectedTransfer.assetType == IEscrowBatch.AssetType.NATIVE ? address(0) : expectedTransfer.asset; + } + + function _calculateRewardShare(uint256 rewardWeight) internal view returns (uint256) { + if (rewardWeight == 0 || currentRewardAmount == 0) { + return 0; + } + if (rewardWeight >= currentPaymentAmount) { + return currentRewardAmount; + } + + return (currentRewardAmount * rewardWeight) / currentPaymentAmount; + } + + function _payoutReservation( + address executor, + uint256 executorBondAmount, + uint256 completedRewardWeight, + uint256 completedCount + ) internal { + bool isFinalCollection = + completedTransferCount + completedCount == expectedTransfers.length; + uint256 rewardWeightShare = isFinalCollection ? currentPaymentAmount : completedRewardWeight; + uint256 rewardShare = isFinalCollection ? currentRewardAmount : _calculateRewardShare(completedRewardWeight); + + uint256[] storage indexes = reservedTransferIndexes[executor]; + address[] memory assets = new address[](indexes.length); + uint256[] memory amounts = new uint256[](indexes.length); + for (uint256 i = 0; i < indexes.length;) { + IEscrowBatch.BatchTransfer storage expectedTransfer = expectedTransfers[indexes[i]]; + address asset = _assetKey(expectedTransfer); + assets[i] = asset; + amounts[i] = expectedTransfer.amount; + currentAssetPaymentAmount[asset] -= expectedTransfer.amount; + + unchecked { + ++i; + } + } + + uint256 rewardPayout = executorBondAmount + rewardShare; + completedTransferCount += completedCount; + currentPaymentAmount -= rewardWeightShare; + currentRewardAmount -= rewardShare; + _clearReservation(executor); + + if (isFinalCollection) { + funded = false; + currentPaymentAmount = 0; + currentRewardAmount = 0; + } + + if (rewardPayout > 0) { + _sendERC20(tokenContract, executor, rewardPayout); + } + for (uint256 i = 0; i < assets.length;) { + _sendAsset(assets[i], executor, amounts[i]); + + unchecked { + ++i; + } + } + } + + function _sendAsset(address asset, address to, uint256 amount) internal { + if (asset == address(0)) { + (bool success,) = to.call{value: amount}(""); + if (!success) revert ETHTransferFailed(); + } else { + _sendERC20(asset, to, amount); + } + } + + function _sendERC20(address asset, address to, uint256 amount) internal { + bool success; + if (block.chainid == 11155111) { + success = IBatchERC20(asset).send(to, amount); + } else { + success = IBatchERC20(asset).transfer(to, amount); + } + if (!success) revert TokenTransferFailed(); + } +} diff --git a/src/IEscrowBatch.sol b/src/IEscrowBatch.sol new file mode 100644 index 0000000..2ae5c1c --- /dev/null +++ b/src/IEscrowBatch.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.30; + +interface IEscrowBatch { + enum AssetType { + ERC20, + NATIVE + } + + struct BatchTransfer { + AssetType assetType; + address asset; + address recipient; + uint256 amount; + uint256 rewardWeight; + } + + struct BatchReceiptProof { + bytes blockHeader; + bytes receiptRlp; + bytes proofNodes; + bytes receiptPath; + uint256 targetBlockNumber; + } + + struct BatchProof { + AssetType proofType; + BatchReceiptProof receiptProof; + bytes transactionRlp; + bytes txProofNodes; + uint256[] transferIndexes; + uint256[] logIndexes; + } + + function bond(uint256[] calldata transferIndexes, uint256 bondAmount) external; + + function collect(BatchProof[] calldata proofs) external; +} diff --git a/test/EscrowBatch.t.sol b/test/EscrowBatch.t.sol new file mode 100644 index 0000000..3af61e6 --- /dev/null +++ b/test/EscrowBatch.t.sol @@ -0,0 +1,441 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.30; + +import {Test} from "forge-std/Test.sol"; +import {EscrowBatch} from "../src/EscrowBatch.sol"; +import {IEscrowBatch} from "../src/IEscrowBatch.sol"; + +contract BatchMockERC20 { + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + event Transfer(address indexed from, address indexed to, uint256 value); + + function mint(address to, uint256 amount) external { + balanceOf[to] += amount; + } + + function transfer(address to, uint256 amount) external returns (bool) { + require(balanceOf[msg.sender] >= amount, "Insufficient balance"); + balanceOf[msg.sender] -= amount; + balanceOf[to] += amount; + emit Transfer(msg.sender, to, amount); + return true; + } + + function transferFrom(address from, address to, uint256 amount) external returns (bool) { + require(balanceOf[from] >= amount, "Insufficient balance"); + require(allowance[from][msg.sender] >= amount, "Insufficient allowance"); + balanceOf[from] -= amount; + balanceOf[to] += amount; + allowance[from][msg.sender] -= amount; + emit Transfer(from, to, amount); + return true; + } + + function approve(address spender, uint256 amount) external returns (bool) { + allowance[msg.sender][spender] = amount; + return true; + } +} + +contract EscrowBatchTest is Test { + EscrowBatch public escrow; + BatchMockERC20 public token; + + address public deployer; + address public executor; + address public recipientA; + address public recipientB; + address public other; + + uint256 constant AMOUNT_A = 100e18; + uint256 constant AMOUNT_B = 250e18; + uint256 constant PAYMENT_AMOUNT = AMOUNT_A + AMOUNT_B; + uint256 constant REWARD_AMOUNT = 50e18; + uint256 constant BOND_AMOUNT = 25e18; + + function setUp() public { + deployer = makeAddr("deployer"); + executor = makeAddr("executor"); + recipientA = makeAddr("recipientA"); + recipientB = makeAddr("recipientB"); + other = makeAddr("other"); + + vm.startPrank(deployer); + token = new BatchMockERC20(); + token.mint(deployer, 10_000e18); + + address futureEscrow = vm.computeCreateAddress(deployer, vm.getNonce(deployer)); + token.approve(futureEscrow, PAYMENT_AMOUNT + REWARD_AMOUNT); + + escrow = new EscrowBatch(address(token), _batch(), REWARD_AMOUNT); + vm.stopPrank(); + + token.mint(executor, 10_000e18); + token.mint(other, 10_000e18); + } + + function testConstructorStoresBatch() public view { + assertEq(escrow.tokenContract(), address(token)); + assertEq(escrow.expectedTransferCount(), 2); + assertEq(escrow.totalPaymentAmount(), PAYMENT_AMOUNT); + assertEq(escrow.currentPaymentAmount(), PAYMENT_AMOUNT); + assertEq(escrow.currentRewardAmount(), REWARD_AMOUNT); + assertEq(escrow.completedTransferCount(), 0); + assertEq(escrow.activeReservationCount(), 0); + assertTrue(escrow.funded()); + + ( + IEscrowBatch.AssetType firstAssetType, + address firstAsset, + address firstRecipient, + uint256 firstAmount, + uint256 firstRewardWeight + ) = escrow.expectedTransfers(0); + ( + IEscrowBatch.AssetType secondAssetType, + address secondAsset, + address secondRecipient, + uint256 secondAmount, + uint256 secondRewardWeight + ) = escrow.expectedTransfers(1); + + assertEq(uint256(firstAssetType), uint256(IEscrowBatch.AssetType.ERC20)); + assertEq(firstAsset, address(token)); + assertEq(firstRecipient, recipientA); + assertEq(firstAmount, AMOUNT_A); + assertEq(firstRewardWeight, AMOUNT_A); + assertEq(uint256(secondAssetType), uint256(IEscrowBatch.AssetType.ERC20)); + assertEq(secondAsset, address(token)); + assertEq(secondRecipient, recipientB); + assertEq(secondAmount, AMOUNT_B); + assertEq(secondRewardWeight, AMOUNT_B); + } + + function testConstructorRejectsEmptyBatch() public { + IEscrowBatch.BatchTransfer[] memory transfers = new IEscrowBatch.BatchTransfer[](0); + + vm.prank(deployer); + vm.expectRevert(EscrowBatch.EmptyBatch.selector); + new EscrowBatch(address(token), transfers, REWARD_AMOUNT); + } + + function testConstructorRejectsZeroAmount() public { + IEscrowBatch.BatchTransfer[] memory transfers = new IEscrowBatch.BatchTransfer[](1); + transfers[0] = IEscrowBatch.BatchTransfer({ + assetType: IEscrowBatch.AssetType.ERC20, + asset: address(token), + recipient: recipientA, + amount: 0, + rewardWeight: AMOUNT_A + }); + + vm.prank(deployer); + vm.expectRevert(EscrowBatch.ZeroPaymentAmount.selector); + new EscrowBatch(address(token), transfers, REWARD_AMOUNT); + } + + function testFundUnfundedBatch() public { + vm.startPrank(deployer); + EscrowBatch unfunded = new EscrowBatch(address(token), _batch(), 0); + + token.approve(address(unfunded), PAYMENT_AMOUNT + REWARD_AMOUNT); + unfunded.fund(REWARD_AMOUNT); + vm.stopPrank(); + + assertTrue(unfunded.funded()); + assertEq(unfunded.currentPaymentAmount(), PAYMENT_AMOUNT); + assertEq(unfunded.currentRewardAmount(), REWARD_AMOUNT); + assertEq(token.balanceOf(address(unfunded)), PAYMENT_AMOUNT + REWARD_AMOUNT); + } + + function testFundOnlyDeployer() public { + vm.prank(deployer); + EscrowBatch unfunded = new EscrowBatch(address(token), _batch(), 0); + + vm.startPrank(executor); + token.approve(address(unfunded), PAYMENT_AMOUNT + REWARD_AMOUNT); + vm.expectRevert(EscrowBatch.OnlyDeployer.selector); + unfunded.fund(REWARD_AMOUNT); + vm.stopPrank(); + } + + function testConstructorFundsNativeAsset() public { + IEscrowBatch.BatchTransfer[] memory transfers = new IEscrowBatch.BatchTransfer[](1); + transfers[0] = IEscrowBatch.BatchTransfer({ + assetType: IEscrowBatch.AssetType.NATIVE, + asset: address(0), + recipient: recipientA, + amount: 1 ether, + rewardWeight: 1 ether + }); + + vm.startPrank(deployer); + vm.deal(deployer, 1 ether); + token.approve(vm.computeCreateAddress(deployer, vm.getNonce(deployer)), REWARD_AMOUNT); + EscrowBatch nativeEscrow = new EscrowBatch{value: 1 ether}(address(token), transfers, REWARD_AMOUNT); + vm.stopPrank(); + + assertTrue(nativeEscrow.funded()); + assertEq(nativeEscrow.currentAssetPaymentAmount(address(0)), 1 ether); + assertEq(address(nativeEscrow).balance, 1 ether); + assertEq(nativeEscrow.totalRewardWeight(), 1 ether); + } + + function testBond() public { + _bondExecutor(_fullIndexes(), BOND_AMOUNT); + + ( + uint256 bondAmount, + uint256 deadline, + uint256 startBlock, + uint256 reservedPaymentAmount, + uint256 reservedCount + ) = escrow.reservations(executor); + + assertEq(bondAmount, BOND_AMOUNT); + assertEq(deadline, block.timestamp + 5 minutes); + assertEq(startBlock, block.number); + assertEq(reservedPaymentAmount, PAYMENT_AMOUNT); + assertEq(reservedCount, 2); + assertEq(escrow.activeReservationCount(), 1); + assertEq(escrow.transferExecutor(0), executor); + assertEq(escrow.transferExecutor(1), executor); + assertEq(escrow.reservedTransferCount(executor), 2); + assertEq(escrow.reservedTransferIndex(executor, 0), 0); + assertEq(escrow.reservedTransferIndex(executor, 1), 1); + assertTrue(escrow.is_bonded()); + } + + function testMultipleExecutorsCanReserveDisjointTransfers() public { + _bondExecutor(_singleIndex(0), BOND_AMOUNT); + + vm.startPrank(other); + token.approve(address(escrow), BOND_AMOUNT); + escrow.bond(_singleIndex(1), BOND_AMOUNT); + vm.stopPrank(); + + assertEq(escrow.activeReservationCount(), 2); + assertEq(escrow.transferExecutor(0), executor); + assertEq(escrow.transferExecutor(1), other); + } + + function testBondRejectsOverlap() public { + _bondExecutor(_singleIndex(0), BOND_AMOUNT); + + vm.startPrank(other); + token.approve(address(escrow), BOND_AMOUNT); + vm.expectRevert(EscrowBatch.TransferAlreadyReserved.selector); + escrow.bond(_singleIndex(0), BOND_AMOUNT); + vm.stopPrank(); + } + + function testBondRejectsDuplicateTransferIndex() public { + uint256[] memory duplicateIndexes = new uint256[](2); + duplicateIndexes[0] = 0; + duplicateIndexes[1] = 0; + + vm.startPrank(executor); + token.approve(address(escrow), BOND_AMOUNT); + vm.expectRevert(EscrowBatch.DuplicateTransferIndex.selector); + escrow.bond(duplicateIndexes, BOND_AMOUNT); + vm.stopPrank(); + } + + function testBondRejectsInsufficientBondForSubset() public { + vm.startPrank(executor); + token.approve(address(escrow), 1); + vm.expectRevert(EscrowBatch.InsufficientBond.selector); + escrow.bond(_singleIndex(1), 1); + vm.stopPrank(); + } + + function testBondAfterDeadlinePassed() public { + _bondExecutor(_fullIndexes(), BOND_AMOUNT); + + vm.warp(block.timestamp + 6 minutes); + + uint256 updatedReward = REWARD_AMOUNT + BOND_AMOUNT; + uint256 newBondAmount = updatedReward / 2; + + vm.startPrank(other); + token.approve(address(escrow), newBondAmount); + escrow.bond(_fullIndexes(), newBondAmount); + vm.stopPrank(); + + (uint256 otherBondAmount, uint256 deadline, uint256 startBlock,, uint256 reservedCount) = + escrow.reservations(other); + + assertEq(otherBondAmount, newBondAmount); + assertEq(deadline, block.timestamp + 5 minutes); + assertEq(startBlock, block.number); + assertEq(reservedCount, 2); + assertEq(escrow.currentRewardAmount(), updatedReward); + assertEq(escrow.totalBondsDeposited(), BOND_AMOUNT); + assertEq(escrow.activeReservationCount(), 1); + assertEq(escrow.transferExecutor(0), other); + assertEq(escrow.transferExecutor(1), other); + } + + function testCollectRejectsInvalidBatchProofLength() public { + _bondExecutor(_fullIndexes(), BOND_AMOUNT); + + uint256[] memory transferIndexes = _singleIndex(0); + uint256[] memory logIndexes = new uint256[](2); + + vm.prank(executor); + vm.expectRevert(EscrowBatch.InvalidBatchProofLength.selector); + escrow.collect(_proofs(transferIndexes, logIndexes)); + } + + function testCollectRejectsDuplicateLogIndex() public { + _bondExecutor(_fullIndexes(), BOND_AMOUNT); + + uint256[] memory logIndexes = new uint256[](2); + logIndexes[0] = 3; + logIndexes[1] = 3; + + vm.prank(executor); + vm.expectRevert(EscrowBatch.DuplicateLogIndex.selector); + escrow.collect(_proofs(_fullIndexes(), logIndexes)); + } + + function testCollectRejectsDuplicateTransferIndex() public { + _bondExecutor(_fullIndexes(), BOND_AMOUNT); + + uint256[] memory duplicateIndexes = new uint256[](2); + duplicateIndexes[0] = 0; + duplicateIndexes[1] = 0; + uint256[] memory logIndexes = new uint256[](2); + logIndexes[0] = 0; + logIndexes[1] = 1; + + vm.prank(executor); + vm.expectRevert(EscrowBatch.DuplicateTransferIndex.selector); + escrow.collect(_proofs(duplicateIndexes, logIndexes)); + } + + function testCollectRejectsUnreservedTransfer() public { + _bondExecutor(_singleIndex(0), BOND_AMOUNT); + + vm.prank(executor); + vm.expectRevert(EscrowBatch.TransferNotReserved.selector); + escrow.collect(_proofs(_singleIndex(1), _singleIndex(0))); + } + + function testCollectRequiresBondedExecutor() public { + IEscrowBatch.BatchProof[] memory proofs = new IEscrowBatch.BatchProof[](0); + + vm.prank(other); + vm.expectRevert(EscrowBatch.OnlyBondedExecutor.selector); + escrow.collect(proofs); + } + + function testCancelAndWithdraw() public { + uint256 initialBalance = token.balanceOf(deployer); + + vm.prank(deployer); + escrow.cancelAndWithdraw(); + + assertTrue(escrow.cancellationRequest()); + assertFalse(escrow.funded()); + assertEq(token.balanceOf(deployer), initialBalance + PAYMENT_AMOUNT + REWARD_AMOUNT); + } + + function testCancelAndWithdrawRejectsActiveReservation() public { + _bondExecutor(_singleIndex(0), BOND_AMOUNT); + + vm.prank(deployer); + vm.expectRevert(EscrowBatch.BondActive.selector); + escrow.cancelAndWithdraw(); + } + + function testCancelAndWithdrawAfterExpiredReservation() public { + _bondExecutor(_singleIndex(0), BOND_AMOUNT); + vm.warp(block.timestamp + 6 minutes); + + uint256 initialBalance = token.balanceOf(deployer); + + vm.prank(deployer); + escrow.cancelAndWithdraw(); + + assertFalse(escrow.funded()); + assertEq(escrow.activeReservationCount(), 0); + assertEq(escrow.totalBondsDeposited(), BOND_AMOUNT); + assertEq(token.balanceOf(deployer), initialBalance + PAYMENT_AMOUNT + REWARD_AMOUNT + BOND_AMOUNT); + } + + function testFundAfterCancelRejected() public { + vm.prank(deployer); + escrow.cancelAndWithdraw(); + + vm.startPrank(deployer); + token.approve(address(escrow), PAYMENT_AMOUNT + REWARD_AMOUNT); + vm.expectRevert(EscrowBatch.AlreadyFunded.selector); + escrow.fund(REWARD_AMOUNT); + vm.stopPrank(); + } + + function _bondExecutor(uint256[] memory transferIndexes, uint256 bondAmount) internal { + vm.startPrank(executor); + token.approve(address(escrow), bondAmount); + escrow.bond(transferIndexes, bondAmount); + vm.stopPrank(); + } + + function _batch() internal view returns (IEscrowBatch.BatchTransfer[] memory transfers) { + transfers = new IEscrowBatch.BatchTransfer[](2); + transfers[0] = IEscrowBatch.BatchTransfer({ + assetType: IEscrowBatch.AssetType.ERC20, + asset: address(token), + recipient: recipientA, + amount: AMOUNT_A, + rewardWeight: AMOUNT_A + }); + transfers[1] = IEscrowBatch.BatchTransfer({ + assetType: IEscrowBatch.AssetType.ERC20, + asset: address(token), + recipient: recipientB, + amount: AMOUNT_B, + rewardWeight: AMOUNT_B + }); + } + + function _fullIndexes() internal pure returns (uint256[] memory indexes) { + indexes = new uint256[](2); + indexes[0] = 0; + indexes[1] = 1; + } + + function _singleIndex(uint256 index) internal pure returns (uint256[] memory indexes) { + indexes = new uint256[](1); + indexes[0] = index; + } + + function _proofs(uint256[] memory transferIndexes, uint256[] memory logIndexes) + internal + view + returns (IEscrowBatch.BatchProof[] memory proofs) + { + proofs = new IEscrowBatch.BatchProof[](1); + proofs[0] = IEscrowBatch.BatchProof({ + proofType: IEscrowBatch.AssetType.ERC20, + receiptProof: _emptyProof(), + transactionRlp: hex"", + txProofNodes: hex"", + transferIndexes: transferIndexes, + logIndexes: logIndexes + }); + } + + function _emptyProof() internal view returns (IEscrowBatch.BatchReceiptProof memory proof) { + proof = IEscrowBatch.BatchReceiptProof({ + blockHeader: hex"", + receiptRlp: hex"", + proofNodes: hex"", + receiptPath: hex"01", + targetBlockNumber: block.number + }); + } +} diff --git a/test/Tempo.t.sol b/test/Tempo.t.sol index 91933a6..993b343 100644 --- a/test/Tempo.t.sol +++ b/test/Tempo.t.sol @@ -2,7 +2,9 @@ pragma solidity ^0.8.30; import {Test, console} from "forge-std/Test.sol"; +import {EscrowBatch} from "../src/EscrowBatch.sol"; import {EscrowERC20, IERC20} from "../src/EscrowERC20.sol"; +import {IEscrowBatch} from "../src/IEscrowBatch.sol"; import {ReceiptValidator} from "../src/ReceiptValidator.sol"; contract ReceiptValidatorWrapper { @@ -121,4 +123,167 @@ contract TempoTest is Test { BLOCK_NUMBER ); } + + function testEndToEndBatchProof() public { + address deployer = makeAddr("deployer"); + + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.send.selector), abi.encode(true)); + + IEscrowBatch.BatchTransfer[] memory transfers = new IEscrowBatch.BatchTransfer[](2); + transfers[0] = _erc20BatchTransfer(TO_ADDRESS, AMOUNT); + transfers[1] = _erc20BatchTransfer(FEE_RECIPIENT, FEE_AMOUNT); + + vm.prank(deployer); + EscrowBatch escrow = new EscrowBatch(TOKEN, transfers, 500e18); + + uint256[] memory transferIndexes = new uint256[](2); + transferIndexes[0] = 0; + transferIndexes[1] = 1; + + vm.prank(FROM_ADDRESS); + escrow.bond(transferIndexes, 250e18); + + vm.roll(BLOCK_NUMBER + 10); + vm.setBlockhash(BLOCK_NUMBER, BLOCK_HASH); + + IEscrowBatch.BatchReceiptProof memory proof = IEscrowBatch.BatchReceiptProof({ + blockHeader: BLOCK_HEADER, + receiptRlp: RECEIPT_RLP, + proofNodes: PROOF_NODES, + receiptPath: RECEIPT_PATH, + targetBlockNumber: BLOCK_NUMBER + }); + uint256[] memory logIndexes = new uint256[](2); + logIndexes[0] = 0; + logIndexes[1] = 1; + IEscrowBatch.BatchProof[] memory proofs = new IEscrowBatch.BatchProof[](1); + proofs[0] = _erc20BatchProof(proof, transferIndexes, logIndexes); + + vm.prank(FROM_ADDRESS); + escrow.collect(proofs); + + assertFalse(escrow.funded()); + assertEq(escrow.currentPaymentAmount(), 0); + assertEq(escrow.currentRewardAmount(), 0); + assertEq(escrow.activeReservationCount(), 0); + assertEq(escrow.completedTransferCount(), 2); + } + + function testRejectsDuplicateReceiptLogAcrossBatchProofs() public { + address deployer = makeAddr("deployer"); + + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.send.selector), abi.encode(true)); + + IEscrowBatch.BatchTransfer[] memory transfers = new IEscrowBatch.BatchTransfer[](2); + transfers[0] = _erc20BatchTransfer(TO_ADDRESS, AMOUNT); + transfers[1] = _erc20BatchTransfer(TO_ADDRESS, AMOUNT); + + vm.prank(deployer); + EscrowBatch escrow = new EscrowBatch(TOKEN, transfers, 500e18); + + uint256[] memory transferIndexes = new uint256[](2); + transferIndexes[0] = 0; + transferIndexes[1] = 1; + + vm.prank(FROM_ADDRESS); + escrow.bond(transferIndexes, 250e18); + + vm.roll(BLOCK_NUMBER + 10); + vm.setBlockhash(BLOCK_NUMBER, BLOCK_HASH); + + IEscrowBatch.BatchReceiptProof memory proof = IEscrowBatch.BatchReceiptProof({ + blockHeader: BLOCK_HEADER, + receiptRlp: RECEIPT_RLP, + proofNodes: PROOF_NODES, + receiptPath: RECEIPT_PATH, + targetBlockNumber: BLOCK_NUMBER + }); + + uint256[] memory firstTransferIndexes = new uint256[](1); + firstTransferIndexes[0] = 0; + uint256[] memory secondTransferIndexes = new uint256[](1); + secondTransferIndexes[0] = 1; + uint256[] memory reusedLogIndexes = new uint256[](1); + reusedLogIndexes[0] = 0; + + IEscrowBatch.BatchProof[] memory proofs = new IEscrowBatch.BatchProof[](2); + proofs[0] = _erc20BatchProof(proof, firstTransferIndexes, reusedLogIndexes); + proofs[1] = _erc20BatchProof(proof, secondTransferIndexes, reusedLogIndexes); + + vm.prank(FROM_ADDRESS); + vm.expectRevert(EscrowBatch.DuplicateLogIndex.selector); + escrow.collect(proofs); + } + + function testRejectsProofBeforeReservation() public { + address deployer = makeAddr("deployer"); + + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); + vm.mockCall(TOKEN, abi.encodeWithSelector(IERC20.send.selector), abi.encode(true)); + + IEscrowBatch.BatchTransfer[] memory transfers = new IEscrowBatch.BatchTransfer[](1); + transfers[0] = _erc20BatchTransfer(TO_ADDRESS, AMOUNT); + + vm.prank(deployer); + EscrowBatch escrow = new EscrowBatch(TOKEN, transfers, 500e18); + + vm.roll(BLOCK_NUMBER + 10); + vm.setBlockhash(BLOCK_NUMBER, BLOCK_HASH); + + uint256[] memory transferIndexes = new uint256[](1); + transferIndexes[0] = 0; + + vm.prank(FROM_ADDRESS); + escrow.bond(transferIndexes, 250e18); + + IEscrowBatch.BatchReceiptProof memory proof = IEscrowBatch.BatchReceiptProof({ + blockHeader: BLOCK_HEADER, + receiptRlp: RECEIPT_RLP, + proofNodes: PROOF_NODES, + receiptPath: RECEIPT_PATH, + targetBlockNumber: BLOCK_NUMBER + }); + uint256[] memory logIndexes = new uint256[](1); + logIndexes[0] = 0; + IEscrowBatch.BatchProof[] memory proofs = new IEscrowBatch.BatchProof[](1); + proofs[0] = _erc20BatchProof(proof, transferIndexes, logIndexes); + + vm.prank(FROM_ADDRESS); + vm.expectRevert(EscrowBatch.ProofBeforeReservation.selector); + escrow.collect(proofs); + } + + function _erc20BatchTransfer(address recipient, uint256 amount) + internal + pure + returns (IEscrowBatch.BatchTransfer memory) + { + return IEscrowBatch.BatchTransfer({ + assetType: IEscrowBatch.AssetType.ERC20, + asset: TOKEN, + recipient: recipient, + amount: amount, + rewardWeight: amount + }); + } + + function _erc20BatchProof( + IEscrowBatch.BatchReceiptProof memory receiptProof, + uint256[] memory transferIndexes, + uint256[] memory logIndexes + ) internal pure returns (IEscrowBatch.BatchProof memory) { + return IEscrowBatch.BatchProof({ + proofType: IEscrowBatch.AssetType.ERC20, + receiptProof: receiptProof, + transactionRlp: hex"", + txProofNodes: hex"", + transferIndexes: transferIndexes, + logIndexes: logIndexes + }); + } }