From dcdc59bc28908c4c35b052e5f8bf212ff203ca92 Mon Sep 17 00:00:00 2001 From: Alex Ni <12097569+nialexsan@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:27:30 -0500 Subject: [PATCH 1/7] univ3 tests wip --- cadence/tests/scripts/get_evm_code.cdc | 45 +++ cadence/tests/test_helpers.cdc | 274 +++++++++--------- .../transactions/create_and_store_pool.cdc | 30 ++ cadence/tests/univ3_connector_test.cdc | 56 ++++ cadence/transactions/moet/mint_moet.cdc | 2 +- 5 files changed, 277 insertions(+), 130 deletions(-) create mode 100644 cadence/tests/scripts/get_evm_code.cdc create mode 100644 cadence/tests/transactions/create_and_store_pool.cdc create mode 100644 cadence/tests/univ3_connector_test.cdc diff --git a/cadence/tests/scripts/get_evm_code.cdc b/cadence/tests/scripts/get_evm_code.cdc new file mode 100644 index 00000000..3662e30a --- /dev/null +++ b/cadence/tests/scripts/get_evm_code.cdc @@ -0,0 +1,45 @@ +import "EVM" + +// Pass an EVM address as a hex string like "0x805945998f912d461807865a3b778BacfC388759" +access(all) fun main(evmAddressHex: String): {String: String} { + // Parse the hex string into an EVM address + let evmAddr = EVM.addressFromString(evmAddressHex) // helper provided by the EVM contract + + // Runtime bytecode (what you see from eth_getCode) + let runtime: [UInt8] = evmAddr.code() + + // Optional: contract “creation code” isn’t stored on-chain; only runtime code exists after deployment. + + // Small helpers to pretty-print as hex + fun toHex(_ bytes: [UInt8]): String { + let table: [String] = [ + "00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f", + "10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f", + "20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f", + "30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f", + "40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f", + "50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f", + "60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f", + "70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f", + "80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f", + "90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f", + "a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af", + "b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf", + "c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf", + "d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df", + "e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef", + "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff" + ] + var s = "0x" + for b in bytes { + s = s.concat(table[Int(b)]) + } + return s + } + + return { + "address": evmAddressHex, + "hasCode": runtime.length > 0 ? "true" : "false", + "runtimeCodeHex": toHex(runtime) + } +} diff --git a/cadence/tests/test_helpers.cdc b/cadence/tests/test_helpers.cdc index bf6499e6..452a31da 100644 --- a/cadence/tests/test_helpers.cdc +++ b/cadence/tests/test_helpers.cdc @@ -7,6 +7,7 @@ import "FlowALP" access(all) let serviceAccount = Test.serviceAccount() access(all) let bridgeAccount = Test.getAccount(0x0000000000000007) +access(all) let deployerAccount = Test.getAccount(0x000000000000000a) /* --- Test execution helpers --- */ @@ -209,12 +210,12 @@ access(all) fun deployContracts() { name: "FlowVaultsStrategies", path: "../contracts/FlowVaultsStrategies.cdc", arguments: [ - "0x986Cb42b0557159431d48fE0A40073296414d410", - "0x92657b195e22b69E4779BBD09Fa3CD46F0CF8e39", - "0x8dd92c8d0C3b304255fF9D98ae59c3385F88360C", - "0xaCCF0c4EeD4438Ad31Cd340548f4211a465B6528", - [] as [String], - [] as [UInt32] + "0x986Cb42b0557159431d48fE0A40073296414d410", + "0x92657b195e22b69E4779BBD09Fa3CD46F0CF8e39", + "0x8dd92c8d0C3b304255fF9D98ae59c3385F88360C", + "0xaCCF0c4EeD4438Ad31Cd340548f4211a465B6528", + [] as [String], + [] as [UInt32] ] ) Test.expect(err, Test.beNil()) @@ -228,15 +229,14 @@ access(all) fun deployContracts() { Test.expect(err, Test.beNil()) setupBetaAccess() - setupPunchswap() } access(all) fun setupFlowALP(signer: Test.TestAccount) { let res = _executeTransaction("../transactions/flow-alp/create_and_store_pool.cdc", - [], - signer - ) + [], + signer +) } /* --- Script helpers */ @@ -279,11 +279,11 @@ fun getAutoBalancerCurrentValue(id: UInt64): UFix64? { access(all) fun getPositionDetails(pid: UInt64, beFailed: Bool): FlowALP.PositionDetails { let res = _executeScript("../scripts/flow-alp/position_details.cdc", - [pid] - ) - Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) + [pid] +) +Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) - return res.returnValue as! FlowALP.PositionDetails +return res.returnValue as! FlowALP.PositionDetails } access(all) @@ -379,10 +379,10 @@ fun mintYield(signer: Test.TestAccount, to: Address, amount: UFix64, beFailed: B access(all) fun addStrategyComposer(signer: Test.TestAccount, strategyIdentifier: String, composerIdentifier: String, issuerStoragePath: StoragePath, beFailed: Bool) { let addRes = _executeTransaction("../transactions/flow-vaults/admin/add_strategy_composer.cdc", - [ strategyIdentifier, composerIdentifier, issuerStoragePath ], - signer - ) - Test.expect(addRes, beFailed ? Test.beFailed() : Test.beSucceeded()) + [ strategyIdentifier, composerIdentifier, issuerStoragePath ], + signer +) +Test.expect(addRes, beFailed ? Test.beFailed() : Test.beSucceeded()) } access(all) @@ -394,10 +394,10 @@ fun createTide( beFailed: Bool ) { let res = _executeTransaction("../transactions/flow-vaults/create_tide.cdc", - [ strategyIdentifier, vaultIdentifier, amount ], - signer - ) - Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) + [ strategyIdentifier, vaultIdentifier, amount ], + signer +) +Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) } access(all) @@ -530,104 +530,104 @@ access(all) let erc721DeployerBytecode = "608060405234801561001057600080fd5b5033 access(all) let compiledFactoryBytecode = "608060405234801561001057600080fd5b50338061003757604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61004081610046565b50610096565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6114b9806100a56000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063aff51c3e11610097578063daa09e5411610066578063daa09e5414610216578063db6d56cd14610229578063dfe1ac361461023c578063f2fde38b1461024f57600080fd5b8063aff51c3e146101bd578063b3d5dbdc146101d0578063cc435bf3146101f0578063d974d2381461020357600080fd5b806366cd5014116100d357806366cd50141461017e578063715018a61461019157806383843c9e146101995780638da5cb5b146101ac57600080fd5b806304433bbc1461010557806314902ad314610135578063263e0c1b1461014a5780635ab1bd531461016d575b600080fd5b610118610113366004611101565b610262565b6040516001600160a01b0390911681526020015b60405180910390f35b610148610143366004611153565b6102da565b005b61015d610158366004611153565b610347565b604051901515815260200161012c565b6001546001600160a01b0316610118565b61011861018c366004611101565b610737565b610148610768565b6101486101a7366004611101565b6107d6565b6000546001600160a01b0316610118565b6101486101cb366004611170565b6108eb565b6101e36101de366004611153565b610a20565b60405161012c9190611212565b61015d6101fe366004611153565b610a93565b610148610211366004611170565b610ab3565b61015d610224366004611153565b610ba0565b610118610237366004611225565b610c16565b61015d61024a366004611153565b610ceb565b61014861025d366004611153565b610d5a565b600154604051630110ceef60e21b81526000916001600160a01b0316906304433bbc90610293908590600401611212565b602060405180830381865afa1580156102b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d4919061131a565b92915050565b6102e2610d98565b6102eb81610dc7565b6001546040516001600160a01b038084169216907f61dad6e94cd5c0b65c9265246706a09bd0d11d5330f3e6b659d328151a664e8c90600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b1790529051600091829182916001600160a01b0386169161038d9190611337565b600060405180830381855afa9150503d80600081146103c8576040519150601f19603f3d011682016040523d82523d6000602084013e6103cd565b606091505b50915091508115806103de57508051155b156103ed575060009392505050565b604051600060248201526001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b03166370a0823160e01b1790525161043a9190611337565b600060405180830381855afa9150503d8060008114610475576040519150601f19603f3d011682016040523d82523d6000602084013e61047a565b606091505b50909250905081158061048c57508051155b1561049b575060009392505050565b60405160006024820181905260448201526001600160a01b0385169060640160408051601f198184030181529181526020820180516001600160e01b0316636eb1769f60e11b179052516104ef9190611337565b600060405180830381855afa9150503d806000811461052a576040519150601f19603f3d011682016040523d82523d6000602084013e61052f565b606091505b50909250905081158061054157508051155b15610550575060009392505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516001600160a01b0386169161058e91611337565b600060405180830381855afa9150503d80600081146105c9576040519150601f19603f3d011682016040523d82523d6000602084013e6105ce565b606091505b5090925090508115806105e057508051155b156105ef575060009392505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516001600160a01b0386169161062d91611337565b600060405180830381855afa9150503d8060008114610668576040519150601f19603f3d011682016040523d82523d6000602084013e61066d565b606091505b50909250905081158061067f57508051155b1561068e575060009392505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516001600160a01b038616916106cc91611337565b600060405180830381855afa9150503d8060008114610707576040519150601f19603f3d011682016040523d82523d6000602084013e61070c565b606091505b50909250905081158061071e57508051155b1561072d575060009392505050565b5060019392505050565b60006002826040516107499190611337565b908152604051908190036020019020546001600160a01b031692915050565b610770610d98565b60405162461bcd60e51b815260206004820152603060248201527f466c6f77427269646765466163746f72793a204f776e6572736869702063616e60448201526f1b9bdd081899481c995b9bdd5b98d95960821b60648201526084015b60405180910390fd5b6107de610d98565b60006002826040516107f09190611337565b908152604051908190036020019020546001600160a01b031690508061086b5760405162461bcd60e51b815260206004820152602a60248201527f466c6f77427269646765466163746f72793a204465706c6f796572206e6f74206044820152691c9959da5cdd195c995960b21b60648201526084016107cd565b60028260405161087b9190611337565b90815260405190819003602001812080546001600160a01b03191690556108a3908390611337565b6040519081900381206001600160a01b0383168252907f03c7566b5f4959b890c1a6d38f39df053c6737c9965d9c0ddf612c86100a838b906020015b60405180910390a25050565b6108f3610d98565b6108fc81610e39565b60006001600160a01b03166002836040516109179190611337565b908152604051908190036020019020546001600160a01b0316146109945760405162461bcd60e51b815260206004820152602e60248201527f466c6f77427269646765466163746f72793a204465706c6f79657220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016107cd565b806002836040516109a59190611337565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b0319909316929092179091556109e0908390611337565b6040519081900381206001600160a01b0383168252907fc0c30f085f0b1397c8bf23f8b851b63b33e13d11832b8320a37fca1c07dcb40f906020016108df565b600154604051632cf576f760e21b81526001600160a01b038381166004830152606092169063b3d5dbdc90602401600060405180830381865afa158015610a6b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102d49190810190611353565b6000610a9e82610ba0565b1515610aa983610347565b1515141592915050565b610abb610d98565b610ac481610e39565b6000600283604051610ad69190611337565b908152604051908190036020019020546001600160a01b0316905080610b0557610b0083836108eb565b505050565b81600284604051610b169190611337565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b031990931692909217909155610b51908490611337565b604080519182900382206001600160a01b03808516845285166020840152917f848576f8a081c5af60d89f0215c8af528186670eefd6349c05014d5b22688646910160405180910390a2505050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526000906001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015610c0a575060408051601f3d908101601f19168201909252610c07918101906113ca565b60015b6102d457506000919050565b6000610c20610d98565b6000600288604051610c329190611337565b908152604051908190036020019020546001600160a01b03169050610c5681610e39565b60405163476d399760e01b815281906000906001600160a01b0383169063476d399790610c8f908c908c908c908c908c906004016113ec565b6020604051808303816000875af1158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd2919061131a565b9050610cde8682610eab565b9998505050505050505050565b60015460405163a6de610560e01b81526001600160a01b038381166004830152600092169063a6de610590602401602060405180830381865afa158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d491906113ca565b610d62610d98565b6001600160a01b038116610d8c57604051631e4fbdf760e01b8152600060048201526024016107cd565b610d9581610f16565b50565b6000546001600160a01b03163314610dc55760405163118cdaa760e01b81523360048201526024016107cd565b565b610dd081610f66565b610de18163976998cb60e01b610fbc565b610d955760405162461bcd60e51b815260206004820152602360248201527f466c6f77427269646765466163746f72793a20496e76616c696420726567697360448201526274727960e81b60648201526084016107cd565b610e4281610f66565b610e538163476d399760e01b610fbc565b610d955760405162461bcd60e51b815260206004820152602360248201527f466c6f77427269646765466163746f72793a20496e76616c6964206465706c6f6044820152623cb2b960e91b60648201526084016107cd565b60015460405163522791d160e01b81526001600160a01b0390911690819063522791d190610edf9086908690600401611459565b600060405180830381600087803b158015610ef957600080fd5b505af1158015610f0d573d6000803e3d6000fd5b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116610d955760405162461bcd60e51b815260206004820152601f60248201527f466c6f77427269646765466163746f72793a205a65726f20616464726573730060448201526064016107cd565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a790602401602060405180830381865afa925050508015611029575060408051601f3d908101601f19168201909252611026918101906113ca565b60015b611035575060006102d4565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561107b5761107b61103c565b604052919050565b600067ffffffffffffffff82111561109d5761109d61103c565b50601f01601f191660200190565b600082601f8301126110bc57600080fd5b81356110cf6110ca82611083565b611052565b8181528460208386010111156110e457600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561111357600080fd5b813567ffffffffffffffff81111561112a57600080fd5b611136848285016110ab565b949350505050565b6001600160a01b0381168114610d9557600080fd5b60006020828403121561116557600080fd5b81356110358161113e565b6000806040838503121561118357600080fd5b823567ffffffffffffffff81111561119a57600080fd5b6111a6858286016110ab565b92505060208301356111b78161113e565b809150509250929050565b60005b838110156111dd5781810151838201526020016111c5565b50506000910152565b600081518084526111fe8160208601602086016111c2565b601f01601f19169290920160200192915050565b60208152600061103560208301846111e6565b60008060008060008060c0878903121561123e57600080fd5b863567ffffffffffffffff8082111561125657600080fd5b6112628a838b016110ab565b9750602089013591508082111561127857600080fd5b6112848a838b016110ab565b9650604089013591508082111561129a57600080fd5b6112a68a838b016110ab565b955060608901359150808211156112bc57600080fd5b6112c88a838b016110ab565b945060808901359150808211156112de57600080fd5b6112ea8a838b016110ab565b935060a089013591508082111561130057600080fd5b5061130d89828a016110ab565b9150509295509295509295565b60006020828403121561132c57600080fd5b81516110358161113e565b600082516113498184602087016111c2565b9190910192915050565b60006020828403121561136557600080fd5b815167ffffffffffffffff81111561137c57600080fd5b8201601f8101841361138d57600080fd5b805161139b6110ca82611083565b8181528560208385010111156113b057600080fd5b6113c18260208301602086016111c2565b95945050505050565b6000602082840312156113dc57600080fd5b8151801515811461103557600080fd5b60a0815260006113ff60a08301886111e6565b828103602084015261141181886111e6565b9050828103604084015261142581876111e6565b9050828103606084015261143981866111e6565b9050828103608084015261144d81856111e6565b98975050505050505050565b60408152600061146c60408301856111e6565b905060018060a01b0383166020830152939250505056fea26469706673582212200af9d80b662861a856536a56fb3a4afaa201b1b9be2839aa487140e647786f8f64736f6c63430008180033" access(all) let bridgedNFTCodeChunks = [ - "696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d4272696467654e46544d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467654e4654457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d4e46542066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e6174697665204e46547320627269646765642066726f6d20466c6f772045564d20746f20466c6f772e0a2f2f2f2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e2045524337323120616b610a2f2f2f20616e204e46542920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c2074686520455243373231206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e642061206e6577204e4654206973206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206c6f636b65640a2f2f2f20696e204e465420657363726f7720616e642074686520455243373231206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e636520746f6b656e206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d204e465420616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", - "203a204943726f7373564d2c204943726f7373564d41737365742c204945564d4272696467654e46544d696e7465722c204e6f6e46756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d4e4654436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f2052657461696e206120436f6c6c656374696f6e20746f207265666572656e6365207768656e207265736f6c76696e6720436f6c6c656374696f6e204d657461646174610a202020206163636573732873656c6629206c657420636f6c6c656374696f6e3a2040436f6c6c656374696f6e0a202020202f2f2f204d617070696e67206f6620746f6b656e205552497320696e6465786564206f6e207468656972204552433732312049442e205468697320776f756c64206e6f74206e6f726d616c6c792062652072657461696e65642077697468696e206120436164656e6365204e46540a202020202f2f2f20636f6e74726163742c206275742073696e6365204e4654206d65746164617461206d6179206265207570646174656420696e2045564d2c20697427732072657461696e6564206865726520736f207468617420746865206272696467652063616e207570646174650a202020202f2f2f20697420616761696e73742074686520736f757263652045524337323120636f6e7472616374207768696368206973207472656174656420617320746865204e4654277320736f75726365206f662074727574682e0a2020202061636365737328616c6c29206c657420746f6b656e555249733a207b55496e743235363a20537472696e677d0a0a202020202f2f2f20546865204e4654207265736f7572636520726570726573656e74696e672074686520627269646765642045524337323120746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365204e4654203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d4e46542e45564d4e4654207b0a20202020202020202f2f2f2054686520436164656e6365204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742069643a2055496e7436340a20202020202020202f2f2f2054686520455243373231204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742065766d49443a2055496e743235360a20202020202020202f2f2f204164646974696f6e616c206f6e636861696e206d657461646174610a202020202020202061636365737328616c6c29206c6574206d657461646174613a207b537472696e673a20416e795374727563747d0a0a2020202020202020696e6974280a20202020202020202020202065766d49443a2055496e743235362c0a2020202020202020202020206d657461646174613a207b537472696e673a20416e795374727563747d0a202020202020202029207b0a20202020202020202020202073656c662e6964203d2073656c662e757569640a20202020202020202020202073656c662e65766d4944203d2065766d49440a20202020202020202020202073656c662e6d65746164617461203d206d657461646174610a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320746865206d65746164617461207669657720747970657320737570706f727465642062792074686973204e46540a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e205b0a20202020202020202020202020202020547970653c4d6574616461746156696577732e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e53657269616c3e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a2020202020202020202020205d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", - "2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", - "2e73796d626f6c0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20746f6b656e55524928293a20537472696e67207b0a20202020202020202020202072657475726e20", - "2e746f6b656e555249735b73656c662e65766d49445d203f3f2022220a20202020202020207d0a0a20202020202020202f2f2f205265736f6c7665732061206d65746164617461207669657720666f722074686973204e46540a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a2020202020202020202020207377697463682076696577207b0a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e446973706c61793e28293a0a20202020202020202020202020202020202020206c657420636f6e7472616374526566203d20", - "2e626f72726f7754686973436f6e747261637428290a202020202020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c4d6574616461746156696577732e446973706c61793e2829290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e53657269616c3e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e53657269616c280a20202020202020202020202020202020202020202020202073656c662e69640a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020202020202072657475726e20", - "2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020202020202072657475726e20", - "2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a2020202020202020202020202020202020202020202020206e616d653a2073656c662e6765744e616d6528292c0a20202020202020202020202020202020202020202020202073796d626f6c3a2073656c662e67657453796d626f6c28292c0a2020202020202020202020202020202020202020202020207572693a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e746f6b656e5552492829290a2020202020202020202020202020202020202020290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f207075626c69632066756e6374696f6e207468617420616e796f6e652063616e2063616c6c20746f206372656174652061206e657720656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202072657475726e203c2d20", - "2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a2073656c662e676574547970652829290a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d4e465420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e46540a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", - "2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a202020207d0a0a202020202f2f2f2054686973207265736f7572636520686f6c6473206173736f636961746564204e4654732c20616e642073657276657320717565726965732061626f75742073746f726564204e4654730a2020202061636365737328616c6c29207265736f7572636520436f6c6c656374696f6e203a2043726f7373564d4e46542e45564d4e4654436f6c6c656374696f6e207b0a20202020202020202f2f2f2064696374696f6e617279206f66204e465420636f6e666f726d696e6720746f6b656e7320696e6465786564206f6e2074686569722049440a202020202020202061636365737328616c6c2920766172206f776e65644e4654733a20407b55496e7436343a207b4e6f6e46756e6769626c65546f6b656e2e4e46547d7d0a20202020202020202f2f2f204d617070696e67206f662045564d2049447320746f20466c6f77204e4654204944730a202020202020202061636365737328636f6e747261637429206c65742065766d4944546f466c6f7749443a207b55496e743235363a2055496e7436347d0a0a202020202020202061636365737328616c6c29207661722073746f72616765506174683a2053746f72616765506174680a202020202020202061636365737328616c6c2920766172207075626c6963506174683a205075626c6963506174680a0a2020202020202020696e6974202829207b0a20202020202020202020202073656c662e6f776e65644e465473203c2d207b7d0a20202020202020202020202073656c662e65766d4944546f466c6f774944203d207b7d0a2020202020202020202020206c657420636f6c6c656374696f6e44617461203d20", - "2e7265736f6c7665436f6e747261637456696577280a20202020202020202020202020202020202020207265736f75726365547970653a20547970653c40", - "2e4e46543e28292c0a202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a202020202020202020202020202020202920617321204d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613f0a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f74207265736f6c76652074686520636f6c6c656374696f6e2064617461207669657720666f7220746865204e465420636f6c6c656374696f6e22290a20202020202020202020202073656c662e73746f7261676550617468203d20636f6c6c656374696f6e446174612e73746f72616765506174680a20202020202020202020202073656c662e7075626c696350617468203d20636f6c6c656374696f6e446174612e7075626c6963506174680a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", - "2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", - "2e73796d626f6c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732061206c697374206f66204e46542074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465644e4654547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b20547970653c40", - "2e4e46543e28293a2074727565207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732077686574686572206f72206e6f742074686520676976656e20747970652069732061636365707465642062792074686520636f6c6c656374696f6e0a20202020202020202f2f2f204120636f6c6c656374696f6e20746861742063616e2061636365707420616e7920747970652073686f756c64206a7573742072657475726e20747275652062792064656661756c740a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465644e46545479706528747970653a2054797065293a20426f6f6c207b0a202020202020202020202072657475726e2074797065203d3d20547970653c40", - "2e4e46543e28290a20202020202020207d0a0a20202020202020202f2f2f2052656d6f76657320616e204e46542066726f6d2074686520636f6c6c656374696f6e20616e64206d6f76657320697420746f207468652063616c6c65720a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728776974686472617749443a2055496e743634293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a2020202020202020202020206c657420746f6b656e203c2d2073656c662e6f776e65644e4654732e72656d6f7665286b65793a2077697468647261774944290a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642049442066726f6d2074686520636f6c6c656374696f6e22290a0a20202020202020202020202072657475726e203c2d746f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2057697468647261777320616e204e46542066726f6d2074686520636f6c6c656374696f6e206279206974732045564d2049440a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e207769746864726177427945564d4944285f2069643a2055496e74323536293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a20202020202020202020202072657475726e203c2d2073656c662e776974686472617728776974686472617749443a200a2020202020202020202020202020202073656c662e676574436164656e636549442866726f6d3a20696429203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642045564d2049442066726f6d2074686520636f6c6c656374696f6e22290a202020202020202020202020290a20202020202020207d0a0a20202020202020202f2f2f205474616b65732061204e465420616e64206164647320697420746f2074686520636f6c6c656374696f6e732064696374696f6e61727920616e6420616464732074686520494420746f207468652065766d4944546f466c6f774944206d617070696e670a202020202020202061636365737328616c6c292066756e206465706f73697428746f6b656e3a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d29207b0a2020202020202020202020206c657420746f6b656e203c2d20746f6b656e206173212040", - "2e4e46540a0a2020202020202020202020202f2f2061646420746865206e657720746f6b656e20746f207468652064696374696f6e6172792077686963682072656d6f76657320746865206f6c64206f6e650a20202020202020202020202073656c662e65766d4944546f466c6f7749445b746f6b656e2e65766d49445d203d20746f6b656e2e69640a2020202020202020202020206c6574206f6c64546f6b656e203c2d2073656c662e6f776e65644e4654735b746f6b656e2e69645d203c2d20746f6b656e0a0a20202020202020202020202064657374726f79206f6c64546f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657449447328293a205b55496e7436345d207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652045564d2049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49447328293a205b55496e743235365d207b0a20202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749442e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520436164656e6365204e46542e696420666f722074686520676976656e2045564d204e46542049442069662069742065786973747320696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e20676574436164656e636549442866726f6d2065766d49443a2055496e74323536293a2055496e7436343f207b0a20202020202020202020202069662073656c662e65766d4944546f466c6f7749445b65766d49445d20213d206e696c207b0a2020202020202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749445b65766d49445d0a2020202020202020202020207d20656c73652069662065766d4944203c2055496e743235362855496e7436342e6d6178292026262073656c662e626f72726f774e46542855496e7436342865766d4944292920213d206e696c207b0a2020202020202020202020202020202072657475726e2055496e7436342865766d4944290a2020202020202020202020207d20656c7365207b0a2020202020202020202020202020202072657475726e206e696c0a2020202020202020202020207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e73207468652045564d204e4654204944206173736f63696174656420776974682074686520436164656e6365204e46542049442e2054686520676f616c20697320746f20726574726965766520746865204552433732312049442076616c75652e0a20202020202020202f2f2f20417320666172206173207468652062726964676520697320636f6e6365726e65642c20616e2045524337323120646566696e6564206279207468652062726964676520697320746865204e46542773204944206174207468652074696d65206f66206272696467696e670a20202020202020202f2f2f206f72207468652076616c7565206f6620746865204e46542e65766d494420696620697420696d706c656d656e7473207468652043726f7373564d4e46542e45564d4e465420696e74657266616365207768656e20627269646765642e0a20202020202020202f2f2f20466f6c6c6f77696e672074686973207061747465726e2c206966206c6f636b65642c20746865204e465420697320636865636b656420666f722045564d4e465420636f6e666f726d616e63652072657475726e696e67202e65766d494420696620736f2c0a20202020202020202f2f2f206f746865727769736520746865204e465427732049442069732072657475726e656420617320612055496e743235362073696e63652074686174277320686f77207468652062726964676520776f756c642068616e646c65206d696e74696e6720696e207468650a20202020202020202f2f2f20636f72726573706f6e64696e672045524337323120636f6e74726163742e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49442866726f6d20636164656e636549443a2055496e743634293a2055496e743235363f207b0a2020202020202020202020206966206c6574206e6674203d2073656c662e626f72726f774e465428636164656e6365494429207b0a202020202020202020202020202020206966206c65742065766d4e4654203d2043726f7373564d4e46542e67657445564d49442866726f6d3a206e667429207b0a202020202020202020202020202020202020202072657475726e2065766d4e46540a202020202020202020202020202020207d0a2020202020202020202020202020202072657475726e2055496e74323536286e66742e6964290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520636f6e747261637455524920666f7220746865204e465420636f6c6c656374696f6e20617320646566696e656420696e2074686520736f757263652045524337323120636f6e74726163742e204966206e6f6e65207761730a20202020202020202f2f2f20646566696e6564206174207468652074696d65206f66206272696467696e672c20616e20656d70747920737472696e672069732072657475726e65642e0a202020202020202061636365737328616c6c2920766965772066756e20636f6e747261637455524928293a20537472696e673f207b0a20202020202020202020202072657475726e20", - "2e636f6e74726163745552490a20202020202020207d0a0a20202020202020202f2f2f20476574732074686520616d6f756e74206f66204e4654732073746f72656420696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e206765744c656e67746828293a20496e74207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579732e6c656e6774680a20202020202020207d0a0a20202020202020202f2f2f205265747269657665732061207265666572656e636520746f20746865204e46542073746f72656420696e2074686520636f6c6c656374696f6e206279206974732049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f774e4654285f2069643a2055496e743634293a20267b4e6f6e46756e6769626c65546f6b656e2e4e46547d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d0a20202020202020207d0a0a20202020202020202f2f2f20426f72726f77207468652076696577207265736f6c76657220666f722074686520737065636966696564204e46542049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f77566965775265736f6c7665722869643a2055496e743634293a20267b566965775265736f6c7665722e5265736f6c7665727d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d20617320267b566965775265736f6c7665722e5265736f6c7665727d3f203f3f206e696c0a20202020202020207d0a0a20202020202020202f2f2f204372656174657320616e20656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d20207b0a20202020202020202020202072657475726e203c2d", - "2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", - "2e4e46543e2829290a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d707479436f6c6c656374696f6e206372656174657320616e20656d70747920436f6c6c656374696f6e20666f722074686520737065636966696564204e465420747970650a202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c657220736f207468617420746865792063616e206f776e204e4654730a2020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e286e6674547970653a2054797065293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a202020202020202072657475726e203c2d2063726561746520436f6c6c656374696f6e28290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e4654207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d4e4654436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e7465642062792061204e6f6e2046756e6769626c6520546f6b656e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c20626520757365642062790a202020202f2f2f202020202020202020646576656c6f7065727320746f206b6e6f7720776869636820706172616d6574657220746f207061737320746f20746865207265736f6c7665566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020206c6574206964656e746966696572203d2022", - "436f6c6c656374696f6e220a202020202020202020202020202020206c657420636f6c6c656374696f6e44617461203d204d6574616461746156696577732e4e4654436f6c6c656374696f6e44617461280a202020202020202020202020202020202020202073746f72616765506174683a2053746f7261676550617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963506174683a205075626c696350617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963436f6c6c656374696f6e3a20547970653c26", - "2e436f6c6c656374696f6e3e28292c0a20202020202020202020202020202020202020207075626c69634c696e6b6564547970653a20547970653c26", - "2e436f6c6c656374696f6e3e28292c0a2020202020202020202020202020202020202020637265617465456d707479436f6c6c656374696f6e46756e6374696f6e3a202866756e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d", - "2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", - "2e4e46543e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020202020202072657475726e20636f6c6c656374696f6e446174610a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020206c65742073656c66526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a2073656c665265662c20766965773a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e2829290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e74204e4654732066726f6d206272696467652d646566696e6564204e465420636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e206d696e744e46542869643a2055496e743235362c20746f6b656e5552493a20537472696e67293a20404e4654207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b69645d203d3d206e696c3a20224120746f6b656e20776974682074686520676976656e2045524337323120494420616c726561647920657869737473220a20202020202020207d0a202020202020202073656c662e746f6b656e555249735b69645d203d20746f6b656e5552490a202020202020202072657475726e203c2d637265617465204e4654280a20202020202020202020202065766d49443a2069642c0a2020202020202020202020206d657461646174613a207b0a20202020202020202020202020202020224272696467656420426c6f636b223a2067657443757272656e74426c6f636b28292e6865696768742c0a2020202020202020202020202020202022427269646765642054696d657374616d70223a2067657443757272656e74426c6f636b28292e74696d657374616d700a2020202020202020202020207d0a2020202020202020290a202020207d0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f207570646174652074686520555249206f662062726964676564204e4654732e205468697320617373756d65732074686174207468652045564d2d646566696e696e672070726f6a656374206d617920636f6e7461696e0a202020202f2f2f206c6f67696320286f6e636861696e206f72206f6666636861696e292077686963682075706461746573204e4654206d6574616461746120696e2074686520736f757263652045524337323120636f6e74726163742e204f6e206272696467696e672c20746865205552492063616e0a202020202f2f2f207468656e206265207570646174656420696e207468697320636f6e747261637420746f207265666c6563742074686520736f757263652045524337323120636f6e74726163742773206d657461646174612e0a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e20757064617465546f6b656e5552492865766d49443a2055496e743235362c206e65775552493a20537472696e6729207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d20213d206e696c3a20224e6f20746f6b656e20776974682074686520676976656e2045524337323120494420657869737473220a20202020202020207d0a202020202020202069662073656c662e746f6b656e555249735b65766d49445d20213d206e6577555249207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d203d206e65775552490a20202020202020207d0a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", - "2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d4e4654436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f6b656e55524973203d207b7d0a202020202020202073656c662e636f6c6c656374696f6e203c2d2063726561746520436f6c6c656374696f6e28290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", - "2e4e46543e28292c20776974683a2073656c662e65766d4e4654436f6e747261637441646472657373290a2020202020202020466c6f7745564d4272696467654e4654457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020666f72547970653a20547970653c40", - "2e4e46543e28292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020657263373231416464726573733a2073656c662e65766d4e4654436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" +"696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d4272696467654e46544d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467654e4654457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d4e46542066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e6174697665204e46547320627269646765642066726f6d20466c6f772045564d20746f20466c6f772e0a2f2f2f2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e2045524337323120616b610a2f2f2f20616e204e46542920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c2074686520455243373231206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e642061206e6577204e4654206973206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206c6f636b65640a2f2f2f20696e204e465420657363726f7720616e642074686520455243373231206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e636520746f6b656e206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d204e465420616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", +"203a204943726f7373564d2c204943726f7373564d41737365742c204945564d4272696467654e46544d696e7465722c204e6f6e46756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d4e4654436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f2052657461696e206120436f6c6c656374696f6e20746f207265666572656e6365207768656e207265736f6c76696e6720436f6c6c656374696f6e204d657461646174610a202020206163636573732873656c6629206c657420636f6c6c656374696f6e3a2040436f6c6c656374696f6e0a202020202f2f2f204d617070696e67206f6620746f6b656e205552497320696e6465786564206f6e207468656972204552433732312049442e205468697320776f756c64206e6f74206e6f726d616c6c792062652072657461696e65642077697468696e206120436164656e6365204e46540a202020202f2f2f20636f6e74726163742c206275742073696e6365204e4654206d65746164617461206d6179206265207570646174656420696e2045564d2c20697427732072657461696e6564206865726520736f207468617420746865206272696467652063616e207570646174650a202020202f2f2f20697420616761696e73742074686520736f757263652045524337323120636f6e7472616374207768696368206973207472656174656420617320746865204e4654277320736f75726365206f662074727574682e0a2020202061636365737328616c6c29206c657420746f6b656e555249733a207b55496e743235363a20537472696e677d0a0a202020202f2f2f20546865204e4654207265736f7572636520726570726573656e74696e672074686520627269646765642045524337323120746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365204e4654203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d4e46542e45564d4e4654207b0a20202020202020202f2f2f2054686520436164656e6365204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742069643a2055496e7436340a20202020202020202f2f2f2054686520455243373231204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742065766d49443a2055496e743235360a20202020202020202f2f2f204164646974696f6e616c206f6e636861696e206d657461646174610a202020202020202061636365737328616c6c29206c6574206d657461646174613a207b537472696e673a20416e795374727563747d0a0a2020202020202020696e6974280a20202020202020202020202065766d49443a2055496e743235362c0a2020202020202020202020206d657461646174613a207b537472696e673a20416e795374727563747d0a202020202020202029207b0a20202020202020202020202073656c662e6964203d2073656c662e757569640a20202020202020202020202073656c662e65766d4944203d2065766d49440a20202020202020202020202073656c662e6d65746164617461203d206d657461646174610a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320746865206d65746164617461207669657720747970657320737570706f727465642062792074686973204e46540a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e205b0a20202020202020202020202020202020547970653c4d6574616461746156696577732e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e53657269616c3e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a2020202020202020202020205d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", +"2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", +"2e73796d626f6c0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20746f6b656e55524928293a20537472696e67207b0a20202020202020202020202072657475726e20", +"2e746f6b656e555249735b73656c662e65766d49445d203f3f2022220a20202020202020207d0a0a20202020202020202f2f2f205265736f6c7665732061206d65746164617461207669657720666f722074686973204e46540a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a2020202020202020202020207377697463682076696577207b0a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e446973706c61793e28293a0a20202020202020202020202020202020202020206c657420636f6e7472616374526566203d20", +"2e626f72726f7754686973436f6e747261637428290a202020202020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c4d6574616461746156696577732e446973706c61793e2829290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e53657269616c3e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e53657269616c280a20202020202020202020202020202020202020202020202073656c662e69640a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020202020202072657475726e20", +"2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020202020202072657475726e20", +"2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a2020202020202020202020202020202020202020202020206e616d653a2073656c662e6765744e616d6528292c0a20202020202020202020202020202020202020202020202073796d626f6c3a2073656c662e67657453796d626f6c28292c0a2020202020202020202020202020202020202020202020207572693a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e746f6b656e5552492829290a2020202020202020202020202020202020202020290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f207075626c69632066756e6374696f6e207468617420616e796f6e652063616e2063616c6c20746f206372656174652061206e657720656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202072657475726e203c2d20", +"2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a2073656c662e676574547970652829290a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d4e465420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e46540a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", +"2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a202020207d0a0a202020202f2f2f2054686973207265736f7572636520686f6c6473206173736f636961746564204e4654732c20616e642073657276657320717565726965732061626f75742073746f726564204e4654730a2020202061636365737328616c6c29207265736f7572636520436f6c6c656374696f6e203a2043726f7373564d4e46542e45564d4e4654436f6c6c656374696f6e207b0a20202020202020202f2f2f2064696374696f6e617279206f66204e465420636f6e666f726d696e6720746f6b656e7320696e6465786564206f6e2074686569722049440a202020202020202061636365737328616c6c2920766172206f776e65644e4654733a20407b55496e7436343a207b4e6f6e46756e6769626c65546f6b656e2e4e46547d7d0a20202020202020202f2f2f204d617070696e67206f662045564d2049447320746f20466c6f77204e4654204944730a202020202020202061636365737328636f6e747261637429206c65742065766d4944546f466c6f7749443a207b55496e743235363a2055496e7436347d0a0a202020202020202061636365737328616c6c29207661722073746f72616765506174683a2053746f72616765506174680a202020202020202061636365737328616c6c2920766172207075626c6963506174683a205075626c6963506174680a0a2020202020202020696e6974202829207b0a20202020202020202020202073656c662e6f776e65644e465473203c2d207b7d0a20202020202020202020202073656c662e65766d4944546f466c6f774944203d207b7d0a2020202020202020202020206c657420636f6c6c656374696f6e44617461203d20", +"2e7265736f6c7665436f6e747261637456696577280a20202020202020202020202020202020202020207265736f75726365547970653a20547970653c40", +"2e4e46543e28292c0a202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a202020202020202020202020202020202920617321204d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613f0a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f74207265736f6c76652074686520636f6c6c656374696f6e2064617461207669657720666f7220746865204e465420636f6c6c656374696f6e22290a20202020202020202020202073656c662e73746f7261676550617468203d20636f6c6c656374696f6e446174612e73746f72616765506174680a20202020202020202020202073656c662e7075626c696350617468203d20636f6c6c656374696f6e446174612e7075626c6963506174680a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", +"2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", +"2e73796d626f6c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732061206c697374206f66204e46542074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465644e4654547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b20547970653c40", +"2e4e46543e28293a2074727565207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732077686574686572206f72206e6f742074686520676976656e20747970652069732061636365707465642062792074686520636f6c6c656374696f6e0a20202020202020202f2f2f204120636f6c6c656374696f6e20746861742063616e2061636365707420616e7920747970652073686f756c64206a7573742072657475726e20747275652062792064656661756c740a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465644e46545479706528747970653a2054797065293a20426f6f6c207b0a202020202020202020202072657475726e2074797065203d3d20547970653c40", +"2e4e46543e28290a20202020202020207d0a0a20202020202020202f2f2f2052656d6f76657320616e204e46542066726f6d2074686520636f6c6c656374696f6e20616e64206d6f76657320697420746f207468652063616c6c65720a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728776974686472617749443a2055496e743634293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a2020202020202020202020206c657420746f6b656e203c2d2073656c662e6f776e65644e4654732e72656d6f7665286b65793a2077697468647261774944290a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642049442066726f6d2074686520636f6c6c656374696f6e22290a0a20202020202020202020202072657475726e203c2d746f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2057697468647261777320616e204e46542066726f6d2074686520636f6c6c656374696f6e206279206974732045564d2049440a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e207769746864726177427945564d4944285f2069643a2055496e74323536293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a20202020202020202020202072657475726e203c2d2073656c662e776974686472617728776974686472617749443a200a2020202020202020202020202020202073656c662e676574436164656e636549442866726f6d3a20696429203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642045564d2049442066726f6d2074686520636f6c6c656374696f6e22290a202020202020202020202020290a20202020202020207d0a0a20202020202020202f2f2f205474616b65732061204e465420616e64206164647320697420746f2074686520636f6c6c656374696f6e732064696374696f6e61727920616e6420616464732074686520494420746f207468652065766d4944546f466c6f774944206d617070696e670a202020202020202061636365737328616c6c292066756e206465706f73697428746f6b656e3a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d29207b0a2020202020202020202020206c657420746f6b656e203c2d20746f6b656e206173212040", +"2e4e46540a0a2020202020202020202020202f2f2061646420746865206e657720746f6b656e20746f207468652064696374696f6e6172792077686963682072656d6f76657320746865206f6c64206f6e650a20202020202020202020202073656c662e65766d4944546f466c6f7749445b746f6b656e2e65766d49445d203d20746f6b656e2e69640a2020202020202020202020206c6574206f6c64546f6b656e203c2d2073656c662e6f776e65644e4654735b746f6b656e2e69645d203c2d20746f6b656e0a0a20202020202020202020202064657374726f79206f6c64546f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657449447328293a205b55496e7436345d207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652045564d2049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49447328293a205b55496e743235365d207b0a20202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749442e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520436164656e6365204e46542e696420666f722074686520676976656e2045564d204e46542049442069662069742065786973747320696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e20676574436164656e636549442866726f6d2065766d49443a2055496e74323536293a2055496e7436343f207b0a20202020202020202020202069662073656c662e65766d4944546f466c6f7749445b65766d49445d20213d206e696c207b0a2020202020202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749445b65766d49445d0a2020202020202020202020207d20656c73652069662065766d4944203c2055496e743235362855496e7436342e6d6178292026262073656c662e626f72726f774e46542855496e7436342865766d4944292920213d206e696c207b0a2020202020202020202020202020202072657475726e2055496e7436342865766d4944290a2020202020202020202020207d20656c7365207b0a2020202020202020202020202020202072657475726e206e696c0a2020202020202020202020207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e73207468652045564d204e4654204944206173736f63696174656420776974682074686520436164656e6365204e46542049442e2054686520676f616c20697320746f20726574726965766520746865204552433732312049442076616c75652e0a20202020202020202f2f2f20417320666172206173207468652062726964676520697320636f6e6365726e65642c20616e2045524337323120646566696e6564206279207468652062726964676520697320746865204e46542773204944206174207468652074696d65206f66206272696467696e670a20202020202020202f2f2f206f72207468652076616c7565206f6620746865204e46542e65766d494420696620697420696d706c656d656e7473207468652043726f7373564d4e46542e45564d4e465420696e74657266616365207768656e20627269646765642e0a20202020202020202f2f2f20466f6c6c6f77696e672074686973207061747465726e2c206966206c6f636b65642c20746865204e465420697320636865636b656420666f722045564d4e465420636f6e666f726d616e63652072657475726e696e67202e65766d494420696620736f2c0a20202020202020202f2f2f206f746865727769736520746865204e465427732049442069732072657475726e656420617320612055496e743235362073696e63652074686174277320686f77207468652062726964676520776f756c642068616e646c65206d696e74696e6720696e207468650a20202020202020202f2f2f20636f72726573706f6e64696e672045524337323120636f6e74726163742e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49442866726f6d20636164656e636549443a2055496e743634293a2055496e743235363f207b0a2020202020202020202020206966206c6574206e6674203d2073656c662e626f72726f774e465428636164656e6365494429207b0a202020202020202020202020202020206966206c65742065766d4e4654203d2043726f7373564d4e46542e67657445564d49442866726f6d3a206e667429207b0a202020202020202020202020202020202020202072657475726e2065766d4e46540a202020202020202020202020202020207d0a2020202020202020202020202020202072657475726e2055496e74323536286e66742e6964290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520636f6e747261637455524920666f7220746865204e465420636f6c6c656374696f6e20617320646566696e656420696e2074686520736f757263652045524337323120636f6e74726163742e204966206e6f6e65207761730a20202020202020202f2f2f20646566696e6564206174207468652074696d65206f66206272696467696e672c20616e20656d70747920737472696e672069732072657475726e65642e0a202020202020202061636365737328616c6c2920766965772066756e20636f6e747261637455524928293a20537472696e673f207b0a20202020202020202020202072657475726e20", +"2e636f6e74726163745552490a20202020202020207d0a0a20202020202020202f2f2f20476574732074686520616d6f756e74206f66204e4654732073746f72656420696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e206765744c656e67746828293a20496e74207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579732e6c656e6774680a20202020202020207d0a0a20202020202020202f2f2f205265747269657665732061207265666572656e636520746f20746865204e46542073746f72656420696e2074686520636f6c6c656374696f6e206279206974732049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f774e4654285f2069643a2055496e743634293a20267b4e6f6e46756e6769626c65546f6b656e2e4e46547d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d0a20202020202020207d0a0a20202020202020202f2f2f20426f72726f77207468652076696577207265736f6c76657220666f722074686520737065636966696564204e46542049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f77566965775265736f6c7665722869643a2055496e743634293a20267b566965775265736f6c7665722e5265736f6c7665727d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d20617320267b566965775265736f6c7665722e5265736f6c7665727d3f203f3f206e696c0a20202020202020207d0a0a20202020202020202f2f2f204372656174657320616e20656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d20207b0a20202020202020202020202072657475726e203c2d", +"2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", +"2e4e46543e2829290a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d707479436f6c6c656374696f6e206372656174657320616e20656d70747920436f6c6c656374696f6e20666f722074686520737065636966696564204e465420747970650a202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c657220736f207468617420746865792063616e206f776e204e4654730a2020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e286e6674547970653a2054797065293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a202020202020202072657475726e203c2d2063726561746520436f6c6c656374696f6e28290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e4654207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d4e4654436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e7465642062792061204e6f6e2046756e6769626c6520546f6b656e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c20626520757365642062790a202020202f2f2f202020202020202020646576656c6f7065727320746f206b6e6f7720776869636820706172616d6574657220746f207061737320746f20746865207265736f6c7665566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020206c6574206964656e746966696572203d2022", +"436f6c6c656374696f6e220a202020202020202020202020202020206c657420636f6c6c656374696f6e44617461203d204d6574616461746156696577732e4e4654436f6c6c656374696f6e44617461280a202020202020202020202020202020202020202073746f72616765506174683a2053746f7261676550617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963506174683a205075626c696350617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963436f6c6c656374696f6e3a20547970653c26", +"2e436f6c6c656374696f6e3e28292c0a20202020202020202020202020202020202020207075626c69634c696e6b6564547970653a20547970653c26", +"2e436f6c6c656374696f6e3e28292c0a2020202020202020202020202020202020202020637265617465456d707479436f6c6c656374696f6e46756e6374696f6e3a202866756e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d", +"2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", +"2e4e46543e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020202020202072657475726e20636f6c6c656374696f6e446174610a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020206c65742073656c66526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a2073656c665265662c20766965773a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e2829290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e74204e4654732066726f6d206272696467652d646566696e6564204e465420636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e206d696e744e46542869643a2055496e743235362c20746f6b656e5552493a20537472696e67293a20404e4654207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b69645d203d3d206e696c3a20224120746f6b656e20776974682074686520676976656e2045524337323120494420616c726561647920657869737473220a20202020202020207d0a202020202020202073656c662e746f6b656e555249735b69645d203d20746f6b656e5552490a202020202020202072657475726e203c2d637265617465204e4654280a20202020202020202020202065766d49443a2069642c0a2020202020202020202020206d657461646174613a207b0a20202020202020202020202020202020224272696467656420426c6f636b223a2067657443757272656e74426c6f636b28292e6865696768742c0a2020202020202020202020202020202022427269646765642054696d657374616d70223a2067657443757272656e74426c6f636b28292e74696d657374616d700a2020202020202020202020207d0a2020202020202020290a202020207d0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f207570646174652074686520555249206f662062726964676564204e4654732e205468697320617373756d65732074686174207468652045564d2d646566696e696e672070726f6a656374206d617920636f6e7461696e0a202020202f2f2f206c6f67696320286f6e636861696e206f72206f6666636861696e292077686963682075706461746573204e4654206d6574616461746120696e2074686520736f757263652045524337323120636f6e74726163742e204f6e206272696467696e672c20746865205552492063616e0a202020202f2f2f207468656e206265207570646174656420696e207468697320636f6e747261637420746f207265666c6563742074686520736f757263652045524337323120636f6e74726163742773206d657461646174612e0a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e20757064617465546f6b656e5552492865766d49443a2055496e743235362c206e65775552493a20537472696e6729207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d20213d206e696c3a20224e6f20746f6b656e20776974682074686520676976656e2045524337323120494420657869737473220a20202020202020207d0a202020202020202069662073656c662e746f6b656e555249735b65766d49445d20213d206e6577555249207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d203d206e65775552490a20202020202020207d0a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", +"2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d4e4654436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f6b656e55524973203d207b7d0a202020202020202073656c662e636f6c6c656374696f6e203c2d2063726561746520436f6c6c656374696f6e28290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", +"2e4e46543e28292c20776974683a2073656c662e65766d4e4654436f6e747261637441646472657373290a2020202020202020466c6f7745564d4272696467654e4654457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020666f72547970653a20547970653c40", +"2e4e46543e28292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020657263373231416464726573733a2073656c662e65766d4e4654436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" ] access(all) let bridgedTokenCodeChunks = [ - "696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e4d6574616461746156696577732066726f6d203078303030303030303030303030303030320a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d427269646765546f6b656e4d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765546f6b656e457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d546f6b656e2066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e61746976652066756e6769626c6520746f6b656e7320627269646765642066726f6d20466c6f772045564d20746f200a2f2f2f20436164656e63652e2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e200a2f2f2f2045524332302920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c20746865204552433230206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e6420746f6b656e7320617265206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206275726e65640a2f2f2f20696e207468697320636f6e747261637420616e6420746865204552433230206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e6365205661756c74206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d20746f6b656e7320616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", - "203a204943726f7373564d2c204943726f7373564d41737365742c204945564d427269646765546f6b656e4d696e7465722c2046756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d546f6b656e436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20446563696d616c20706c6163652076616c756520646566696e656420696e2074686520736f7572636520455243323020636f6e74726163740a2020202061636365737328616c6c29206c657420646563696d616c733a2055496e74380a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f20546f74616c20737570706c79206f66207468697320436164656e636520746f6b656e20696e2063697263756c6174696f6e0a202020202f2f2f204e4f54453a205468697320646f6573206e6f74207265666c6563742074686520746f74616c20737570706c79206f662074686520736f7572636520455243323020696e2063697263756c6174696f6e2077697468696e2045564d0a2020202061636365737328616c6c292076617220746f74616c537570706c793a205546697836340a202020202f2f2f2052657461696e2061205661756c7420746f207265666572656e6365207768656e207265736f6c76696e67205661756c74204d657461646174610a202020206163636573732873656c6629206c6574207661756c743a20405661756c740a0a202020202f2f2f20546865205661756c74207265736f7572636520726570726573656e74696e6720746865206272696467656420455243323020746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365205661756c74203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d546f6b656e2e45564d546f6b656e496e666f2c2046756e6769626c65546f6b656e2e5661756c74207b0a20202020202020202f2f2f2042616c616e6365206f662074686520746f6b656e7320696e206120676976656e205661756c740a202020202020202061636365737328616c6c29207661722062616c616e63653a205546697836340a0a2020202020202020696e69742862616c616e63653a2055466978363429207b0a20202020202020202020202073656c662e62616c616e6365203d2062616c616e63650a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d546f6b656e2e45564d46545661756c7420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f204765747320746865204552433230206e616d652076616c75650a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", - "2e6e616d650a20202020202020207d0a20202020202020202f2f2f2047657473207468652045524332302073796d626f6c2076616c75650a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", - "2e73796d626f6c0a20202020202020207d0a20202020202020202f2f2f20476574732074686520455243323020646563696d616c732076616c75650a202020202020202061636365737328616c6c2920766965772066756e20676574446563696d616c7328293a2055496e7438207b0a20202020202020202020202072657475726e20", - "2e646563696d616c730a20202020202020207d0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", - "2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e20", - "2e676574436f6e74726163745669657773287265736f75726365547970653a206e696c290a20202020202020207d0a0a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a20202020202020202020202072657475726e20", - "2e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a2076696577290a20202020202020207d0a0a20202020202020202f2f2f20676574537570706f727465645661756c745479706573206f7074696f6e616c6c792072657475726e732061206c697374206f66207661756c742074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465645661756c74547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b2073656c662e6765745479706528293a2074727565207d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465645661756c745479706528747970653a2054797065293a20426f6f6c207b0a20202020202020202020202072657475726e2073656c662e676574537570706f727465645661756c74547970657328295b747970655d203f3f2066616c73650a20202020202020207d0a0a20202020202020202f2f2f2041736b732069662074686520616d6f756e742063616e2062652077697468647261776e2066726f6d2074686973207661756c740a202020202020202061636365737328616c6c2920766965772066756e206973417661696c61626c65546f576974686472617728616d6f756e743a20554669783634293a20426f6f6c207b0a20202020202020202020202072657475726e20616d6f756e74203c3d2073656c662e62616c616e63650a20202020202020207d0a0a20202020202020202f2f2f206465706f7369740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b65732061205661756c74206f626a65637420617320616e20617267756d656e7420616e6420616464730a20202020202020202f2f2f206974732062616c616e636520746f207468652062616c616e6365206f6620746865206f776e657273205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420697320616c6c6f77656420746f2064657374726f79207468652073656e74205661756c74206265636175736520746865205661756c740a20202020202020202f2f2f2077617320612074656d706f7261727920686f6c646572206f662074686520746f6b656e732e20546865205661756c7427732062616c616e6365206861730a20202020202020202f2f2f206265656e20636f6e73756d656420616e64207468657265666f72652063616e2062652064657374726f7965642e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e206465706f7369742866726f6d3a20407b46756e6769626c65546f6b656e2e5661756c747d29207b0a2020202020202020202020206c6574207661756c74203c2d2066726f6d2061732120405661756c740a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202b207661756c742e62616c616e63650a2020202020202020202020207661756c742e62616c616e6365203d20302e300a20202020202020202020202064657374726f79207661756c740a20202020202020207d0a0a20202020202020202f2f2f20637265617465456d7074795661756c740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f0a20202020202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c20746869732066756e6374696f6e0a20202020202020202f2f2f20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f772074686569720a20202020202020202f2f2f206163636f756e7420746f2062652061626c6520746f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e20637265617465456d7074795661756c7428293a20405661756c74207b0a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20302e30290a20202020202020207d0a0a20202020202020202f2f2f2077697468647261770a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b657320616e20616d6f756e7420617320616e20617267756d656e740a20202020202020202f2f2f20616e6420776974686472617773207468617420616d6f756e742066726f6d20746865205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420637265617465732061206e65772074656d706f72617279205661756c742074686174206973207573656420746f20686f6c640a20202020202020202f2f2f2074686520746f6b656e73207468617420617265206265696e67207472616e736665727265642e2049742072657475726e7320746865206e65776c790a20202020202020202f2f2f2063726561746564205661756c7420746f2074686520636f6e7465787420746861742063616c6c656420736f2069742063616e206265206465706f73697465640a20202020202020202f2f2f20656c736577686572652e0a20202020202020202f2f2f0a20202020202020206163636573732846756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728616d6f756e743a20554669783634293a20405661756c74207b0a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202d20616d6f756e740a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20616d6f756e74290a20202020202020207d0a0a20202020202020202f2f2f2043616c6c6564207768656e20612066756e6769626c6520746f6b656e206973206275726e6564207669612074686520604275726e65722e6275726e282960206d6574686f640a202020202020202061636365737328636f6e7472616374292066756e206275726e43616c6c6261636b2829207b0a20202020202020202020202069662073656c662e62616c616e6365203e20302e30207b0a20202020202020202020202020202020", - "2e746f74616c537570706c79203d20", - "2e746f74616c537570706c79202d2073656c662e62616c616e63650a2020202020202020202020207d0a20202020202020202020202073656c662e62616c616e6365203d20302e300a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d7074795661756c740a202020202f2f2f0a202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c0a202020202f2f2f20746869732066756e6374696f6e20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f77207468656972206163636f756e7420746f2062652061626c6520746f0a202020202f2f2f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a202020202f2f2f0a2020202061636365737328616c6c292066756e20637265617465456d7074795661756c74287661756c74547970653a2054797065293a2040", - "2e5661756c74207b0a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20302e30290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d546f6b656e436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e74656420627920746869732066756e6769626c6520746f6b656e20636f6e74726163742e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c206265207573656420627920646576656c6f7065727320746f206b6e6f772077686963680a202020202f2f2f202020202020202020706172616d6574657220746f207061737320746f20746865207265736f6c7665436f6e7472616374566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e465456696577280a20202020202020202020202020202020202020206674446973706c61793a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793f2c0a202020202020202020202020202020202020202066745661756c74446174613a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613f0a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28293a0a202020202020202020202020202020206c657420636f6e7472616374526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e2829290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c7444617461280a202020202020202020202020202020202020202073746f72616765506174683a202f73746f726167652f", - "5661756c742c0a20202020202020202020202020202020202020207265636569766572506174683a202f7075626c69632f", - "52656365697665722c0a20202020202020202020202020202020202020206d65746164617461506174683a202f7075626c69632f", - "5661756c742c0a202020202020202020202020202020202020202072656365697665724c696e6b6564547970653a20547970653c26", - "2e5661756c743e28292c0a20202020202020202020202020202020202020206d657461646174614c696e6b6564547970653a20547970653c26", - "2e5661756c743e28292c0a2020202020202020202020202020202020202020637265617465456d7074795661756c7446756e6374696f6e3a202866756e28293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d73656c662e637265617465456d7074795661756c74287661756c74547970653a20547970653c40", - "2e5661756c743e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c79280a2020202020202020202020202020202020202020746f74616c537570706c793a2073656c662e746f74616c537570706c790a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e7420746f6b656e732066726f6d206272696467652d646566696e65642066756e6769626c6520746f6b656e20636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74292066756e206d696e74546f6b656e7328616d6f756e743a20554669783634293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a202020202020202073656c662e746f74616c537570706c79203d2073656c662e746f74616c537570706c79202b20616d6f756e740a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20616d6f756e74290a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", - "2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c20646563696d616c733a2055496e74382c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d546f6b656e436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e646563696d616c73203d20646563696d616c730a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f74616c537570706c79203d20302e300a202020202020202073656c662e7661756c74203c2d20637265617465205661756c742862616c616e63653a20302e30290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", - "2e5661756c743e28292c20776974683a2073656c662e65766d546f6b656e436f6e747261637441646472657373290a2020202020202020466c6f7745564d427269646765546f6b656e457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020776974683a203c2d637265617465205661756c742862616c616e63653a20302e30292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020646563696d616c733a20646563696d616c732c0a20202020202020202020202065766d546f6b656e416464726573733a2073656c662e65766d546f6b656e436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" +"696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e4d6574616461746156696577732066726f6d203078303030303030303030303030303030320a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d427269646765546f6b656e4d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765546f6b656e457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d546f6b656e2066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e61746976652066756e6769626c6520746f6b656e7320627269646765642066726f6d20466c6f772045564d20746f200a2f2f2f20436164656e63652e2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e200a2f2f2f2045524332302920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c20746865204552433230206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e6420746f6b656e7320617265206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206275726e65640a2f2f2f20696e207468697320636f6e747261637420616e6420746865204552433230206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e6365205661756c74206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d20746f6b656e7320616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", +"203a204943726f7373564d2c204943726f7373564d41737365742c204945564d427269646765546f6b656e4d696e7465722c2046756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d546f6b656e436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20446563696d616c20706c6163652076616c756520646566696e656420696e2074686520736f7572636520455243323020636f6e74726163740a2020202061636365737328616c6c29206c657420646563696d616c733a2055496e74380a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f20546f74616c20737570706c79206f66207468697320436164656e636520746f6b656e20696e2063697263756c6174696f6e0a202020202f2f2f204e4f54453a205468697320646f6573206e6f74207265666c6563742074686520746f74616c20737570706c79206f662074686520736f7572636520455243323020696e2063697263756c6174696f6e2077697468696e2045564d0a2020202061636365737328616c6c292076617220746f74616c537570706c793a205546697836340a202020202f2f2f2052657461696e2061205661756c7420746f207265666572656e6365207768656e207265736f6c76696e67205661756c74204d657461646174610a202020206163636573732873656c6629206c6574207661756c743a20405661756c740a0a202020202f2f2f20546865205661756c74207265736f7572636520726570726573656e74696e6720746865206272696467656420455243323020746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365205661756c74203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d546f6b656e2e45564d546f6b656e496e666f2c2046756e6769626c65546f6b656e2e5661756c74207b0a20202020202020202f2f2f2042616c616e6365206f662074686520746f6b656e7320696e206120676976656e205661756c740a202020202020202061636365737328616c6c29207661722062616c616e63653a205546697836340a0a2020202020202020696e69742862616c616e63653a2055466978363429207b0a20202020202020202020202073656c662e62616c616e6365203d2062616c616e63650a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d546f6b656e2e45564d46545661756c7420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f204765747320746865204552433230206e616d652076616c75650a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", +"2e6e616d650a20202020202020207d0a20202020202020202f2f2f2047657473207468652045524332302073796d626f6c2076616c75650a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", +"2e73796d626f6c0a20202020202020207d0a20202020202020202f2f2f20476574732074686520455243323020646563696d616c732076616c75650a202020202020202061636365737328616c6c2920766965772066756e20676574446563696d616c7328293a2055496e7438207b0a20202020202020202020202072657475726e20", +"2e646563696d616c730a20202020202020207d0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", +"2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e20", +"2e676574436f6e74726163745669657773287265736f75726365547970653a206e696c290a20202020202020207d0a0a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a20202020202020202020202072657475726e20", +"2e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a2076696577290a20202020202020207d0a0a20202020202020202f2f2f20676574537570706f727465645661756c745479706573206f7074696f6e616c6c792072657475726e732061206c697374206f66207661756c742074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465645661756c74547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b2073656c662e6765745479706528293a2074727565207d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465645661756c745479706528747970653a2054797065293a20426f6f6c207b0a20202020202020202020202072657475726e2073656c662e676574537570706f727465645661756c74547970657328295b747970655d203f3f2066616c73650a20202020202020207d0a0a20202020202020202f2f2f2041736b732069662074686520616d6f756e742063616e2062652077697468647261776e2066726f6d2074686973207661756c740a202020202020202061636365737328616c6c2920766965772066756e206973417661696c61626c65546f576974686472617728616d6f756e743a20554669783634293a20426f6f6c207b0a20202020202020202020202072657475726e20616d6f756e74203c3d2073656c662e62616c616e63650a20202020202020207d0a0a20202020202020202f2f2f206465706f7369740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b65732061205661756c74206f626a65637420617320616e20617267756d656e7420616e6420616464730a20202020202020202f2f2f206974732062616c616e636520746f207468652062616c616e6365206f6620746865206f776e657273205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420697320616c6c6f77656420746f2064657374726f79207468652073656e74205661756c74206265636175736520746865205661756c740a20202020202020202f2f2f2077617320612074656d706f7261727920686f6c646572206f662074686520746f6b656e732e20546865205661756c7427732062616c616e6365206861730a20202020202020202f2f2f206265656e20636f6e73756d656420616e64207468657265666f72652063616e2062652064657374726f7965642e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e206465706f7369742866726f6d3a20407b46756e6769626c65546f6b656e2e5661756c747d29207b0a2020202020202020202020206c6574207661756c74203c2d2066726f6d2061732120405661756c740a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202b207661756c742e62616c616e63650a2020202020202020202020207661756c742e62616c616e6365203d20302e300a20202020202020202020202064657374726f79207661756c740a20202020202020207d0a0a20202020202020202f2f2f20637265617465456d7074795661756c740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f0a20202020202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c20746869732066756e6374696f6e0a20202020202020202f2f2f20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f772074686569720a20202020202020202f2f2f206163636f756e7420746f2062652061626c6520746f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e20637265617465456d7074795661756c7428293a20405661756c74207b0a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20302e30290a20202020202020207d0a0a20202020202020202f2f2f2077697468647261770a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b657320616e20616d6f756e7420617320616e20617267756d656e740a20202020202020202f2f2f20616e6420776974686472617773207468617420616d6f756e742066726f6d20746865205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420637265617465732061206e65772074656d706f72617279205661756c742074686174206973207573656420746f20686f6c640a20202020202020202f2f2f2074686520746f6b656e73207468617420617265206265696e67207472616e736665727265642e2049742072657475726e7320746865206e65776c790a20202020202020202f2f2f2063726561746564205661756c7420746f2074686520636f6e7465787420746861742063616c6c656420736f2069742063616e206265206465706f73697465640a20202020202020202f2f2f20656c736577686572652e0a20202020202020202f2f2f0a20202020202020206163636573732846756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728616d6f756e743a20554669783634293a20405661756c74207b0a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202d20616d6f756e740a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20616d6f756e74290a20202020202020207d0a0a20202020202020202f2f2f2043616c6c6564207768656e20612066756e6769626c6520746f6b656e206973206275726e6564207669612074686520604275726e65722e6275726e282960206d6574686f640a202020202020202061636365737328636f6e7472616374292066756e206275726e43616c6c6261636b2829207b0a20202020202020202020202069662073656c662e62616c616e6365203e20302e30207b0a20202020202020202020202020202020", +"2e746f74616c537570706c79203d20", +"2e746f74616c537570706c79202d2073656c662e62616c616e63650a2020202020202020202020207d0a20202020202020202020202073656c662e62616c616e6365203d20302e300a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d7074795661756c740a202020202f2f2f0a202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c0a202020202f2f2f20746869732066756e6374696f6e20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f77207468656972206163636f756e7420746f2062652061626c6520746f0a202020202f2f2f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a202020202f2f2f0a2020202061636365737328616c6c292066756e20637265617465456d7074795661756c74287661756c74547970653a2054797065293a2040", +"2e5661756c74207b0a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20302e30290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d546f6b656e436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e74656420627920746869732066756e6769626c6520746f6b656e20636f6e74726163742e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c206265207573656420627920646576656c6f7065727320746f206b6e6f772077686963680a202020202f2f2f202020202020202020706172616d6574657220746f207061737320746f20746865207265736f6c7665436f6e7472616374566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e465456696577280a20202020202020202020202020202020202020206674446973706c61793a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793f2c0a202020202020202020202020202020202020202066745661756c74446174613a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613f0a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28293a0a202020202020202020202020202020206c657420636f6e7472616374526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e2829290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c7444617461280a202020202020202020202020202020202020202073746f72616765506174683a202f73746f726167652f", +"5661756c742c0a20202020202020202020202020202020202020207265636569766572506174683a202f7075626c69632f", +"52656365697665722c0a20202020202020202020202020202020202020206d65746164617461506174683a202f7075626c69632f", +"5661756c742c0a202020202020202020202020202020202020202072656365697665724c696e6b6564547970653a20547970653c26", +"2e5661756c743e28292c0a20202020202020202020202020202020202020206d657461646174614c696e6b6564547970653a20547970653c26", +"2e5661756c743e28292c0a2020202020202020202020202020202020202020637265617465456d7074795661756c7446756e6374696f6e3a202866756e28293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d73656c662e637265617465456d7074795661756c74287661756c74547970653a20547970653c40", +"2e5661756c743e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c79280a2020202020202020202020202020202020202020746f74616c537570706c793a2073656c662e746f74616c537570706c790a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e7420746f6b656e732066726f6d206272696467652d646566696e65642066756e6769626c6520746f6b656e20636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74292066756e206d696e74546f6b656e7328616d6f756e743a20554669783634293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a202020202020202073656c662e746f74616c537570706c79203d2073656c662e746f74616c537570706c79202b20616d6f756e740a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20616d6f756e74290a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", +"2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c20646563696d616c733a2055496e74382c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d546f6b656e436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e646563696d616c73203d20646563696d616c730a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f74616c537570706c79203d20302e300a202020202020202073656c662e7661756c74203c2d20637265617465205661756c742862616c616e63653a20302e30290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", +"2e5661756c743e28292c20776974683a2073656c662e65766d546f6b656e436f6e747261637441646472657373290a2020202020202020466c6f7745564d427269646765546f6b656e457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020776974683a203c2d637265617465205661756c742862616c616e63653a20302e30292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020646563696d616c733a20646563696d616c732c0a20202020202020202020202065766d546f6b656e416464726573733a2073656c662e65766d546f6b656e436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" ] access(all) let wflowBytecode = "60806040526040518060400160405280600c81526020017f5772617070656420466c6f7700000000000000000000000000000000000000008152506000908051906020019061004f9291906100ca565b506040518060400160405280600581526020017f57464c4f570000000000000000000000000000000000000000000000000000008152506001908051906020019061009b9291906100ca565b506012600260006101000a81548160ff021916908360ff1602179055503480156100c457600080fd5b5061016f565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061010b57805160ff1916838001178555610139565b82800160010185558215610139579182015b8281111561013857825182559160200191906001019061011d565b5b509050610146919061014a565b5090565b61016c91905b80821115610168576000816000905550600101610150565b5090565b90565b610cb18061017e6000396000f3fe60806040526004361061009c5760003560e01c8063313ce56711610064578063313ce567146102a257806370a08231146102d357806395d89b4114610338578063a9059cbb146103c8578063d0e30db01461043b578063dd62ed3e146104455761009c565b806306fdde03146100a6578063095ea7b31461013657806318160ddd146101a957806323b872dd146101d45780632e1a7d4d14610267575b6100a46104ca565b005b3480156100b257600080fd5b506100bb610567565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100fb5780820151818401526020810190506100e0565b50505050905090810190601f1680156101285780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561014257600080fd5b5061018f6004803603604081101561015957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610605565b604051808215151515815260200191505060405180910390f35b3480156101b557600080fd5b506101be6106f7565b6040518082815260200191505060405180910390f35b3480156101e057600080fd5b5061024d600480360360608110156101f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106ff565b604051808215151515815260200191505060405180910390f35b34801561027357600080fd5b506102a06004803603602081101561028a57600080fd5b8101908080359060200190929190505050610a48565b005b3480156102ae57600080fd5b506102b7610b79565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102df57600080fd5b50610322600480360360208110156102f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b8c565b6040518082815260200191505060405180910390f35b34801561034457600080fd5b5061034d610ba4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561038d578082015181840152602081019050610372565b50505050905090810190601f1680156103ba5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d457600080fd5b50610421600480360360408110156103eb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c42565b604051808215151515815260200191505060405180910390f35b6104436104ca565b005b34801561045157600080fd5b506104b46004803603604081101561046857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c57565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105fd5780601f106105d2576101008083540402835291602001916105fd565b820191906000526020600020905b8154815290600101906020018083116105e057829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600047905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561074d57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415801561082557507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1561093e5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156108b357600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610a9457600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610b27573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c3a5780601f10610c0f57610100808354040283529160200191610c3a565b820191906000526020600020905b815481529060010190602001808311610c1d57829003601f168201915b505050505081565b6000610c4f3384846106ff565b905092915050565b600460205281600052604060002060205280600052604060002060009150915050548156fea265627a7a72315820f244057a65e6137716ad7a1bcda9508cabc8922dd2787bbaa5578c7e5a6f1c9964736f6c63430005110032" -access(all) let usdc6Bytecode = "" +access(all) let usdc6Bytecode = "610160604052348015610010575f5ffd5b5060405161299138038061299183398181016040528101906100329190610495565b6040518060400160405280600881526020017f55534420436f696e000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250836040518060400160405280600881526020017f55534420436f696e0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5553444300000000000000000000000000000000000000000000000000000000815250816003908161011b91906106fd565b50806004908161012b91906106fd565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361019e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161019591906107db565b60405180910390fd5b6101ad8161025f60201b60201c565b506101c260068361032260201b90919060201c565b61012081815250506101de60078261032260201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a0818152505061021b61036f60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505050505050610985565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6020835110156103435761033c836103c960201b60201c565b9050610369565b826103538361042e60201b60201c565b5f01908161036191906106fd565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016103ae95949392919061081b565b60405160208183030381529060405280519060200120905090565b5f5f829050601f8151111561041557826040517f305a27a900000000000000000000000000000000000000000000000000000000815260040161040c91906108d2565b60405180910390fd5b8051816104219061091f565b5f1c175f1b915050919050565b5f819050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104648261043b565b9050919050565b6104748161045a565b811461047e575f5ffd5b50565b5f8151905061048f8161046b565b92915050565b5f602082840312156104aa576104a9610437565b5b5f6104b784828501610481565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061053b57607f821691505b60208210810361054e5761054d6104f7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610575565b6105ba8683610575565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6105fe6105f96105f4846105d2565b6105db565b6105d2565b9050919050565b5f819050919050565b610617836105e4565b61062b61062382610605565b848454610581565b825550505050565b5f5f905090565b610642610633565b61064d81848461060e565b505050565b5b81811015610670576106655f8261063a565b600181019050610653565b5050565b601f8211156106b55761068681610554565b61068f84610566565b8101602085101561069e578190505b6106b26106aa85610566565b830182610652565b50505b505050565b5f82821c905092915050565b5f6106d55f19846008026106ba565b1980831691505092915050565b5f6106ed83836106c6565b9150826002028217905092915050565b610706826104c0565b67ffffffffffffffff81111561071f5761071e6104ca565b5b6107298254610524565b610734828285610674565b5f60209050601f831160018114610765575f8415610753578287015190505b61075d85826106e2565b8655506107c4565b601f19841661077386610554565b5f5b8281101561079a57848901518255600182019150602085019450602081019050610775565b868310156107b757848901516107b3601f8916826106c6565b8355505b6001600288020188555050505b505050505050565b6107d58161045a565b82525050565b5f6020820190506107ee5f8301846107cc565b92915050565b5f819050919050565b610806816107f4565b82525050565b610815816105d2565b82525050565b5f60a08201905061082e5f8301886107fd565b61083b60208301876107fd565b61084860408301866107fd565b610855606083018561080c565b61086260808301846107cc565b9695505050505050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6108a4826104c0565b6108ae818561086c565b93506108be81856020860161087c565b6108c78161088a565b840191505092915050565b5f6020820190508181035f8301526108ea818461089a565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f61091682516107f4565b80915050919050565b5f610929826108f2565b82610933846108fc565b905061093e8161090b565b9250602082101561097e576109797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610575565b831692505b5050919050565b60805160a05160c05160e051610100516101205161014051611fbb6109d65f395f610e5101525f610e1601525f61134a01525f61132901525f610acc01525f610b2201525f610b4b0152611fbb5ff3fe608060405234801561000f575f5ffd5b506004361061011f575f3560e01c8063715018a6116100ab57806395d89b411161006f57806395d89b41146102fb578063a9059cbb14610319578063d505accf14610349578063dd62ed3e14610365578063f2fde38b146103955761011f565b8063715018a61461026357806379cc67901461026d5780637ecebe001461028957806384b0196e146102b95780638da5cb5b146102dd5761011f565b8063313ce567116100f2578063313ce567146101bf5780633644e515146101dd57806340c10f19146101fb57806342966c681461021757806370a08231146102335761011f565b806306fdde0314610123578063095ea7b31461014157806318160ddd1461017157806323b872dd1461018f575b5f5ffd5b61012b6103b1565b6040516101389190611800565b60405180910390f35b61015b600480360381019061015691906118b1565b610441565b6040516101689190611909565b60405180910390f35b610179610463565b6040516101869190611931565b60405180910390f35b6101a960048036038101906101a4919061194a565b61046c565b6040516101b69190611909565b60405180910390f35b6101c761049a565b6040516101d491906119b5565b60405180910390f35b6101e56104a2565b6040516101f291906119e6565b60405180910390f35b610215600480360381019061021091906118b1565b6104b0565b005b610231600480360381019061022c91906119ff565b6104c6565b005b61024d60048036038101906102489190611a2a565b6104da565b60405161025a9190611931565b60405180910390f35b61026b61051f565b005b610287600480360381019061028291906118b1565b610532565b005b6102a3600480360381019061029e9190611a2a565b610552565b6040516102b09190611931565b60405180910390f35b6102c1610563565b6040516102d49796959493929190611b55565b60405180910390f35b6102e5610608565b6040516102f29190611bd7565b60405180910390f35b610303610630565b6040516103109190611800565b60405180910390f35b610333600480360381019061032e91906118b1565b6106c0565b6040516103409190611909565b60405180910390f35b610363600480360381019061035e9190611c44565b6106e2565b005b61037f600480360381019061037a9190611ce1565b610827565b60405161038c9190611931565b60405180910390f35b6103af60048036038101906103aa9190611a2a565b6108a9565b005b6060600380546103c090611d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546103ec90611d4c565b80156104375780601f1061040e57610100808354040283529160200191610437565b820191905f5260205f20905b81548152906001019060200180831161041a57829003601f168201915b5050505050905090565b5f5f61044b61092d565b9050610458818585610934565b600191505092915050565b5f600254905090565b5f5f61047661092d565b9050610483858285610946565b61048e8585856109d9565b60019150509392505050565b5f6006905090565b5f6104ab610ac9565b905090565b6104b8610b7f565b6104c28282610c06565b5050565b6104d76104d161092d565b82610c85565b50565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610527610b7f565b6105305f610d04565b565b6105448261053e61092d565b83610946565b61054e8282610c85565b5050565b5f61055c82610dc7565b9050919050565b5f6060805f5f5f6060610574610e0d565b61057c610e48565b46305f5f1b5f67ffffffffffffffff81111561059b5761059a611d7c565b5b6040519080825280602002602001820160405280156105c95781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461063f90611d4c565b80601f016020809104026020016040519081016040528092919081815260200182805461066b90611d4c565b80156106b65780601f1061068d576101008083540402835291602001916106b6565b820191905f5260205f20905b81548152906001019060200180831161069957829003601f168201915b5050505050905090565b5f5f6106ca61092d565b90506106d78185856109d9565b600191505092915050565b8342111561072757836040517f6279130200000000000000000000000000000000000000000000000000000000815260040161071e9190611931565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886107558c610e83565b8960405160200161076b96959493929190611da9565b6040516020818303038152906040528051906020012090505f61078d82610ed6565b90505f61079c82878787610eef565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461081057808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610807929190611e08565b60405180910390fd5b61081b8a8a8a610934565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6108b1610b7f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610921575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016109189190611bd7565b60405180910390fd5b61092a81610d04565b50565b5f33905090565b6109418383836001610f1d565b505050565b5f6109518484610827565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156109d357818110156109c4578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016109bb93929190611e2f565b60405180910390fd5b6109d284848484035f610f1d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a49575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610a409190611bd7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ab9575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610ab09190611bd7565b60405180910390fd5b610ac48383836110ec565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b4457507f000000000000000000000000000000000000000000000000000000000000000046145b15610b71577f00000000000000000000000000000000000000000000000000000000000000009050610b7c565b610b79611305565b90505b90565b610b8761092d565b73ffffffffffffffffffffffffffffffffffffffff16610ba5610608565b73ffffffffffffffffffffffffffffffffffffffff1614610c0457610bc861092d565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610bfb9190611bd7565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c76575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610c6d9190611bd7565b60405180910390fd5b610c815f83836110ec565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cf5575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610cec9190611bd7565b60405180910390fd5b610d00825f836110ec565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060610e4360067f000000000000000000000000000000000000000000000000000000000000000061139a90919063ffffffff16565b905090565b6060610e7e60077f000000000000000000000000000000000000000000000000000000000000000061139a90919063ffffffff16565b905090565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f610ee8610ee2610ac9565b83611447565b9050919050565b5f5f5f5f610eff88888888611487565b925092509250610f0f828261156e565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610f8d575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610f849190611bd7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ffd575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610ff49190611bd7565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156110e6578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110dd9190611931565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361113c578060025f8282546111309190611e91565b9250508190555061120a565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156111c5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016111bc93929190611e2f565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611251578060025f828254039250508190555061129b565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112f89190611931565b60405180910390a3505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000463060405160200161137f959493929190611ec4565b60405160208183030381529060405280519060200120905090565b606060ff5f1b83146113b6576113af836116d0565b9050611441565b8180546113c290611d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546113ee90611d4c565b80156114395780601f1061141057610100808354040283529160200191611439565b820191905f5260205f20905b81548152906001019060200180831161141c57829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c11156114c3575f600385925092509250611564565b5f6001888888886040515f81526020016040526040516114e69493929190611f15565b6020604051602081039080840390855afa158015611506573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611557575f60015f5f1b93509350935050611564565b805f5f5f1b935093509350505b9450945094915050565b5f600381111561158157611580611f58565b5b82600381111561159457611593611f58565b5b03156116cc57600160038111156115ae576115ad611f58565b5b8260038111156115c1576115c0611f58565b5b036115f8576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561160c5761160b611f58565b5b82600381111561161f5761161e611f58565b5b0361166357805f1c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040161165a9190611931565b60405180910390fd5b60038081111561167657611675611f58565b5b82600381111561168957611688611f58565b5b036116cb57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016116c291906119e6565b60405180910390fd5b5b5050565b60605f6116dc83611742565b90505f602067ffffffffffffffff8111156116fa576116f9611d7c565b5b6040519080825280601f01601f19166020018201604052801561172c5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f5f60ff835f1c169050601f811115611787576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6117d282611790565b6117dc818561179a565b93506117ec8185602086016117aa565b6117f5816117b8565b840191505092915050565b5f6020820190508181035f83015261181881846117c8565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61184d82611824565b9050919050565b61185d81611843565b8114611867575f5ffd5b50565b5f8135905061187881611854565b92915050565b5f819050919050565b6118908161187e565b811461189a575f5ffd5b50565b5f813590506118ab81611887565b92915050565b5f5f604083850312156118c7576118c6611820565b5b5f6118d48582860161186a565b92505060206118e58582860161189d565b9150509250929050565b5f8115159050919050565b611903816118ef565b82525050565b5f60208201905061191c5f8301846118fa565b92915050565b61192b8161187e565b82525050565b5f6020820190506119445f830184611922565b92915050565b5f5f5f6060848603121561196157611960611820565b5b5f61196e8682870161186a565b935050602061197f8682870161186a565b92505060406119908682870161189d565b9150509250925092565b5f60ff82169050919050565b6119af8161199a565b82525050565b5f6020820190506119c85f8301846119a6565b92915050565b5f819050919050565b6119e0816119ce565b82525050565b5f6020820190506119f95f8301846119d7565b92915050565b5f60208284031215611a1457611a13611820565b5b5f611a218482850161189d565b91505092915050565b5f60208284031215611a3f57611a3e611820565b5b5f611a4c8482850161186a565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611a8981611a55565b82525050565b611a9881611843565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611ad08161187e565b82525050565b5f611ae18383611ac7565b60208301905092915050565b5f602082019050919050565b5f611b0382611a9e565b611b0d8185611aa8565b9350611b1883611ab8565b805f5b83811015611b48578151611b2f8882611ad6565b9750611b3a83611aed565b925050600181019050611b1b565b5085935050505092915050565b5f60e082019050611b685f83018a611a80565b8181036020830152611b7a81896117c8565b90508181036040830152611b8e81886117c8565b9050611b9d6060830187611922565b611baa6080830186611a8f565b611bb760a08301856119d7565b81810360c0830152611bc98184611af9565b905098975050505050505050565b5f602082019050611bea5f830184611a8f565b92915050565b611bf98161199a565b8114611c03575f5ffd5b50565b5f81359050611c1481611bf0565b92915050565b611c23816119ce565b8114611c2d575f5ffd5b50565b5f81359050611c3e81611c1a565b92915050565b5f5f5f5f5f5f5f60e0888a031215611c5f57611c5e611820565b5b5f611c6c8a828b0161186a565b9750506020611c7d8a828b0161186a565b9650506040611c8e8a828b0161189d565b9550506060611c9f8a828b0161189d565b9450506080611cb08a828b01611c06565b93505060a0611cc18a828b01611c30565b92505060c0611cd28a828b01611c30565b91505092959891949750929550565b5f5f60408385031215611cf757611cf6611820565b5b5f611d048582860161186a565b9250506020611d158582860161186a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611d6357607f821691505b602082108103611d7657611d75611d1f565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60c082019050611dbc5f8301896119d7565b611dc96020830188611a8f565b611dd66040830187611a8f565b611de36060830186611922565b611df06080830185611922565b611dfd60a0830184611922565b979650505050505050565b5f604082019050611e1b5f830185611a8f565b611e286020830184611a8f565b9392505050565b5f606082019050611e425f830186611a8f565b611e4f6020830185611922565b611e5c6040830184611922565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e9b8261187e565b9150611ea68361187e565b9250828201905080821115611ebe57611ebd611e64565b5b92915050565b5f60a082019050611ed75f8301886119d7565b611ee460208301876119d7565b611ef160408301866119d7565b611efe6060830185611922565b611f0b6080830184611a8f565b9695505050505050565b5f608082019050611f285f8301876119d7565b611f3560208301866119a6565b611f4260408301856119d7565b611f4f60608301846119d7565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea264697066735822122022147f2aa0b554972f1a5a5dad3ea8c6eaa9e7a615d0f741dae6fd59deb6e8f664736f6c634300081e0033" /* - * cd ./solidity/lib/punch-swap-v3-contracts - * forge inspect src/core/PunchSwapV3Factory.sol bytecode - */ +* cd ./solidity/lib/punch-swap-v3-contracts +* forge inspect src/core/PunchSwapV3Factory.sol bytecode +*/ access(all) let punchswapV3FactoryBytecode = "60a060405234801561001057600080fd5b506040516160db3803806160db8339818101604052602081101561003357600080fd5b50513060601b6080526001600160a01b038116610097576040805162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e6e6f74206265207a65726f206164647265737300000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040516000907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908290a36101f4600081815260046020527ffb8cf1d12598d1a039dd1d106665851a96aadf67d0d9ed76fceea282119208b7805462ffffff1916600a9081179091556040519092916000805160206160bb83398151915291a3610bb8600081815260046020527f72dffa9b822156d9cf4b0090fa0b656bcb9cc2b2c60eb6acfc20a34f54b31743805462ffffff1916603c9081179091556040519092916000805160206160bb83398151915291a3612710600081815260046020527f8cc740d51daa94ff54f33bd779c2d20149f524c340519b49181be5a08615f829805462ffffff191660c89081179091556040519092916000805160206160bb83398151915291a35060805160601c615ebe6101fd600039806106365250615ebe6000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c806313af4035146100725780631698ee821461009a57806322afcccb146100f2578063890357301461012b5780638a7c195f146101755780638da5cb5b146101a0578063a1671295146101a8575b600080fd5b6100986004803603602081101561008857600080fd5b50356001600160a01b03166101e4565b005b6100d6600480360360608110156100b057600080fd5b5080356001600160a01b03908116916020810135909116906040013562ffffff16610257565b604080516001600160a01b039092168252519081900360200190f35b6101146004803603602081101561010857600080fd5b503562ffffff16610283565b6040805160029290920b8252519081900360200190f35b610133610298565b604080516001600160a01b0396871681529486166020860152929094168383015262ffffff16606083015260029290920b608082015290519081900360a00190f35b6100986004803603604081101561018b57600080fd5b5062ffffff813516906020013560020b6102ce565b6100d6610486565b6100d6600480360360608110156101be57600080fd5b5080356001600160a01b03908116916020810135909116906040013562ffffff16610495565b6003546001600160a01b031633146101fb57600080fd5b6003546040516001600160a01b038084169216907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60056020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b60046020526000908152604090205460020b81565b600054600154600280546001600160a01b03938416939283169281169162ffffff600160a01b83041691600160b81b9004900b85565b6003546001600160a01b0316331461031a576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b604482015290519081900360640190fd5b620f42408262ffffff1610610368576040805162461bcd60e51b815260206004820152600f60248201526e08ccaca40caf0c6cacac8e640dac2f608b1b604482015290519081900360640190fd5b60008160020b13801561037f57506140008160020b125b6103d0576040805162461bcd60e51b815260206004820181905260248201527f5469636b2073706163696e67207a65726f206f722065786365656473206d6178604482015290519081900360640190fd5b62ffffff8216600090815260046020526040902054600290810b900b15610434576040805162461bcd60e51b815260206004820152601360248201527211995948185b1c9958591e48195b98589b1959606a1b604482015290519081900360640190fd5b62ffffff828116600081815260046020526040808220805462ffffff1916600287900b958616179055517fc66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc9190a35050565b6003546001600160a01b031681565b600061049f61062b565b826001600160a01b0316846001600160a01b031614156104be57600080fd5b600080846001600160a01b0316866001600160a01b0316106104e15784866104e4565b85855b90925090506001600160a01b0382166104fc57600080fd5b62ffffff8416600090815260046020526040902054600290810b9081900b61052357600080fd5b6001600160a01b0383811660009081526005602090815260408083208685168452825280832062ffffff8a168452909152902054161561056257600080fd5b61056f3084848885610662565b6001600160a01b03808516600081815260056020818152604080842089871680865290835281852062ffffff8e168087529084528286208054988a166001600160a01b0319998a1681179091558287529484528286208787528452828620818752845294829020805490971684179096558051600289900b815291820192909252815195995091947f783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b71189281900390910190a45050509392505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461066057600080fd5b565b6040805160a0810182526001600160a01b03878116808352878216602080850182905292881684860181905262ffffff888116606080880182905260028a810b6080998a01819052600080546001600160a01b03199081169099178155600180548a16891790558254909816861762ffffff60a01b1916600160a01b85021762ffffff60b81b1916600160b81b91830b909516029390931790925587518087019490945283880192909252828101919091528551808303909101815293019384905282519290910191909120909161073990610790565b8190604051809103906000f5905080158015610759573d6000803e3d6000fd5b50600080546001600160a01b0319908116909155600180549091169055600280546001600160d01b03191690559695505050505050565b6156eb8061079e8339019056fe6101606040523480156200001257600080fd5b503060601b60805260408051630890357360e41b81529051600091339163890357309160048082019260a092909190829003018186803b1580156200005657600080fd5b505afa1580156200006b573d6000803e3d6000fd5b505050506040513d60a08110156200008257600080fd5b508051602080830151604084015160608086015160809096015160e896871b6001600160e81b0319166101005291811b6001600160601b031990811660e05292811b831660c0529390931b1660a052600282810b900b90921b610120529150620000f79082906200010f811b62002a8b17901c565b60801b6001600160801b03191661014052506200017d565b60008082600281900b620d89e719816200012557fe5b05029050600083600281900b620d89e8816200013d57fe5b0502905060008460020b83830360020b816200015557fe5b0560010190508062ffffff166001600160801b038016816200017357fe5b0495945050505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005160e81c6101205160e81c6101405160801c6154a16200024a60003980611f5b52806149a052806149d7525080610b8852806128475280614a0b5280614a3d525080610c775280611938528061196f528061288f52508061113552806119f25280611e615280612396528061286b5280613cdc52508061085a528061126352806119c15280611dfb52806123105280613b93525080611fe852806121cf5280612823525080612b0252506154a16000f3fe608060405234801561001057600080fd5b506004361061013e5760003560e01c80630dfe168114610143578063128acb08146101675780631a686502146102145780631ad8b03b14610238578063252c09d71461026f57806332148f67146102c65780633850c7bd146102e95780633c8a7d8d1461034257806346141319146103e2578063490e6cbc146103fc5780634f1eb3d814610486578063514ea4bf146104d75780635339c2961461053057806370cf754a146105505780638206a4d11461055857806385b6672914610580578063883bdbfd146105bd578063a34123a7146106c4578063a38807f2146106fe578063c45a015514610759578063d0c93a7c14610761578063d21220a714610780578063ddca3f4314610788578063f3058399146107a8578063f30dba93146107b0578063f637731d14610832575b600080fd5b61014b610858565b604080516001600160a01b039092168252519081900360200190f35b6101fb600480360360a081101561017d57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a081016080820135600160201b8111156101bd57600080fd5b8201836020820111156101cf57600080fd5b803590602001918460018302840111600160201b831117156101f057600080fd5b50909250905061087c565b6040805192835260208301919091528051918290030190f35b61021c61141b565b604080516001600160801b039092168252519081900360200190f35b61024061142a565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61028c6004803603602081101561028557600080fd5b5035611444565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6102e7600480360360208110156102dc57600080fd5b503561ffff16611489565b005b6102f1611583565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015260ff90911660a0840152151560c0830152519081900360e00190f35b6101fb600480360360a081101561035857600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a081016080820135600160201b8111156103a457600080fd5b8201836020820111156103b657600080fd5b803590602001918460018302840111600160201b831117156103d757600080fd5b5090925090506115d3565b6103ea61188f565b60408051918252519081900360200190f35b6102e76004803603608081101561041257600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561044857600080fd5b82018360208201111561045a57600080fd5b803590602001918460018302840111600160201b8311171561047b57600080fd5b509092509050611895565b610240600480360360a081101561049c57600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611cf0565b6104f4600480360360208110156104ed57600080fd5b5035611f0a565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b6103ea6004803603602081101561054657600080fd5b503560010b611f47565b61021c611f59565b6102e76004803603604081101561056e57600080fd5b5060ff81358116916020013516611f7d565b6102406004803603606081101561059657600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516612161565b61062b600480360360208110156105d357600080fd5b810190602081018135600160201b8111156105ed57600080fd5b8201836020820111156105ff57600080fd5b803590602001918460208302840111600160201b8311171561062057600080fd5b50909250905061242e565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561066f578181015183820152602001610657565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106ae578181015183820152602001610696565b5050505090500194505050505060405180910390f35b6101fb600480360360608110156106da57600080fd5b508035600290810b91602081013590910b90604001356001600160801b03166124bb565b6107286004803603604081101561071457600080fd5b508035600290810b9160200135900b612632565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b61014b612821565b610769612845565b6040805160029290920b8252519081900360200190f35b61014b612869565b61079061288d565b6040805162ffffff9092168252519081900360200190f35b6103ea6128b1565b6107d0600480360360208110156107c657600080fd5b503560020b6128b7565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b6102e76004803603602081101561084857600080fd5b50356001600160a01b0316612921565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610887612af7565b856108be576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c08201819052610977576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b876109c25780600001516001600160a01b0316866001600160a01b03161180156109bd575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b6109f4565b80600001516001600160a01b0316866001600160a01b03161080156109f457506401000276a36001600160a01b038716115b610a2b576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6000805460ff60f01b191681556040805160c08101909152808a610a5a5760048460a0015160ff16901c610a6d565b60108460a0015160ff1681610a6b57fe5b065b60ff1681526004546001600160801b03166020820152604001610a8e612b2e565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b0a57600254610b0e565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610b5d5750886001600160a01b031681604001516001600160a01b031614155b15610f2757610b6a615408565b60408201516001600160a01b031681526060820151610bad906006907f00000000000000000000000000000000000000000000000000000000000000008f612b32565b15156040830152600290810b810b60208301819052620d89e719910b1215610bde57620d89e7196020820152610bfd565b6020810151620d89e860029190910b1315610bfd57620d89e860208201525b610c0a8160200151612c74565b6001600160a01b031660608201526040820151610c9b908d610c44578b6001600160a01b031683606001516001600160a01b031611610c5e565b8b6001600160a01b031683606001516001600160a01b0316105b610c6c578260600151610c6e565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000000612f9b565b60c085015260a084015260808301526001600160a01b031660408301528215610cfd57610cd18160c0015182608001510161318d565b825103825260a0810151610cf390610ce89061318d565b6020840151906131a3565b6020830152610d38565b610d0a8160a0015161318d565b825101825260c08101516080820151610d3291610d27910161318d565b6020840151906131bf565b60208301525b835160ff1615610d7e576000846000015160ff168260c0015181610d5857fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610dbd57610db18160c00151600160801b8460c001516001600160801b03166131d5565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610ee657806040015115610ebd578360a00151610e4757610e25846040015160008760200151886040015188602001518a606001516008613285909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610e9382602001518e610e5e57600154610e64565b84608001515b8f610e73578560800151610e77565b6002545b608089015160608a015160408b01516005959493929190613417565b90508c15610e9f576000035b610ead8360c00151826134d1565b6001600160801b031660c0840152505b8b610ecc578060200151610ed5565b60018160200151035b600290810b900b6060830152610f21565b80600001516001600160a01b031682604001516001600160a01b031614610f2157610f148260400151613587565b600290810b900b60608301525b50610b37565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188602001518a606001518b608001516008613872909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600080546001600160a01b0319166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110605760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a156110b057608081015160015560a08101516001600160801b0316156110ab5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b6110f6565b608081015160025560a08101516001600160801b0316156110f65760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461110f57602081015181518b0361111c565b80600001518a0381602001515b90965094508a1561125557600085121561115e5761115e7f00000000000000000000000000000000000000000000000000000000000000008d876000036139f7565b6000611168613b45565b9050336001600160a01b0316637ee355e688888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b5050505061120c613b45565b6112168289613c7e565b111561124f576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b5061137f565b600086121561128c5761128c7f00000000000000000000000000000000000000000000000000000000000000008d886000036139f7565b6000611296613c8e565b9050336001600160a01b0316637ee355e688888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561131a57600080fd5b505af115801561132e573d6000803e3d6000fd5b5050505061133a613c8e565b6113448288613c7e565b111561137d576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516818701526001600160801b039093169183019190915260020b60808201529151908e169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679181900360a00190a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b6004546001600160801b031681565b6003546001600160801b0380821691600160801b90041682565b60088161ffff811061145557600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff166114cd576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556114e2612af7565b60008054600160d81b900461ffff16906114fe60088385613d26565b6000805461ffff808416600160d81b810261ffff60d81b199093169290921790925591925083161461156b576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506000805460ff60f01b1916600160f01b17905550565b6000546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b600080548190600160f01b900460ff1661161a576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556001600160801b03851661163a57600080fd5b60008061168860405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b815260200161167e8a6001600160801b0316613dc9565b600f0b9052613dda565b925092505081935080925060008060008611156116aa576116a7613b45565b91505b84156116bb576116b8613c8e565b90505b336001600160a01b031663ffc2b15687878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561173d57600080fd5b505af1158015611751573d6000803e3d6000fd5b5050505060008611156117a857611766613b45565b6117708388613c7e565b11156117a8576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b84156117f8576117b6613c8e565b6117c08287613c7e565b11156117f8576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60025481565b600054600160f01b900460ff166118d9576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556118ee612af7565b6004546001600160801b031680611930576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b6000611965867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f424061401a565b9050600061199c867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f424061401a565b905060006119a8613b45565b905060006119b4613c8e565b905088156119e7576119e77f00000000000000000000000000000000000000000000000000000000000000008b8b6139f7565b8715611a1857611a187f00000000000000000000000000000000000000000000000000000000000000008b8a6139f7565b336001600160a01b031663855d527885858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611a9a57600080fd5b505af1158015611aae573d6000803e3d6000fd5b505050506000611abc613b45565b90506000611ac8613c8e565b905081611ad58588613c7e565b1115611b0d576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611b188487613c7e565b1115611b50576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611bdf5760008054600160e81b9004600f16908115611b83578160ff168481611b7d57fe5b04611b86565b60005b90506001600160801b03811615611bb957600380546001600160801b038082168401166001600160801b03199091161790555b611bd3818503600160801b8d6001600160801b03166131d5565b60018054909101905550505b8015611c6a5760008054600160e81b900460041c600f16908115611c0f578160ff168381611c0957fe5b04611c12565b60005b90506001600160801b03811615611c4457600380546001600160801b03600160801b8083048216850182160291161790555b611c5e818403600160801b8d6001600160801b03166131d5565b60028054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611d37576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19168155611d516007338989614054565b60038101549091506001600160801b0390811690861611611d725784611d81565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611da95783611dbf565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611e24576003810180546001600160801b031981166001600160801b03918216869003821617909155611e24907f0000000000000000000000000000000000000000000000000000000000000000908a9086166139f7565b6001600160801b03821615611e8a576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611e8a907f0000000000000000000000000000000000000000000000000000000000000000908a9085166139f7565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60066020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600054600160f01b900460ff16611fc1576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b916004808301926020929190829003018186803b15801561202e57600080fd5b505afa158015612042573d6000803e3d6000fd5b505050506040513d602081101561205857600080fd5b50516001600160a01b0316331461206e57600080fd5b60ff82161580612091575060048260ff16101580156120915750600a8260ff1611155b80156120bb575060ff811615806120bb575060048160ff16101580156120bb5750600a8160ff1611155b6120c457600080fd5b60008054610ff0600484901b16840160ff908116600160e81b90810260ff60e81b19841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c16602083015286831682820152918516606082015290519081900360800190a150506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff166121a8576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b916004808301926020929190829003018186803b15801561221557600080fd5b505afa158015612229573d6000803e3d6000fd5b505050506040513d602081101561223f57600080fd5b50516001600160a01b0316331461225557600080fd5b6003546001600160801b0390811690851611612271578361227e565b6003546001600160801b03165b6003549092506001600160801b03600160801b9091048116908416116122a457826122b8565b600354600160801b90046001600160801b03165b90506001600160801b03821615612339576003546001600160801b03838116911614156122e757600019909101905b600380546001600160801b031981166001600160801b03918216859003821617909155612339907f000000000000000000000000000000000000000000000000000000000000000090879085166139f7565b6001600160801b038116156123bf576003546001600160801b03828116600160801b90920416141561236a57600019015b600380546001600160801b03600160801b8083048216859003821602918116919091179091556123bf907f000000000000000000000000000000000000000000000000000000000000000090879084166139f7565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36000805460ff60f01b1916600160f01b1790559094909350915050565b606080612439612af7565b6124b0612444612b2e565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b9004166140b3565b915091509250929050565b600080548190600160f01b900460ff16612502576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061255b906060810161254e6001600160801b038a16613dc9565b600003600f0b9052613dda565b925092509250816000039450806000039350600085118061257c5750600084115b156125bb576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506000805460ff60f01b1916600160f01b179055509094909350915050565b600080600061263f612af7565b612649858561420b565b600285810b810b60009081526005602052604080822087840b90930b825281206003830154600681900b93600160381b82046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff16806126ad57600080fd5b6003820154600681900b9850600160381b81046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806126ee57600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e810b91900b121590506127975750939094039650900393509003905061281a565b8a60020b816020015160020b121561280b5760006127b3612b2e565b60208301516040840151600454606086015193945060009384936127e9936008938893879392916001600160801b031690613285565b9a9003989098039b50509490960392909203965090910303925061281a915050565b50949093039650039350900390505b9250925092565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612964576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b600061296f82613587565b905060008061298761297f612b2e565b6008906142d4565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff898116606088018190529089166080880181905260a08801839052600160c0909801979097528154600160f01b6001600160a01b0319909116871762ffffff60a01b1916600160a01b62ffffff9787900b97909716969096029590951763ffffffff60b81b1916600160c81b9091021761ffff60d81b1916600160d81b9096029590951761ffff60e81b191692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612aa057fe5b05029050600083600281900b620d89e881612ab757fe5b0502905060008460020b83830360020b81612ace57fe5b0560010190508062ffffff166001600160801b03801681612aeb57fe5b0493505050505b919050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612b2c57600080fd5b565b4290565b60008060008460020b8660020b81612b4657fe5b05905060008660020b128015612b6d57508460020b8660020b81612b6657fe5b0760020b15155b15612b7757600019015b8315612bec57600080612b8983614320565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612bce57888360ff16860302612be1565b88612bd882614332565b840360ff168603025b965050505050612c6a565b600080612bfb83600101614320565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612c4d57888360ff0360ff16866001010102612c63565b8883612c58836143cc565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612c8b578260020b612c93565b8260020b6000035b9050620d89e8811115612cd1576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612ce557600160801b612cf7565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b031690506002821615612d21576ffff97272373d413259a46990580e213a0260801c5b6004821615612d40576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612d5f576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612d7e576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612d9d576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612dbc576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612ddb576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612dfb576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612e1b576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612e3b576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612e5b576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612e7b576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612e9b576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612ebb576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612edb576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612efc576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612f1c576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612f3b576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612f58576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612f73578060001981612f6f57fe5b0490505b600160201b810615612f86576001612f89565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a161015818712801590613020576000612fd48989620f42400362ffffff16620f42406131d5565b905082612fed57612fe88c8c8c60016144b5565b612ffa565b612ffa8b8d8c6001614530565b955085811061300b578a965061301a565b6130178c8b83866145db565b96505b5061306a565b81613037576130328b8b8b6000614530565b613044565b6130448a8c8b60006144b5565b93508388600003106130585789955061306a565b6130678b8a8a60000385614627565b95505b6001600160a01b038a81169087161482156130cd578080156130895750815b61309f5761309a878d8c6001614530565b6130a1565b855b95508080156130ae575081155b6130c4576130bf878d8c60006144b5565b6130c6565b845b9450613117565b8080156130d75750815b6130ed576130e88c888c60016144b5565b6130ef565b855b95508080156130fc575081155b6131125761310d8c888c6000614530565b613114565b845b94505b8115801561312757508860000385115b15613133578860000394505b81801561315257508a6001600160a01b0316876001600160a01b031614155b1561316157858903935061317e565b61317b868962ffffff168a620f42400362ffffff1661401a565b93505b50505095509550955095915050565b6000600160ff1b821061319f57600080fd5b5090565b808203828113156000831215146131b957600080fd5b92915050565b818101828112156000831215146131b957600080fd5b600080806000198587098686029250828110908390030390508061320b576000841161320057600080fd5b50829004905061327e565b80841161321757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff871661332b576000898661ffff1661ffff81106132a657fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461331757613314818a8988614673565b90505b80602001518160400151925092505061340b565b8688036000806133408c8c858c8c8c8c614716565b91509150816000015163ffffffff168363ffffffff16141561337257816020015182604001519450945050505061340b565b805163ffffffff8481169116141561339a57806020015181604001519450945050505061340b565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b816133c857fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b031602816133fa57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b03600160381b808504821690960316909402600160381b600160d81b031990921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b121561353657826001600160801b03168260000384039150816001600160801b031610613531576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6131b9565b826001600160801b03168284019150816001600160801b031610156131b9576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906135c3575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b6135f8576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b600160201b600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061368a57607f810383901c9150613694565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c6001603f1b161760c19b909b1c6001603e1b169a909a1760c29990991c6001603d1b169890981760c39790971c6001603c1b169690961760c49590951c6001603b1b169490941760c59390931c6001603a1b169290921760c69190911c600160391b161760c79190911c600160381b161760c89190911c600160371b161760c99190911c600160361b161760ca9190911c600160351b161760cb9190911c600160341b161760cc9190911c600160331b161760cd9190911c600160321b1617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461386357886001600160a01b031661384782612c74565b6001600160a01b0316111561385c578161385e565b805b613865565b815b9998505050505050505050565b6000806000898961ffff1661ffff811061388857fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff1615156060830152909250891614156138f7578885925092505061340b565b8461ffff168461ffff1611801561391857506001850361ffff168961ffff16145b1561392557839150613929565b8491505b8161ffff168960010161ffff168161393d57fe5b06925061394c81898989614673565b8a8461ffff1661ffff811061395d57fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b02600160581b600160f81b031960069390930b66ffffffffffffff16600160201b0266ffffffffffffff60201b1963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613a735780518252601f199092019160209182019101613a54565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b5091509150818015613b08575080511580613b085750808060200190516020811015613b0557600080fd5b50515b613b3e576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693919290918291908083835b60208310613bde5780518252601f199092019160209182019101613bbf565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613c3e576040519150601f19603f3d011682016040523d82523d6000602084013e613c43565b606091505b5091509150818015613c5757506020815110155b613c6057600080fd5b808060200190516020811015613c7557600080fd5b50519250505090565b808201828110156131b957600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016939192909182919080838360208310613bde5780518252601f199092019160209182019101613bbf565b6000808361ffff1611613d64576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613d7a57508161327e565b825b8261ffff168161ffff161015613dc0576001858261ffff1661ffff8110613d9f57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613d7c565b50909392505050565b80600f81900b8114612af257600080fd5b6000806000613de7612af7565b613df98460200151856040015161420b565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c085015288519089015194890151928901519394613e9d9491939092909190614910565b93508460600151600f0b60001461401257846020015160020b816020015160020b1215613ef257613eeb613ed48660200151612c74565b613ee18760400151612c74565b8760600151614ac5565b9250614012565b846040015160020b816020015160020b1215613fe85760045460408201516001600160801b0390911690613f4490613f28612b2e565b6020850151606086015160808701516008949392918791613872565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b939092169290920217905581516040870151613f949190613f8a90612c74565b8860600151614ac5565b9350613fb2613fa68760200151612c74565b83516060890151614b09565b9250613fc28187606001516134d1565b600480546001600160801b0319166001600160801b039290921691909117905550614012565b61400f613ff88660200151612c74565b6140058760400151612c74565b8760600151614b09565b91505b509193909250565b60006140278484846131d5565b90506000828061403357fe5b848609111561327e57600019811061404a57600080fd5b6001019392505050565b6040805160609490941b6001600160601b031916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff16116140f3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b038111801561410a57600080fd5b50604051908082528060200260200182016040528015614134578160200160208202803683370190505b50915086516001600160401b038111801561414e57600080fd5b50604051908082528060200260200182016040528015614178578160200160208202803683370190505b50905060005b87518110156141fe576141a98a8a8a848151811061419857fe5b60200260200101518a8a8a8a613285565b8483815181106141b557fe5b602002602001018484815181106141c857fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b8152505050808060010191505061417e565b5097509795505050505050565b8060020b8260020b1261424b576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b121561428e576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b13156142d0576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b600080821161434057600080fd5b600160801b821061435357608091821c91015b600160401b821061436657604091821c91015b600160201b821061437957602091821c91015b62010000821061438b57601091821c91015b610100821061439c57600891821c91015b601082106143ac57600491821c91015b600482106143bc57600291821c91015b60028210612af257600101919050565b60008082116143da57600080fd5b5060ff6001600160801b038216156143f557607f19016143fd565b608082901c91505b6001600160401b0382161561441557603f190161441d565b604082901c91505b63ffffffff82161561443257601f190161443a565b602082901c91505b61ffff82161561444d57600f1901614455565b601082901c91505b60ff821615614467576007190161446f565b600882901c91505b600f8216156144815760031901614489565b600482901c91505b600382161561449b57600119016144a3565b600282901c91505b6001821615612af25760001901919050565b6000836001600160a01b0316856001600160a01b031611156144d5579293925b81614502576144fd836001600160801b03168686036001600160a01b0316600160601b6131d5565b614525565b614525836001600160801b03168686036001600160a01b0316600160601b61401a565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115614550579293925b600160601b600160e01b03606084901b166001600160a01b03868603811690871661457a57600080fd5b836145aa57866001600160a01b031661459d8383896001600160a01b03166131d5565b816145a457fe5b046145d0565b6145d06145c18383896001600160a01b031661401a565b886001600160a01b0316614b38565b979650505050505050565b600080856001600160a01b0316116145f257600080fd5b6000846001600160801b03161161460857600080fd5b8161461a576144fd8585856001614b43565b6145258585856001614c24565b600080856001600160a01b03161161463e57600080fd5b6000846001600160801b03161161465457600080fd5b81614666576144fd8585856000614c24565b6145258585856000614b43565b61467b615444565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116146cf5760016146d1565b845b6001600160801b031663ffffffff60801b608085901b16816146ef57fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b61471e615444565b614726615444565b888561ffff1661ffff811061473757fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061479b90899089614d07565b156147d3578663ffffffff16826000015163ffffffff1614156147bd5761340b565b816147ca83898988614673565b9150915061340b565b888361ffff168660010161ffff16816147e857fe5b0661ffff1661ffff81106147f857fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506148ad57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6148bc88836000015189614d07565b6148f3576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6149008989898887614dc8565b9150915097509795505050505050565b600061491f6007878787614054565b60015460025491925090600080600f87900b15614a65576000614940612b2e565b600080546004549293509091829161498a9160089186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b900416613285565b90925090506149c460058d8b8d8b8b87898b60007f0000000000000000000000000000000000000000000000000000000000000000614f66565b94506149fb60058c8b8d8b8b87898b60017f0000000000000000000000000000000000000000000000000000000000000000614f66565b93508415614a2f57614a2f60068d7f000000000000000000000000000000000000000000000000000000000000000061511f565b8315614a6157614a6160068c7f000000000000000000000000000000000000000000000000000000000000000061511f565b5050505b600080614a7760058c8c8b8a8a615185565b9092509050614a88878a8484615231565b600089600f0b1215614ab6578315614aa557614aa560058c6153c6565b8215614ab657614ab660058b6153c6565b50505050505095945050505050565b60008082600f0b12614aeb57614ae6614ae18585856001614530565b61318d565b614528565b614afe614ae18585856000036000614530565b600003949350505050565b60008082600f0b12614b2557614ae6614ae185858560016144b5565b614afe614ae185858560000360006144b5565b808204910615150190565b60008115614bb65760006001600160a01b03841115614b7957614b7484600160601b876001600160801b03166131d5565b614b91565b6001600160801b038516606085901b81614b8f57fe5b045b9050614bae614ba96001600160a01b03881683613c7e565b6153f2565b915050614528565b60006001600160a01b03841115614be457614bdf84600160601b876001600160801b031661401a565b614bfb565b614bfb606085901b6001600160801b038716614b38565b905080866001600160a01b031611614c1257600080fd5b6001600160a01b038616039050614528565b600082614c32575083614528565b600160601b600160e01b03606085901b168215614cc0576001600160a01b03861684810290858281614c6057fe5b041415614c9157818101828110614c8f57614c8583896001600160a01b03168361401a565b9350505050614528565b505b614cb782614cb2878a6001600160a01b03168681614cab57fe5b0490613c7e565b614b38565b92505050614528565b6001600160a01b03861684810290858281614cd757fe5b04148015614ce457508082115b614ced57600080fd5b808203614c85614ba9846001600160a01b038b168461401a565b60008363ffffffff168363ffffffff1611158015614d3157508363ffffffff168263ffffffff1611155b15614d4d578163ffffffff168363ffffffff161115905061327e565b60008463ffffffff168463ffffffff1611614d74578363ffffffff16600160201b01614d7c565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614dac578363ffffffff16600160201b01614db4565b8363ffffffff165b64ffffffffff169091111595945050505050565b614dd0615444565b614dd8615444565b60008361ffff168560010161ffff1681614dee57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff87168281614e1b57fe5b0661ffff8110614e2757fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909550614e9157806001019250614e06565b898661ffff168260010181614ea257fe5b0661ffff8110614eae57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201528551909450600090614f18908b908b614d07565b9050808015614f315750614f318a8a8760000151614d07565b15614f3c5750614f59565b80614f4c57600182039250614f53565b8160010193505b50614e06565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b031682614f91828d6134d1565b9050846001600160801b0316816001600160801b03161115614fdf576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b038281161590821615811415945015615084578c60020b8e60020b1361506c57600183018b9055600283018a9055600383018054600160381b600160d81b031916600160381b6001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180546001600160f81b0316600160f81b1790555b82546001600160801b0319166001600160801b038216178355856150cd5782546150c8906150c390600160801b9004600f90810b810b908f900b6131bf565b613dc9565b6150ee565b82546150ee906150c390600160801b9004600f90810b810b908f900b6131a3565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161512e57fe5b0760020b1561513c57600080fd5b6000806151578360020b8560020b8161515157fe5b05614320565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126151cb575050600182015460028301546151de565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561520057505060018301546002840154615213565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6152d05781516001600160801b03166152c8576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516152df565b81516152dc90866134d1565b90505b60006153038360200151860384600001516001600160801b0316600160801b6131d5565b905060006153298460400151860385600001516001600160801b0316600160801b6131d5565b905086600f0b6000146153505787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061537e57506000816001600160801b0316115b156153bc576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612af257600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea264697066735822122052f61fe72d906667606fc031ae2cb8ea2697540307903341488b08a09a9964f364736f6c63430007060033a26469706673582212209400a00e1165b67441801d6daf6b7cf3a3ca71cedec06719335608611678e21e64736f6c63430007060033c66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" /* - * cd ./solidity/lib/punch-swap-v3-contracts - * forge inspect src/swap-router/SwapRouter02.sol bytecode - */ +* cd ./solidity/lib/punch-swap-v3-contracts +* forge inspect src/swap-router/SwapRouter02.sol bytecode +*/ access(all) let swapRouter02Bytecode = "6101006040526000196000553480156200001857600080fd5b5060405162005016380380620050168339810160408190526200003b9162000087565b6001600160601b0319606094851b811660805291841b821660a05291831b811660c052911b1660e052620000e3565b80516001600160a01b03811681146200008257600080fd5b919050565b600080600080608085870312156200009d578384fd5b620000a8856200006a565b9350620000b8602086016200006a565b9250620000c8604086016200006a565b9150620000d8606086016200006a565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c614e9262000184600039806101d452806108f35280610f38528061102352806110bd5280611395528061148052806124ec528061253252806125a65250806112ac52806119e9528061310952508061124552806117375280611a2c52806129265250806109de5280610a985280610cf7528061122152806126d152806128385250614e926000f3fe6080604052600436106101c45760003560e01c806304e45aaf1461023957806309b813461461026257806311ed56c91461027557806312210e8a146102955780631c58db4f1461029d5780631f0464d1146102b05780633068c554146102d057806342712a67146102e35780634659a494146102f6578063472b43f31461030957806349404b7c1461031c578063496169971461032f5780634aa4a4fc146103425780635023b4df14610364578063571ac8b0146103775780635ae401dc1461038a578063639d71a91461039d57806368e0d4e1146103b0578063791b98bc146103c55780637ee355e6146103da5780639b2c0a37146103fa578063a4a78f0c1461040d578063ab3fdd5014610420578063ac9650d814610433578063b3a2af1314610446578063b858183f14610459578063c2e3140a1461046c578063c45a01551461047f578063cab372ce14610494578063d4ef38de146104a7578063dee00f35146104ba578063df2ab5bb146104e7578063e0e189a0146104fa578063e90a182f1461050d578063efdeed8e14610520578063f100b20514610540578063f25801a714610553578063f2d5d56b14610573578063f3995c671461058657610234565b3661023457336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610232576040805162461bcd60e51b81526020600482015260096024820152684e6f7420574554483960b81b604482015290519081900360640190fd5b005b600080fd5b61024c610247366004614575565b610599565b6040516102599190614d10565b60405180910390f35b61024c61027036600461460f565b6106d4565b610288610283366004614668565b61077c565b6040516102599190614afc565b6102326108df565b6102326102ab3660046147ea565b6108f1565b6102c36102be3660046142df565b610968565b6040516102599190614a9c565b6102326102de366004614112565b6109c4565b61024c6102f13660046148b4565b6109d7565b61023261030436600461415b565b610b7d565b61024c6103173660046148b4565b610c17565b61023261032a36600461481a565b610f34565b61023261033d3660046147ea565b6110ae565b34801561034e57600080fd5b506103576110bb565b6040516102599190614a0f565b61024c610372366004614646565b6110df565b610232610385366004614025565b6111a1565b6102c36103983660046142df565b6111b6565b6102326103ab366004614025565b61120b565b3480156103bc57600080fd5b5061035761121f565b3480156103d157600080fd5b50610357611243565b3480156103e657600080fd5b506102326103f53660046143ed565b611267565b610232610408366004614849565b611377565b61023261041b36600461415b565b611541565b61023261042e366004614025565b6115d2565b6102c36104413660046141b6565b6115f2565b610288610454366004614328565b611731565b61024c6104673660046144d0565b6117e2565b61023261047a36600461415b565b611958565b34801561048b57600080fd5b506103576119e7565b6102326104a2366004614025565b6115e6565b6102326104b5366004614887565b611a0b565b3480156104c657600080fd5b506104da6104d5366004614048565b611a17565b6040516102599190614b0f565b6102326104f5366004614073565b611b3f565b6102326105083660046140b4565b611c17565b61023261051b366004614048565b611d3e565b34801561052c57600080fd5b5061023261053b3660046141f5565b611d4d565b61028861054e366004614657565b611d85565b34801561055f57600080fd5b5061023261056e36600461435a565b611e07565b610232610581366004614048565b611e3e565b61023261059436600461415b565b611e4a565b600080600083608001511415610630575081516040516370a0823160e01b81526001916001600160a01b0316906370a08231906105da903090600401614a0f565b60206040518083038186803b1580156105f257600080fd5b505afa158015610606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062a9190614802565b60808401525b61069f836080015184606001518560c001516040518060400160405280886000015189604001518a6020015160405160200161066e939291906149ad565b60405160208183030381529060405281526020018661068d573361068f565b305b6001600160a01b03169052611ebc565b91508260a001518210156106ce5760405162461bcd60e51b81526004016106c590614ba5565b60405180910390fd5b50919050565b6000610748604083018035906106ed9060208601614025565b60408051808201909152600090806107058880614d46565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360209091015261202c565b505060005460608201358111156107715760405162461bcd60e51b81526004016106c590614b5d565b600019600055919050565b6040805161016081019091526060906108d790634418b22b60e11b90806107a66020870187614025565b6001600160a01b031681526020018560200160208101906107c79190614025565b6001600160a01b031681526020016107e560608701604088016147d0565b62ffffff1681526020016107ff60808701606088016143ae565b60020b815260200161081760a08701608088016143ae565b60020b81526020908101906108379061083290880188614025565b6121c5565b81526020016108528660200160208101906108329190614025565b815260a0860135602082015260c0860135604082015260600161087c610100870160e08801614025565b6001600160a01b031681526020016000198152506040516024016108a09190614c16565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611731565b90505b919050565b47156108ef576108ef3347612244565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561094c57600080fd5b505af1158015610960573d6000803e3d6000fd5b505050505050565b606083806001430340146109af576040805162461bcd60e51b8152602060048201526009602482015268084d8dec6d6d0c2e6d60bb1b604482015290519081900360640190fd5b6109b984846115f2565b91505b509392505050565b6109d18484338585611c17565b50505050565b6000610a377f00000000000000000000000000000000000000000000000000000000000000008786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061233392505050565b600081518110610a4357fe5b6020026020010151905084811115610a6d5760405162461bcd60e51b81526004016106c590614b5d565b610b0684846000818110610a7d57fe5b9050602002016020810190610a929190614025565b33610b007f000000000000000000000000000000000000000000000000000000000000000088886000818110610ac457fe5b9050602002016020810190610ad99190614025565b89896001818110610ae657fe5b9050602002016020810190610afb9190614025565b61242f565b846124ea565b6001600160a01b03821660011415610b2057339150610b36565b6001600160a01b03821660021415610b36573091505b610b7484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061267a915050565b95945050505050565b604080516323f2ebc360e21b815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e4810183905290516001600160a01b03881691638fcbaf0c9161010480830192600092919082900301818387803b158015610bf757600080fd5b505af1158015610c0b573d6000803e3d6000fd5b50505050505050505050565b60008086610cc0575060018484600081610c2d57fe5b9050602002016020810190610c429190614025565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c6d9190614a0f565b60206040518083038186803b158015610c8557600080fd5b505afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190614802565b96505b610d4b85856000818110610cd057fe5b9050602002016020810190610ce59190614025565b82610cf05733610cf2565b305b610d457f000000000000000000000000000000000000000000000000000000000000000089896000818110610d2357fe5b9050602002016020810190610d389190614025565b8a8a6001818110610ae657fe5b8a6124ea565b6001600160a01b03831660011415610d6557339250610d7b565b6001600160a01b03831660021415610d7b573092505b600085856000198101818110610d8d57fe5b9050602002016020810190610da29190614025565b6001600160a01b03166370a08231856040518263ffffffff1660e01b8152600401610dcd9190614a0f565b60206040518083038186803b158015610de557600080fd5b505afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190614802565b9050610e5d86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061267a915050565b610f078187876000198101818110610e7157fe5b9050602002016020810190610e869190614025565b6001600160a01b03166370a08231876040518263ffffffff1660e01b8152600401610eb19190614a0f565b60206040518083038186803b158015610ec957600080fd5b505afa158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f019190614802565b906128fd565b925086831015610f295760405162461bcd60e51b81526004016106c590614ba5565b505095945050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d6020811015610fcd57600080fd5b505190508281101561101b576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b604482015290519081900360640190fd5b80156110a9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561108757600080fd5b505af115801561109b573d6000803e3d6000fd5b505050506110a98282612244565b505050565b6110b88133610f34565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061117b608083018035906110f89060608601614025565b61110860e0860160c08701614025565b60405180604001604052808760200160208101906111269190614025565b61113660608a0160408b016147d0565b61114360208b018b614025565b604051602001611155939291906149ad565b6040516020818303038152906040528152602001336001600160a01b031681525061202c565b90508160a001358111156107715760405162461bcd60e51b81526004016106c590614b5d565b6111ad8160001961290d565b6110b857600080fd5b606083806111c2612a01565b11156109af576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b61121681600061290d565b6111a157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008413806112765750600083135b61127f57600080fd5b600061128d8284018461467a565b905060008060006112a18460000151612a05565b9250925092506112d37f0000000000000000000000000000000000000000000000000000000000000000848484612a36565b5060008060008a136112fa57846001600160a01b0316846001600160a01b03161089611311565b836001600160a01b0316856001600160a01b0316108a5b9150915081156113305761132b85876020015133846124ea565b610c0b565b855161133b90612a4c565b1561136057855161134b90612a54565b865261135a813360008961202c565b50610c0b565b80600081905550610c0b84876020015133846124ea565b600082118015611388575060648211155b61139157600080fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561140057600080fd5b505afa158015611414573d6000803e3d6000fd5b505050506040513d602081101561142a57600080fd5b5051905084811015611478576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b604482015290519081900360640190fd5b801561153a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e457600080fd5b505af11580156114f8573d6000803e3d6000fd5b5050505060006127106115148584612a6b90919063ffffffff16565b8161151b57fe5b049050801561152e5761152e8382612244565b61096085828403612244565b5050505050565b60408051636eb1769f60e11b81523360048201523060248201529051600019916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561159257600080fd5b505afa1580156115a6573d6000803e3d6000fd5b505050506040513d60208110156115bc57600080fd5b5051101561096057610960868686868686610b7d565b6115dd81600061290d565b6115e657600080fd5b6111ad8160011961290d565b6060816001600160401b038111801561160a57600080fd5b5060405190808252806020026020018201604052801561163e57816020015b60608152602001906001900390816116295790505b50905060005b8281101561172a576000803086868581811061165c57fe5b905060200281019061166e9190614d46565b60405161167c9291906149e3565b600060405180830381855af49150503d80600081146116b7576040519150601f19603f3d011682016040523d82523d6000602084013e6116bc565b606091505b509150915081611708576044815110156116d557600080fd5b600481019050808060200190518101906116ef9190614467565b60405162461bcd60e51b81526004016106c59190614afc565b8084848151811061171557fe5b60209081029190910101525050600101611644565b5092915050565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168360405161176d91906149f3565b6000604051808303816000865af19150503d80600081146117aa576040519150601f19603f3d011682016040523d82523d6000602084013e6117af565b606091505b5092509050806106ce576044825110156117c857600080fd5b600482019150818060200190518101906116ef9190614467565b60008060008360400151141561188d576001905060006118058460000151612a05565b50506040516370a0823160e01b81529091506001600160a01b038216906370a0823190611836903090600401614a0f565b60206040518083038186803b15801561184e57600080fd5b505afa158015611862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118869190614802565b6040850152505b60008161189a573361189c565b305b90505b60006118ae8560000151612a4c565b90506118fa8560400151826118c75786602001516118c9565b305b600060405180604001604052806118e38b60000151612a8f565b8152602001876001600160a01b0316815250611ebc565b6040860152801561191a57845130925061191390612a54565b8552611927565b846040015193505061192d565b5061189f565b83606001518310156119515760405162461bcd60e51b81526004016106c590614ba5565b5050919050565b60408051636eb1769f60e11b8152336004820152306024820152905186916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b1580156119a757600080fd5b505afa1580156119bb573d6000803e3d6000fd5b505050506040513d60208110156119d157600080fd5b5051101561096057610960868686868686611e4a565b7f000000000000000000000000000000000000000000000000000000000000000081565b6110a983338484611377565b600081836001600160a01b031663dd62ed3e307f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a68929190614a23565b60206040518083038186803b158015611a8057600080fd5b505afa158015611a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab89190614802565b10611ac557506000611b39565b611ad18360001961290d565b15611ade57506001611b39565b611aea8360011961290d565b15611af757506002611b39565b611b0283600061290d565b611b0b57600080fd5b611b178360001961290d565b15611b2457506003611b39565b611b308360011961290d565b15610234575060045b92915050565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d6020811015611bb857600080fd5b5051905082811015611c06576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b80156109d1576109d1848383612a9e565b600082118015611c28575060648211155b611c3157600080fd5b6000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c8057600080fd5b505afa158015611c94573d6000803e3d6000fd5b505050506040513d6020811015611caa57600080fd5b5051905084811015611cf8576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b8015610960576000612710611d0d8386612a6b565b81611d1457fe5b0490508015611d2857611d28878483612a9e565b611d358786838503612a9e565b50505050505050565b611d49828233611b3f565b5050565b600080611d5b868685612be5565b915091508362ffffff16818303126109605760405162461bcd60e51b81526004016106c590614b89565b60606108d763219f5d1760e01b6040518060c0016040528085604001358152602001611dbd8660000160208101906108329190614025565b8152602001611dd88660200160208101906108329190614025565b815260200185606001358152602001856080013581526020016000198152506040516024016108a09190614bd2565b600080611e148584612ddb565b915091508362ffffff168183031261153a5760405162461bcd60e51b81526004016106c590614b89565b611d4982333084612fb2565b6040805163d505accf60e01b8152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c4810183905290516001600160a01b0388169163d505accf9160e480830192600092919082900301818387803b158015610bf757600080fd5b60006001600160a01b03841660011415611ed857339350611eee565b6001600160a01b03841660021415611eee573093505b6000806000611f008560000151612a05565b919450925090506001600160a01b0380831690841610600080611f24868686613102565b6001600160a01b031663128acb088b85611f3d8f613140565b6001600160a01b038e1615611f52578d611f78565b87611f715773fffd8963efd1fc6a506488495d951d5263988d25611f78565b6401000276a45b8d604051602001611f899190614cc4565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611fb8959493929190614a3d565b6040805180830381600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200991906143ca565b9150915082612018578161201a565b805b6000039b9a5050505050505050505050565b60006001600160a01b038416600114156120485733935061205e565b6001600160a01b0384166002141561205e573093505b60008060006120708560000151612a05565b919450925090506001600160a01b0380841690831610600080612094858786613102565b6001600160a01b031663128acb088b856120ad8f613140565b6000036001600160a01b038e16156120c5578d6120eb565b876120e45773fffd8963efd1fc6a506488495d951d5263988d256120eb565b6401000276a45b8d6040516020016120fc9190614cc4565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161212b959493929190614a3d565b6040805180830381600087803b15801561214457600080fd5b505af1158015612158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217c91906143ca565b91509150600083612191578183600003612197565b82826000035b90985090506001600160a01b038a166121b6578b81146121b657600080fd5b50505050505050949350505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a08231906121f4903090600401614a0f565b60206040518083038186803b15801561220c57600080fd5b505afa158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d79190614802565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106122905780518252601f199092019160209182019101612271565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146122f2576040519150601f19603f3d011682016040523d82523d6000602084013e6122f7565b606091505b50509050806110a9576040805162461bcd60e51b815260206004820152600360248201526253544560e81b604482015290519081900360640190fd5b606060028251101561234457600080fd5b81516001600160401b038111801561235b57600080fd5b50604051908082528060200260200182016040528015612385578160200160208202803683370190505b509050828160018351038151811061239957fe5b60209081029190910101528151600019015b80156109bc576000806123e8878660018603815181106123c757fe5b60200260200101518786815181106123db57fe5b6020026020010151613156565b9150915061240a8484815181106123fb57fe5b6020026020010151838361321d565b84600185038151811061241957fe5b60209081029190910101525050600019016123ab565b600080600061243e85856132d6565b604080516001600160601b0319606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8459dfd5a1a23cec2bad3db1e04934bdd164b3846fdc504ed60810c73994b02f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614801561252b5750804710155b1561264d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b505050506040513d602081101561264557600080fd5b506109d19050565b6001600160a01b03831630141561266e57612669848383612a9e565b6109d1565b6109d184848484612fb2565b60005b60018351038110156110a95760008084838151811061269857fe5b60200260200101518584600101815181106126af57fe5b60200260200101519150915060006126c783836132d6565b50905060006126f77f0000000000000000000000000000000000000000000000000000000000000000858561242f565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561273857600080fd5b505afa15801561274c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127709190614709565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b0316146127aa5782846127ad565b83835b915091506127e1828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401610eb19190614a0f565b95506127ee86838361333a565b945050505050600080856001600160a01b0316886001600160a01b0316146128185782600061281c565b6000835b91509150600060028c51038a10612833578a612874565b6128747f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061286757fe5b602002602001015161242f565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906128b69086908690869060248101614d19565b600060405180830381600087803b1580156128d057600080fd5b505af11580156128e4573d6000803e3d6000fd5b50506001909b019a5061267d9950505050505050505050565b80820382811115611b3957600080fd5b6000806000846001600160a01b031663095ea7b360e01b7f000000000000000000000000000000000000000000000000000000000000000086604051602401612957929190614a83565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161299591906149f3565b6000604051808303816000865af19150503d80600081146129d2576040519150601f19603f3d011682016040523d82523d6000602084013e6129d7565b606091505b5091509150818015610b74575080511580610b74575080806020019051810190610b7491906142c5565b4290565b60008080612a1384826133f2565b9250612a208460146134a2565b9050612a2d8460176133f2565b91509193909250565b6000610b7485612a47868686613549565b61359f565b516042111590565b80516060906108d7908390601790601619016135c2565b6000821580612a8657505081810281838281612a8357fe5b04145b611b3957600080fd5b60606108d7826000602b6135c2565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310612b1a5780518252601f199092019160209182019101612afb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b7c576040519150601f19603f3d011682016040523d82523d6000602084013e612b81565b606091505b5091509150818015612baf575080511580612baf5750808060200190516020811015612bac57600080fd5b50515b61153a576040805162461bcd60e51b815260206004820152600260248201526114d560f21b604482015290519081900360640190fd5b6000808351855114612bf657600080fd5b600085516001600160401b0381118015612c0f57600080fd5b50604051908082528060200260200182016040528015612c4957816020015b612c36613e7f565b815260200190600190039081612c2e5790505b509050600086516001600160401b0381118015612c6557600080fd5b50604051908082528060200260200182016040528015612c9f57816020015b612c8c613e7f565b815260200190600190039081612c845790505b50905060005b8751811015612db457600080612cce8a8481518110612cc057fe5b602002602001015189612ddb565b91509150612cdb82613713565b858481518110612ce757fe5b60200260200101516000019060020b908160020b81525050612d0881613713565b848481518110612d1457fe5b60200260200101516000019060020b908160020b81525050888381518110612d3857fe5b6020026020010151858481518110612d4c57fe5b6020026020010151602001906001600160801b031690816001600160801b031681525050888381518110612d7c57fe5b6020026020010151848481518110612d9057fe5b6020908102919091018101516001600160801b039092169101525050600101612ca5565b50612dbe82613724565b60020b9350612dcc81613724565b60020b92505050935093915050565b600080600080612dea866137dc565b90506000805b82811015612f93576000806000612e068b612a05565b9250925092506000612e19848484613102565b905060008063ffffffff8d16612e4257612e32836137e9565b600291820b9350900b9050612ed7565b612e4c838e613a26565b8160020b91505080925050826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015612e9057600080fd5b505afa158015612ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec89190614744565b50505060029290920b93505050505b60018903871415612efe57846001600160a01b0316866001600160a01b0316109950612f0d565b612f078e612a54565b9d508597505b6000871580612f605750866001600160a01b0316896001600160a01b031610612f4a57866001600160a01b0316866001600160a01b031610612f60565b856001600160a01b0316876001600160a01b0316105b90508015612f75579b82019b9a81019a612f80565b828d039c50818c039b505b505060019095019450612df09350505050565b5082612fa85760001985029450600019840293505b5050509250929050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b602083106130365780518252601f199092019160209182019101613017565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613098576040519150601f19603f3d011682016040523d82523d6000602084013e61309d565b606091505b50915091508180156130cb5750805115806130cb57508080602001905160208110156130c857600080fd5b50515b610960576040805162461bcd60e51b815260206004820152600360248201526229aa2360e91b604482015290519081900360640190fd5b60006131387f0000000000000000000000000000000000000000000000000000000000000000613133868686613549565b613d90565b949350505050565b6000600160ff1b821061315257600080fd5b5090565b600080600061316585856132d6565b50905060008061317688888861242f565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156131ae57600080fd5b505afa1580156131c2573d6000803e3d6000fd5b505050506040513d60608110156131d857600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461320b57808261320e565b81815b90999098509650505050505050565b6000808411613270576040805162461bcd60e51b815260206004820152601a602482015279125394d551919250d251539517d3d55514155517d05353d5539560321b604482015290519081900360640190fd5b6000831180156132805750600082115b61328957600080fd5b60006132a16103e861329b8688612a6b565b90612a6b565b905060006132b56103e561329b86896128fd565b90506132cc60018284816132c557fe5b0490613e6f565b9695505050505050565b600080826001600160a01b0316846001600160a01b031614156132f857600080fd5b826001600160a01b0316846001600160a01b03161061331857828461331b565b83835b90925090506001600160a01b03821661333357600080fd5b9250929050565b600080841161338c576040805162461bcd60e51b8152602060048201526019602482015278125394d551919250d251539517d25394155517d05353d55395603a1b604482015290519081900360640190fd5b60008311801561339c5750600082115b6133a557600080fd5b60006133b3856103e5612a6b565b905060006133c18285612a6b565b905060006133db836133d5886103e8612a6b565b90613e6f565b90508082816133e657fe5b04979650505050505050565b600081826014011015613441576040805162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b604482015290519081900360640190fd5b8160140183511015613492576040805162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b604482015290519081900360640190fd5b500160200151600160601b900490565b6000818260030110156134f0576040805162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b604482015290519081900360640190fd5b8160030183511015613540576040805162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b604482015290519081900360640190fd5b50016003015190565b613551613e96565b826001600160a01b0316846001600160a01b0316111561356f579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b60006135ab8383613d90565b9050336001600160a01b03821614611b3957600080fd5b60608182601f01101561360d576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015613655576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156136a1576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156136c0576040519150600082526020820160405261370a565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156136f95780518352602092830192016136e1565b5050858452601f01601f1916604052505b50949350505050565b80600281900b81146108da57600080fd5b6000806000805b84518110156137a75784818151811061374057fe5b6020026020010151602001516001600160801b031685828151811061376157fe5b60200260200101516000015160020b028301925084818151811061378157fe5b6020026020010151602001516001600160801b031682019150808060010191505061372b565b508082816137b157fe5b0592506000821280156137cc57508082816137c857fe5b0715155b1561195157505060001901919050565b5160176013199091010490565b600080600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561382857600080fd5b505afa15801561383c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138609190614744565b50939750919550935050600161ffff841611915061389290505760405162461bcd60e51b81526004016106c590614b40565b600080866001600160a01b031663252c09d7856040518263ffffffff1660e01b81526004016138c19190614d01565b60806040518083038186803b1580156138d957600080fd5b505afa1580156138ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613911919061490e565b50509150915061391f612a01565b63ffffffff168263ffffffff161461393957849550613a1d565b60008361ffff1660018561ffff168761ffff1601038161395557fe5b06905060008060008a6001600160a01b031663252c09d7856040518263ffffffff1660e01b81526004016139899190614d10565b60806040518083038186803b1580156139a157600080fd5b505afa1580156139b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d9919061490e565b93505092509250806139fd5760405162461bcd60e51b81526004016106c590614b23565b82860363ffffffff811683870360060b81613a1457fe5b059a5050505050505b50505050915091565b60008063ffffffff8316613a66576040805162461bcd60e51b8152602060048201526002602482015261042560f41b604482015290519081900360640190fd5b6040805160028082526060820183526000926020830190803683370190505090508381600081518110613a9557fe5b602002602001019063ffffffff16908163ffffffff1681525050600081600181518110613abe57fe5b63ffffffff90921660209283029190910182015260405163883bdbfd60e01b81526004810182815283516024830152835160009384936001600160a01b038b169363883bdbfd9388939192839260449091019185820191028083838b5b83811015613b33578181015183820152602001613b1b565b505050509050019250505060006040518083038186803b158015613b5657600080fd5b505afa158015613b6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613b9357600080fd5b8101908080516040519392919084600160201b821115613bb257600080fd5b908301906020820185811115613bc757600080fd5b82518660208202830111600160201b82111715613be357600080fd5b82525081516020918201928201910280838360005b83811015613c10578181015183820152602001613bf8565b5050505090500160405260200180516040519392919084600160201b821115613c3857600080fd5b908301906020820185811115613c4d57600080fd5b82518660208202830111600160201b82111715613c6957600080fd5b82525081516020918201928201910280838360005b83811015613c96578181015183820152602001613c7e565b5050505090500160405250505091509150600082600081518110613cb657fe5b602002602001015183600181518110613ccb57fe5b6020026020010151039050600082600081518110613ce557fe5b602002602001015183600181518110613cfa57fe5b60200260200101510390508763ffffffff168260060b81613d1757fe5b05965060008260060b128015613d4157508763ffffffff168260060b81613d3a57fe5b0760060b15155b15613d4e57600019909601955b63ffffffff88166001600160a01b0302600160201b600160c01b03602083901b166001600160c01b03821681613d8057fe5b0496505050505050509250929050565b600081602001516001600160a01b031682600001516001600160a01b031610613db857600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b80820182811015611b3957600080fd5b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b80356108da81614e17565b60008083601f840112613ed2578182fd5b5081356001600160401b03811115613ee8578182fd5b602083019150836020808302850101111561333357600080fd5b600082601f830112613f12578081fd5b81356020613f27613f2283614dad565b614d8a565b8281528181019085830183850287018401881015613f43578586fd5b855b85811015613f755781356001600160801b0381168114613f63578788fd5b84529284019290840190600101613f45565b5090979650505050505050565b805180151581146108da57600080fd5b600082601f830112613fa2578081fd5b8135613fb0613f2282614dca565b818152846020838601011115613fc4578283fd5b816020850160208301379081016020019190915292915050565b80516001600160701b03811681146108da57600080fd5b805161ffff811681146108da57600080fd5b803562ffffff811681146108da57600080fd5b80356108da81614e3b565b600060208284031215614036578081fd5b813561404181614e17565b9392505050565b6000806040838503121561405a578081fd5b823561406581614e17565b946020939093013593505050565b600080600060608486031215614087578081fd5b833561409281614e17565b92506020840135915060408401356140a981614e17565b809150509250925092565b600080600080600060a086880312156140cb578283fd5b85356140d681614e17565b94506020860135935060408601356140ed81614e17565b925060608601359150608086013561410481614e17565b809150509295509295909350565b60008060008060808587031215614127578182fd5b843561413281614e17565b93506020850135925060408501359150606085013561415081614e17565b939692955090935050565b60008060008060008060c08789031215614173578384fd5b863561417e81614e17565b95506020870135945060408701359350606087013561419c81614e4d565b9598949750929560808101359460a0909101359350915050565b600080602083850312156141c8578182fd5b82356001600160401b038111156141dd578283fd5b6141e985828601613ec1565b90969095509350505050565b6000806000806080858703121561420a578182fd5b84356001600160401b0380821115614220578384fd5b818701915087601f830112614233578384fd5b81356020614243613f2283614dad565b82815281810190858301885b85811015614278576142668e8684358b0101613f92565b8452928401929084019060010161424f565b50909950505088013592505080821115614290578384fd5b5061429d87828801613f02565b9350506142ac60408601614007565b91506142ba6060860161401a565b905092959194509250565b6000602082840312156142d6578081fd5b61404182613f82565b6000806000604084860312156142f3578081fd5b8335925060208401356001600160401b0381111561430f578182fd5b61431b86828701613ec1565b9497909650939450505050565b600060208284031215614339578081fd5b81356001600160401b0381111561434e578182fd5b61313884828501613f92565b60008060006060848603121561436e578081fd5b83356001600160401b03811115614383578182fd5b61438f86828701613f92565b93505061439e60208501614007565b915060408401356140a981614e3b565b6000602082840312156143bf578081fd5b813561404181614e2c565b600080604083850312156143dc578182fd5b505080516020909101519092909150565b60008060008060608587031215614402578182fd5b843593506020850135925060408501356001600160401b0380821115614426578384fd5b818701915087601f830112614439578384fd5b813581811115614447578485fd5b886020828501011115614458578485fd5b95989497505060200194505050565b600060208284031215614478578081fd5b81516001600160401b0381111561448d578182fd5b8201601f8101841361449d578182fd5b80516144ab613f2282614dca565b8181528560208385010111156144bf578384fd5b610b74826020830160208601614deb565b6000602082840312156144e1578081fd5b81356001600160401b03808211156144f7578283fd5b908301906080828603121561450a578283fd5b60405160808101818110838211171561451f57fe5b604052823582811115614530578485fd5b61453c87828601613f92565b8252506020830135915061454f82614e17565b816020820152604083013560408201526060830135606082015280935050505092915050565b600060e08284031215614586578081fd5b60405160e081016001600160401b03811182821017156145a257fe5b6040526145ae83613eb6565b81526145bc60208401613eb6565b60208201526145cd60408401614007565b60408201526145de60608401613eb6565b60608201526080830135608082015260a083013560a082015261460360c08401613eb6565b60c08201529392505050565b600060208284031215614620578081fd5b81356001600160401b03811115614635578182fd5b820160808185031215614041578182fd5b600060e082840312156106ce578081fd5b600060a082840312156106ce578081fd5b600061010082840312156106ce578081fd5b60006020828403121561468b578081fd5b81356001600160401b03808211156146a1578283fd5b90830190604082860312156146b4578283fd5b6040516040810181811083821117156146c957fe5b6040528235828111156146da578485fd5b6146e687828601613f92565b825250602083013592506146f983614e17565b6020810192909252509392505050565b60008060006060848603121561471d578081fd5b61472684613fde565b925061473460208501613fde565b915060408401516140a981614e3b565b600080600080600080600060e0888a03121561475e578485fd5b875161476981614e17565b602089015190975061477a81614e2c565b955061478860408901613ff5565b945061479660608901613ff5565b93506147a460808901613ff5565b925060a08801516147b481614e4d565b91506147c260c08901613f82565b905092959891949750929550565b6000602082840312156147e1578081fd5b61404182614007565b6000602082840312156147fb578081fd5b5035919050565b600060208284031215614813578081fd5b5051919050565b6000806040838503121561482c578182fd5b82359150602083013561483e81614e17565b809150509250929050565b6000806000806080858703121561485e578182fd5b84359350602085013561487081614e17565b925060408501359150606085013561415081614e17565b60008060006060848603121561489b578081fd5b833592506020840135915060408401356140a981614e17565b6000806000806000608086880312156148cb578283fd5b853594506020860135935060408601356001600160401b038111156148ee578384fd5b6148fa88828901613ec1565b909450925050606086013561410481614e17565b60008060008060808587031215614923578182fd5b845161492e81614e3b565b8094505060208501518060060b8114614945578283fd5b604086015190935061495681614e17565b91506142ba60608601613f82565b6001600160a01b03169052565b60008151808452614989816020860160208601614deb565b601f01601f19169290920160200192915050565b60020b9052565b62ffffff169052565b606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b6000828483379101908152919050565b60008251614a05818460208701614deb565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a060808201819052600090614a7890830184614971565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015614aef57603f19888603018452614add858351614971565b94509285019290850190600101614ac1565b5092979650505050505050565b6000602082526140416020830184614971565b6020810160058310614b1d57fe5b91905290565b6020808252600390820152624f4e4960e81b604082015260600190565b6020808252600390820152624e454f60e81b604082015260600190565b602080825260129082015271151bdbc81b5d58da081c995c5d595cdd195960721b604082015260600190565b602080825260029082015261151160f21b604082015260600190565b602080825260139082015272151bdbc81b1a5d1d1b19481c9958d95a5d9959606a1b604082015260600190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b600061016082019050614c2a828451614964565b6020830151614c3c6020840182614964565b506040830151614c4f60408401826149a4565b506060830151614c62606084018261499d565b506080830151614c75608084018261499d565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151614cb382850182614964565b505061014092830151919092015290565b600060208252825160406020840152614ce06060840182614971565b602094909401516001600160a01b0316604093909301929092525090919050565b61ffff91909116815260200190565b90815260200190565b600085825284602083015260018060a01b0384166040830152608060608301526132cc6080830184614971565b6000808335601e19843603018112614d5c578283fd5b8301803591506001600160401b03821115614d75578283fd5b60200191503681900382131561333357600080fd5b6040518181016001600160401b0381118282101715614da557fe5b604052919050565b60006001600160401b03821115614dc057fe5b5060209081020190565b60006001600160401b03821115614ddd57fe5b50601f01601f191660200190565b60005b83811015614e06578181015183820152602001614dee565b838111156109d15750506000910152565b6001600160a01b03811681146110b857600080fd5b8060020b81146110b857600080fd5b63ffffffff811681146110b857600080fd5b60ff811681146110b857600080fdfea2646970667358221220953eba4c9720f483abb9e5f941231ad19fa89f7b79df18b067b4ba550557f3f964736f6c63430007060033" /* - * cd ./solidity/lib/punch-swap-v3-contracts - * forge inspect src/periphery/lens/QuoterV2.sol bytecode - */ +* cd ./solidity/lib/punch-swap-v3-contracts +* forge inspect src/periphery/lens/QuoterV2.sol bytecode +*/ access(all) let quoterV2Bytecode = "60c06040523480156200001157600080fd5b5060405162001bce38038062001bce833981016040819052620000349162000070565b6001600160601b0319606092831b8116608052911b1660a052620000a7565b80516001600160a01b03811681146200006b57600080fd5b919050565b6000806040838503121562000083578182fd5b6200008e8362000053565b91506200009e6020840162000053565b90509250929050565b60805160601c60a05160601c611af3620000db600039806102ce525080610321528061064052806109fa5250611af36000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c80632f80bb1d146100725780634aa4a4fc1461009e5780637ee355e6146100b3578063bd21704a146100c8578063c45a0155146100eb578063c6a5026a146100f3578063cdca175314610106575b600080fd5b610085610080366004611662565b610119565b604051610095949392919061196c565b60405180910390f35b6100a66102cc565b60405161009591906118d5565b6100c66100c13660046116c7565b6102f0565b005b6100db6100d636600461177d565b61046b565b6040516100959493929190611a07565b6100a661063e565b6100db61010136600461177d565b610662565b610085610114366004611662565b6107d8565b600060608060006101298661096d565b6001600160401b038111801561013e57600080fd5b50604051908082528060200260200182016040528015610168578160200160208202803683370190505b5092506101748661096d565b6001600160401b038111801561018957600080fd5b506040519080825280602002602001820160405280156101b3578160200160208202803683370190505b50915060005b60008060006101c78a61097e565b9250925092506000806000806102236040518060a00160405280886001600160a01b03168152602001896001600160a01b031681526020018f81526020018762ffffff16815260200160006001600160a01b031681525061046b565b9350935093509350828b898151811061023857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818a898151811061026557fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926102928e6109af565b156102a7576102a08e6109b7565b9d506102b7565b8c9b5050505050505050506102c3565b505050505050506101b9565b92959194509250565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008313806102ff5750600082135b61030857600080fd5b60008060006103168461097e565b9250925092506103487f00000000000000000000000000000000000000000000000000000000000000008484846109d4565b50600080600080891361037457856001600160a01b0316856001600160a01b031610888a60000361038f565b846001600160a01b0316866001600160a01b03161089896000035b92509250925060006103a28787876109f3565b9050600080826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156103e057600080fd5b505afa1580156103f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610418919061179f565b505050505091509150851561043e57604051848152826020820152816040820152606081fd5b6000541561045457600054841461045457600080fd5b604051858152826020820152816040820152606081fd5b6020810151815160608301516000928392839283926001600160a01b038082169084161092849261049c92906109f3565b905086608001516001600160a01b0316600014156104bd5760408701516000555b60005a9050816001600160a01b031663128acb0830856104e08c60400151610a31565b6000038c608001516001600160a01b0316600014610502578c60800151610528565b876105215773fffd8963efd1fc6a506488495d951d5263988d25610528565b6401000276a45b8d602001518e606001518f600001516040516020016105499392919061189f565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016105789594939291906118e9565b6040805180830381600087803b15801561059157600080fd5b505af19250505080156105c1575060408051601f3d908101601f191682019092526105be918101906116a4565b60015b610631573d8080156105ef576040519150601f19603f3d011682016040523d82523d6000602084013e6105f4565b606091505b505a8203945088608001516001600160a01b03166000141561061557600080555b610620818487610a47565b975097509750975050505050610637565b50505050505b9193509193565b7f000000000000000000000000000000000000000000000000000000000000000081565b6020810151815160608301516000928392839283926001600160a01b038082169084161092849261069392906109f3565b905060005a9050816001600160a01b031663128acb0830856106b88c60400151610a31565b60808d01516001600160a01b0316156106d5578c608001516106fb565b876106f45773fffd8963efd1fc6a506488495d951d5263988d256106fb565b6401000276a45b8d600001518e606001518f6020015160405160200161071c9392919061189f565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161074b9594939291906118e9565b6040805180830381600087803b15801561076457600080fd5b505af1925050508015610794575060408051601f3d908101601f19168201909252610791918101906116a4565b60015b610631573d8080156107c2576040519150601f19603f3d011682016040523d82523d6000602084013e6107c7565b606091505b505a82039450610620818487610a47565b600060608060006107e88661096d565b6001600160401b03811180156107fd57600080fd5b50604051908082528060200260200182016040528015610827578160200160208202803683370190505b5092506108338661096d565b6001600160401b038111801561084857600080fd5b50604051908082528060200260200182016040528015610872578160200160208202803683370190505b50915060005b60008060006108868a61097e565b9250925092506000806000806108e26040518060a00160405280896001600160a01b03168152602001886001600160a01b031681526020018f81526020018762ffffff16815260200160006001600160a01b0316815250610662565b9350935093509350828b89815181106108f757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818a898151811061092457fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926109518e6109af565b156102a75761095f8e6109b7565b9d5050505050505050610878565b80516017601319909101045b919050565b6000808061098c8482610b01565b9250610999846014610bb1565b90506109a6846017610b01565b91509193909250565b516042111590565b80516060906109ce90839060179060161901610c58565b92915050565b60006109ea856109e5868686610da9565b610dff565b95945050505050565b6000610a297f0000000000000000000000000000000000000000000000000000000000000000610a24868686610da9565b610e22565b949350505050565b6000600160ff1b8210610a4357600080fd5b5090565b600080600080600080876001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610a8957600080fd5b505afa158015610a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac1919061179f565b50939650610ad694508d9350610f0192505050565b91975095509050610af16001600160a01b0389168383610f8e565b9350869250505093509350935093565b600081826014011015610b50576040805162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b604482015290519081900360640190fd5b8160140183511015610ba1576040805162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b604482015290519081900360640190fd5b500160200151600160601b900490565b600081826003011015610bff576040805162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b604482015290519081900360640190fd5b8160030183511015610c4f576040805162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b604482015290519081900360640190fd5b50016003015190565b60608182601f011015610ca3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015610ceb576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015610d37576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015610d565760405191506000825260208201604052610da0565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610d8f578051835260209283019201610d77565b5050858452601f01601f1916604052505b50949350505050565b610db1611532565b826001600160a01b0316846001600160a01b03161115610dcf579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b6000610e0b8383610e22565b9050336001600160a01b038216146109ce57600080fd5b600081602001516001600160a01b031682600001516001600160a01b031610610e4a57600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b60008060008351606014610f6d57604484511015610f3a5760405162461bcd60e51b8152600401610f3190611942565b60405180910390fd5b60048401935083806020019051810190610f549190611714565b60405162461bcd60e51b8152600401610f31919061192f565b83806020019051810190610f819190611836565b9250925092509193909250565b60008060008060008060008060088b6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d6020811015610fff57600080fd5b5051600290810b908c900b8161101157fe5b0560020b901d905060006101008c6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d602081101561108157600080fd5b5051600290810b908d900b8161109357fe5b0560020b8161109e57fe5b079050600060088d6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110de57600080fd5b505afa1580156110f2573d6000803e3d6000fd5b505050506040513d602081101561110857600080fd5b5051600290810b908d900b8161111a57fe5b0560020b901d905060006101008e6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116057600080fd5b505afa158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b5051600290810b908e900b8161119c57fe5b0560020b816111a757fe5b07905060008160ff166001901b8f6001600160a01b0316635339c296856040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b1580156111fb57600080fd5b505afa15801561120f573d6000803e3d6000fd5b505050506040513d602081101561122557600080fd5b5051161180156112ab57508d6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561126957600080fd5b505afa15801561127d573d6000803e3d6000fd5b505050506040513d602081101561129357600080fd5b5051600290810b908d900b816112a557fe5b0760020b155b80156112bc57508b60020b8d60020b135b945060008360ff166001901b8f6001600160a01b0316635339c296876040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b15801561130f57600080fd5b505afa158015611323573d6000803e3d6000fd5b505050506040513d602081101561133957600080fd5b5051161180156113bf57508d6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137d57600080fd5b505afa158015611391573d6000803e3d6000fd5b505050506040513d60208110156113a757600080fd5b5051600290810b908e900b816113b957fe5b0760020b155b80156113d057508b60020b8d60020b125b95508160010b8460010b12806113fc57508160010b8460010b1480156113fc57508060ff168360ff1611155b156114125783995082975081985080965061141f565b8199508097508398508296505b505060001960ff87161b9150505b8560010b8760010b136114ef578560010b8760010b14156114545760001960ff858103161c165b6000818c6001600160a01b0316635339c2968a6040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d60208110156114c857600080fd5b50511690506114d681611517565b61ffff169890980197505060019095019460001961142d565b81156114fc576001880397505b8215611509576001880397505b505050505050509392505050565b6000805b82156109ce5760001983019092169160010161151b565b604080516060810182526000808252602082018190529181019190915290565b600082601f830112611562578081fd5b813561157561157082611a54565b611a31565b818152846020838601011115611589578283fd5b816020850160208301379081016020019190915292915050565b8051600281900b811461097957600080fd5b600060a082840312156115c6578081fd5b60405160a081016001600160401b03811182821017156115e257fe5b60405290508082356115f381611aa5565b8152602083013561160381611aa5565b602082015260408381013590820152606083013562ffffff8116811461162857600080fd5b606082015261163960808401611645565b60808201525092915050565b803561097981611aa5565b805161ffff8116811461097957600080fd5b60008060408385031215611674578182fd5b82356001600160401b03811115611689578283fd5b61169585828601611552565b95602094909401359450505050565b600080604083850312156116b6578182fd5b505080516020909101519092909150565b6000806000606084860312156116db578081fd5b833592506020840135915060408401356001600160401b038111156116fe578182fd5b61170a86828701611552565b9150509250925092565b600060208284031215611725578081fd5b81516001600160401b0381111561173a578182fd5b8201601f8101841361174a578182fd5b805161175861157082611a54565b81815285602083850101111561176c578384fd5b6109ea826020830160208601611a75565b600060a0828403121561178e578081fd5b61179883836115b5565b9392505050565b600080600080600080600060e0888a0312156117b9578283fd5b87516117c481611aa5565b96506117d2602089016115a3565b95506117e060408901611650565b94506117ee60608901611650565b93506117fc60808901611650565b925060a088015160ff81168114611811578283fd5b60c08901519092508015158114611826578182fd5b8091505092959891949750929550565b60008060006060848603121561184a578081fd5b83519250602084015161185c81611aa5565b915061186a604085016115a3565b90509250925092565b6000815180845261188b816020860160208601611a75565b601f01601f19169290920160200192915050565b606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a06080820181905260009061192490830184611873565b979650505050505050565b6000602082526117986020830184611873565b60208082526010908201526f2ab732bc3832b1ba32b21032b93937b960811b604082015260600190565b600060808201868352602060808185015281875180845260a0860191508289019350845b818110156119b55784516001600160a01b031683529383019391830191600101611990565b505084810360408601528651808252908201925081870190845b818110156119f157825163ffffffff16855293830193918301916001016119cf565b5050505060609290920192909252949350505050565b9384526001600160a01b0392909216602084015263ffffffff166040830152606082015260800190565b6040518181016001600160401b0381118282101715611a4c57fe5b604052919050565b60006001600160401b03821115611a6757fe5b50601f01601f191660200190565b60005b83811015611a90578181015183820152602001611a78565b83811115611a9f576000848401525b50505050565b6001600160a01b0381168114611aba57600080fd5b5056fea2646970667358221220de415bfbfc31369201d2bfb524f30a2722ef5c86a907298fe640af636147875f64736f6c63430007060033" /* - * cd ./solidity/lib/punch-swap-v3-contracts - * forge inspect src/periphery/NonfingiblePositionManager.sol bytecode - */ +* cd ./solidity/lib/punch-swap-v3-contracts +* forge inspect src/periphery/NonfingiblePositionManager.sol bytecode +*/ access(all) let npmBytecode = "610120604052600d80546001600160b01b0319166001176001600160b01b0316600160b01b1790553480156200003457600080fd5b5060405162005cb638038062005cb68339810160408190526200005791620002da565b82826040518060400160405280601d81526020017f50756e63685377617020563320506f736974696f6e73204e46542d56310000008152506040518060400160405280600981526020016850532d56332d504f5360b81b815250604051806040016040528060018152602001603160f81b8152508282620000e56301ffc9a760e01b6200018c60201b60201c565b8151620000fa90600690602085019062000211565b5080516200011090600790602084019062000211565b50620001236380ac58cd60e01b6200018c565b62000135635b5e139f60e01b6200018c565b6200014763780e9d6360e01b6200018c565b50508251602093840120608052805192019190912060a052506001600160601b0319606092831b811660c05290821b811660e05291901b166101005250620003239050565b6001600160e01b03198082161415620001ec576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000249576000855562000294565b82601f106200026457805160ff191683800117855562000294565b8280016001018555821562000294579182015b828111156200029457825182559160200191906001019062000277565b50620002a2929150620002a6565b5090565b5b80821115620002a25760008155600101620002a7565b80516001600160a01b0381168114620002d557600080fd5b919050565b600080600060608486031215620002ef578283fd5b620002fa84620002bd565b92506200030a60208501620002bd565b91506200031a60408501620002bd565b90509250925092565b60805160a05160c05160601c60e05160601c6101005160601c61590e620003a8600039806127225250806101c95280611575528061166052806116e85280613ad05280613b165280613b8a5250806109955280610cb55280610d7c52806126d55280612a3e5280612e0552806132bf525080611375525080611354525061590e6000f3fe6080604052600436106101b95760003560e01c806301ffc9a71461022e57806306fdde0314610264578063081812fc14610286578063095ea7b3146102b35780630c49ccbe146102d357806312210e8a146102f457806313ead562146102fc57806318160ddd1461030f578063219f5d171461033157806323b872dd146103535780632f745c591461037357806330adf81f146103935780633644e515146103a857806342842e0e146103bd57806342966c68146103dd5780634659a494146103f057806349404b7c146104035780634aa4a4fc146104165780634f6ccce71461042b5780636352211e1461044b5780636c0360eb1461046b57806370a08231146104805780637ac2ff7b146104a057806388316456146104b357806395d89b41146104d657806399fbab88146104eb578063a22cb46514610523578063a4a78f0c14610543578063ac9650d814610556578063b88d4fde14610576578063c2e3140a14610596578063c45a0155146105a9578063c87b56dd146105be578063df2ab5bb146105de578063e985e9c5146105f1578063f3995c6714610611578063fc6f786514610624578063ffc2b1561461063757610229565b3661022957336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610227576040805162461bcd60e51b81526020600482015260096024820152684e6f7420574554483960b81b604482015290519081900360640190fd5b005b600080fd5b34801561023a57600080fd5b5061024e610249366004614d92565b610657565b60405161025b91906152d3565b60405180910390f35b34801561027057600080fd5b5061027961067a565b60405161025b9190615326565b34801561029257600080fd5b506102a66102a136600461508a565b610710565b60405161025b91906151b3565b3480156102bf57600080fd5b506102276102ce366004614c5d565b610763565b6102e66102e1366004614e56565b610839565b60405161025b9291906154ad565b610227610c81565b6102a661030a366004614af1565b610c93565b34801561031b57600080fd5b50610324610f87565b60405161025b91906152de565b61034461033f366004614e67565b610f98565b60405161025b93929190615468565b34801561035f57600080fd5b5061022761036e366004614b4a565b61129b565b34801561037f57600080fd5b5061032461038e366004614c5d565b6112f2565b34801561039f57600080fd5b5061032461131d565b3480156103b457600080fd5b5061032461132f565b3480156103c957600080fd5b506102276103d8366004614b4a565b6113ed565b6102276103eb36600461508a565b611408565b6102276103fe366004614cc9565b6114d7565b6102276104113660046150a2565b611571565b34801561042257600080fd5b506102a66116e6565b34801561043757600080fd5b5061032461044636600461508a565b61170a565b34801561045757600080fd5b506102a661046636600461508a565b611720565b34801561047757600080fd5b50610279611748565b34801561048c57600080fd5b5061032461049b366004614a9d565b61174d565b6102276104ae366004614cc9565b6117b5565b6104c66104c1366004614f22565b611b95565b60405161025b9493929190615489565b3480156104e257600080fd5b5061027961209b565b3480156104f757600080fd5b5061050b61050636600461508a565b6120fc565b60405161025b9c9b9a999897969594939291906154bb565b34801561052f57600080fd5b5061022761053e366004614c30565b61230d565b610227610551366004614cc9565b61240e565b610569610564366004614d24565b6124a7565b60405161025b9190615273565b34801561058257600080fd5b50610227610591366004614b8a565b6125e6565b6102276105a4366004614cc9565b612644565b3480156105b557600080fd5b506102a66126d3565b3480156105ca57600080fd5b506102796105d936600461508a565b6126f7565b6102276105ec366004614c88565b6127ad565b3480156105fd57600080fd5b5061024e61060c366004614ab9565b612885565b61022761061f366004614cc9565b6128b3565b6102e6610632366004614e3f565b612925565b34801561064357600080fd5b506102276106523660046150e9565b612df0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b5050505050905090565b600061071b82612e6e565b6107405760405162461bcd60e51b81526004016107379061535f565b60405180910390fd5b506000908152600c6020526040902054600160601b90046001600160a01b031690565b600061076e82611720565b9050806001600160a01b0316836001600160a01b031614156107c15760405162461bcd60e51b81526004018080602001828103825260218152602001806158876021913960400191505060405180910390fd5b806001600160a01b03166107d3612e7b565b6001600160a01b031614806107ef57506107ef8161060c612e7b565b61082a5760405162461bcd60e51b81526004018080602001828103825260388152602001806157516038913960400191505060405180910390fd5b6108348383612e7f565b505050565b60008082356108483382612ef5565b6108645760405162461bcd60e51b815260040161073790615339565b836080013580610872612f91565b11156108bb576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b60006108cd6040870160208801614f34565b6001600160801b0316116108e057600080fd5b84356000908152600c602090815260409182902060018101549092600160801b9091046001600160801b03169161091b918901908901614f34565b6001600160801b0316816001600160801b0316101561093957600080fd5b6001828101546001600160501b03166000908152600b60209081526040808320815160608101835281546001600160a01b039081168252919095015490811692850192909252600160a01b90910462ffffff16908301526109ba7f000000000000000000000000000000000000000000000000000000000000000083612f95565b60018501549091506001600160a01b0382169063a34123a790600160501b8104600290810b91600160681b9004900b6109f960408e0160208f01614f34565b6040518463ffffffff1660e01b8152600401610a1793929190615300565b6040805180830381600087803b158015610a3057600080fd5b505af1158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6891906150c6565b909850965060408901358810801590610a85575088606001358710155b610aa15760405162461bcd60e51b8152600401610737906153ab565b6001840154600090610aca903090600160501b8104600290810b91600160681b9004900b613074565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401610afb91906152de565b60a06040518083038186803b158015610b1357600080fd5b505afa158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b9190614f7e565b50509250925050610b7087600201548303876001600160801b0316600160801b6130c9565b6004880180546001600160801b03198116928e016001600160801b039182160181169290921790556003880154610bb191908303908816600160801b6130c9565b6004880180546001600160801b03808216938e01600160801b9283900482160116029190911790556002870182905560038701819055610bf760408d0160208e01614f34565b86038760010160106101000a8154816001600160801b0302191690836001600160801b031602179055508b600001357f26f6a048ee9138f2c0ce266f322cb99228e8d619ae2bff30c67f8dcf9d2377b48d6020016020810190610c5a9190614f34565b8d8d604051610c6b93929190615468565b60405180910390a2505050505050505050915091565b4715610c9157610c913347613178565b565b6000836001600160a01b0316856001600160a01b031610610cb357600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff168152602001935050505060206040518083038186803b158015610d3e57600080fd5b505afa158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b505190506001600160a01b038116610e9e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a16712958686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff1681526020019350505050602060405180830381600087803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b505050506040513d6020811015610e3157600080fd5b50516040805163f637731d60e01b81526001600160a01b03858116600483015291519293509083169163f637731d9160248082019260009290919082900301818387803b158015610e8157600080fd5b505af1158015610e95573d6000803e3d6000fd5b50505050610f7f565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610ed957600080fd5b505afa158015610eed573d6000803e3d6000fd5b505050506040513d60e0811015610f0357600080fd5b505190506001600160a01b038116610f7d57816001600160a01b031663f637731d846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f6457600080fd5b505af1158015610f78573d6000803e3d6000fd5b505050505b505b949350505050565b6000610f936002613267565b905090565b60008060008360a0013580610fab612f91565b1115610ff4576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b84356000908152600c602090815260408083206001808201546001600160501b0381168652600b855283862084516060808201875282546001600160a01b039081168352929094015480831682890190815262ffffff600160a01b9092048216838901908152885161014081018a528451861681529151909416818a0152925116828701523082850152600160501b8304600290810b810b608080850191909152600160681b909404810b900b60a0830152958c013560c0820152938b013560e0850152908a013561010084015289013561012083015292906110d690613272565b6001870154939a5091985096509150600090611109903090600160501b8104600290810b91600160681b9004900b613074565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b815260040161113a91906152de565b60a06040518083038186803b15801561115257600080fd5b505afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a9190614f7e565b505092509250506111c6866002015483038760010160109054906101000a90046001600160801b03166001600160801b0316600160801b6130c9565b6004870180546001600160801b0380821690930183166001600160801b03199091161790556003870154600188015461120d9291840391600160801b9182900416906130c9565b6004870180546001600160801b03600160801b80830482169094018116840291811691909117909155600288018490556003880183905560018801805483810483168e018316909302929091169190911790556040518b35906000805160206157fe83398151915290611285908d908d908d90615468565b60405180910390a2505050505050509193909250565b6112ac6112a6612e7b565b82612ef5565b6112e75760405162461bcd60e51b81526004018080602001828103825260318152602001806158a86031913960400191505060405180910390fd5b6108348383836134ad565b6001600160a01b038216600090815260016020526040812061131490836135e7565b90505b92915050565b60008051602061584783398151915281565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061139c6135f3565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b610834838383604051806020016040528060008152506125e6565b806114133382612ef5565b61142f5760405162461bcd60e51b815260040161073790615339565b6000828152600c602052604090206001810154600160801b90046001600160801b031615801561146a575060048101546001600160801b0316155b801561148857506004810154600160801b90046001600160801b0316155b6114a45760405162461bcd60e51b815260040161073790615403565b6000838152600c6020526040812081815560018101829055600281018290556003810182905560040155610834836135f7565b604080516323f2ebc360e21b815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e4810183905290516001600160a01b03881691638fcbaf0c9161010480830192600092919082900301818387803b15801561155157600080fd5b505af1158015611565573d6000803e3d6000fd5b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115e057600080fd5b505afa1580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b5051905082811015611658576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b604482015290519081900360640190fd5b8015610834577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506108348282613178565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806117186002846136b2565b509392505050565b6000611317826040518060600160405280602981526020016157b360299139600291906136d0565b606090565b60006001600160a01b0382166117945760405162461bcd60e51b815260040180806020018281038252602a815260200180615789602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061131790613267565b836117be612f91565b1115611802576040805162461bcd60e51b815260206004820152600e60248201526d14195c9b5a5d08195e1c1a5c995960921b604482015290519081900360640190fd5b600061180c61132f565b6000805160206158478339815191528888611826816136dd565b604080516020808201969096526001600160a01b03909416848201526060840192909252608083015260a08083018a90528151808403909101815260c08301825280519084012061190160f01b60e084015260e2830194909452610102808301949094528051808303909401845261012290910190528151910120905060006118ae87611720565b9050806001600160a01b0316886001600160a01b031614156119015760405162461bcd60e51b81526004018080602001828103825260278152602001806156b46027913960400191505060405180910390fd5b61190a81613712565b15611a72576040805160208082018790528183018690526001600160f81b031960f889901b1660608301528251604181840301815260618301808552630b135d3f60e11b90526065830186815260858401948552815160a585015281516001600160a01b03871695631626ba7e958995919260c59091019185019080838360005b838110156119a357818101518382015260200161198b565b50505050905090810190601f1680156119d05780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6020811015611a1857600080fd5b50516001600160e01b031916630b135d3f60e11b14611a6d576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b611b81565b600060018387878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611ace573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611b2a576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b604482015290519081900360640190fd5b816001600160a01b0316816001600160a01b031614611b7f576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b505b611b8b8888612e7f565b5050505050505050565b60008060008084610140013580611baa612f91565b1115611bf3576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b604080516101408101909152600090611cbf9080611c1460208b018b614a9d565b6001600160a01b03168152602001896020016020810190611c359190614a9d565b6001600160a01b03168152602001611c5360608b0160408c01615070565b62ffffff168152306020820152604001611c7360808b0160608c01614dba565b60020b8152602001611c8b60a08b0160808c01614dba565b60020b81526020018960a0013581526020018960c0013581526020018960e001358152602001896101000135815250613272565b92975090955093509050611d0c611cde61014089016101208a01614a9d565b600d80546001600160b01b0319811660016001600160b01b0392831690810190921617909155975087613718565b6000611d3730611d2260808b0160608c01614dba565b611d3260a08c0160808d01614dba565b613074565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401611d6891906152de565b60a06040518083038186803b158015611d8057600080fd5b505afa158015611d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db89190614f7e565b505092509250506000611e318560405180606001604052808e6000016020810190611de39190614a9d565b6001600160a01b031681526020018e6020016020810190611e049190614a9d565b6001600160a01b031681526020018e6040016020810190611e259190615070565b62ffffff169052613833565b905060405180610140016040528060006001600160601b0316815260200160006001600160a01b03168152602001826001600160501b031681526020018c6060016020810190611e819190614dba565b60020b8152602001611e9960a08e0160808f01614dba565b60020b81526020018a6001600160801b0316815260200184815260200183815260200160006001600160801b0316815260200160006001600160801b0316815250600c60008c815260200190815260200160002060008201518160000160006101000a8154816001600160601b0302191690836001600160601b03160217905550602082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160501b0302191690836001600160501b03160217905550606082015181600101600a6101000a81548162ffffff021916908360020b62ffffff160217905550608082015181600101600d6101000a81548162ffffff021916908360020b62ffffff16021790555060a08201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060c0820151816002015560e082015181600301556101008201518160040160006101000a8154816001600160801b0302191690836001600160801b031602179055506101208201518160040160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050896000805160206157fe8339815191528a8a8a60405161208693929190615468565b60405180910390a25050505050509193509193565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107065780601f106106db57610100808354040283529160200191610706565b6000818152600c6020908152604080832081516101408101835281546001600160601b03811682526001600160a01b03600160601b909104169381019390935260018101546001600160501b038116928401839052600160501b8104600290810b810b810b6060860152600160681b8204810b810b810b60808601526001600160801b03600160801b92839004811660a08701529083015460c0860152600383015460e0860152600490920154808316610100860152041661012083015282918291829182918291829182918291829182918291906121ed5760405162461bcd60e51b8152600401610737906153d9565b6000600b600083604001516001600160501b03166001600160501b031681526020019081526020016000206040518060600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905081600001518260200151826000015183602001518460400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001519d509d509d509d509d509d509d509d509d509d509d509d50505091939597999b5091939597999b565b612315612e7b565b6001600160a01b0316826001600160a01b03161415612377576040805162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015290519081900360640190fd5b8060056000612384612e7b565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556123c8612e7b565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b60408051636eb1769f60e11b81523360048201523060248201529051600019916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561245f57600080fd5b505afa158015612473573d6000803e3d6000fd5b505050506040513d602081101561248957600080fd5b5051101561249f5761249f8686868686866114d7565b505050505050565b6060816001600160401b03811180156124bf57600080fd5b506040519080825280602002602001820160405280156124f357816020015b60608152602001906001900390816124de5790505b50905060005b828110156125df576000803086868581811061251157fe5b90506020028101906125239190615555565b6040516125319291906151a3565b600060405180830381855af49150503d806000811461256c576040519150601f19603f3d011682016040523d82523d6000602084013e612571565b606091505b5091509150816125bd5760448151101561258a57600080fd5b600481019050808060200190518101906125a49190614dd6565b60405162461bcd60e51b81526004016107379190615326565b808484815181106125ca57fe5b602090810291909101015250506001016124f9565b5092915050565b6125f76125f1612e7b565b83612ef5565b6126325760405162461bcd60e51b81526004018080602001828103825260318152602001806158a86031913960400191505060405180910390fd5b61263e84848484613912565b50505050565b60408051636eb1769f60e11b8152336004820152306024820152905186916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561269357600080fd5b505afa1580156126a7573d6000803e3d6000fd5b505050506040513d60208110156126bd57600080fd5b5051101561249f5761249f8686868686866128b3565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061270282612e6e565b61270b57600080fd5b60405163e9dc637560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e9dc63759061275990309086906004016152e7565b60006040518083038186803b15801561277157600080fd5b505afa158015612785573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113179190810190614dd6565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d602081101561282657600080fd5b5051905082811015612874576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b801561263e5761263e848383613964565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6040805163d505accf60e01b8152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c4810183905290516001600160a01b0388169163d505accf9160e480830192600092919082900301818387803b15801561155157600080fd5b60008082356129343382612ef5565b6129505760405162461bcd60e51b815260040161073790615339565b60006129626060860160408701614f34565b6001600160801b0316118061298f575060006129846080860160608701614f34565b6001600160801b0316115b61299857600080fd5b6000806129ab6040870160208801614a9d565b6001600160a01b0316146129ce576129c96040860160208701614a9d565b6129d0565b305b85356000908152600c602090815260408083206001808201546001600160501b03168552600b8452828520835160608101855281546001600160a01b039081168252919092015490811694820194909452600160a01b90930462ffffff169183019190915292935090612a637f000000000000000000000000000000000000000000000000000000000000000083612f95565b600484015460018501549192506001600160801b0380821692600160801b9283900482169290041615612c5957600185015460405163a34123a760e01b81526001600160a01b0385169163a34123a791612ada91600160501b8104600290810b92600160681b909204900b90600090600401615300565b6040805180830381600087803b158015612af357600080fd5b505af1158015612b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2b91906150c6565b5050600185015460009081906001600160a01b0386169063514ea4bf90612b69903090600160501b8104600290810b91600160681b9004900b613074565b6040518263ffffffff1660e01b8152600401612b8591906152de565b60a06040518083038186803b158015612b9d57600080fd5b505afa158015612bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd59190614f7e565b50509250925050612c11876002015483038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6130c9565b84019350612c4a876003015482038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6130c9565b60028801929092556003870155015b6000806001600160801b038416612c7660608e0160408f01614f34565b6001600160801b031611612c9957612c9460608d0160408e01614f34565b612c9b565b835b836001600160801b03168d6060016020810190612cb89190614f34565b6001600160801b031611612cdb57612cd660808e0160608f01614f34565b612cdd565b835b60018901546040516309e3d67b60e31b81529294509092506001600160a01b03871691634f1eb3d891612d30918c91600160501b8104600290810b92600160681b909204900b908890889060040161520c565b6040805180830381600087803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d819190614f50565b6004890180546001600160801b03196001600160801b03918216600160801b878a0384160217168689038216179091556040519281169d50169a508c35907f40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f0190610c6b908b9086908690615249565b6000612dfe82840184614e78565b9050612e2e7f00000000000000000000000000000000000000000000000000000000000000008260000151613aab565b508415612e49578051516020820151612e4991903388613ace565b8315612e6757612e6781600001516020015182602001513387613ace565b5050505050565b6000611317600283613c5e565b3390565b6000818152600c6020526040902080546001600160601b0316600160601b6001600160a01b038516908102919091179091558190612ebc82611720565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612f0082612e6e565b612f3b5760405162461bcd60e51b815260040180806020018281038252602c815260200180615725602c913960400191505060405180910390fd5b6000612f4683611720565b9050806001600160a01b0316846001600160a01b03161480612f815750836001600160a01b0316612f7684610710565b6001600160a01b0316145b80610f7f5750610f7f8185612885565b4290565b600081602001516001600160a01b031682600001516001600160a01b031610612fbd57600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b604080516001600160601b0319606086901b16602080830191909152600285810b60e890811b60348501529085900b901b60378301528251601a818403018152603a90920190925280519101205b9392505050565b60008080600019858709868602925082811090839003039050806130ff57600084116130f457600080fd5b5082900490506130c2565b80841161310b57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131c45780518252601f1990920191602091820191016131a5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613226576040519150601f19603f3d011682016040523d82523d6000602084013e61322b565b606091505b5050905080610834576040805162461bcd60e51b815260206004820152600360248201526253544560e81b604482015290519081900360640190fd5b600061131782613c6a565b6000806000806000604051806060016040528087600001516001600160a01b0316815260200187602001516001600160a01b03168152602001876040015162ffffff1681525090506132e47f000000000000000000000000000000000000000000000000000000000000000082612f95565b91506000826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561332157600080fd5b505afa158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190614fdf565b505050505050905060006133708860800151613c6e565b905060006133818960a00151613c6e565b90506133988383838c60c001518d60e00151613f95565b9750505050816001600160a01b0316633c8a7d8d876060015188608001518960a00151896040518060400160405280888152602001336001600160a01b03168152506040516020016133ea9190615428565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016134199594939291906151c7565b6040805180830381600087803b15801561343257600080fd5b505af1158015613446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346a91906150c6565b6101008801519195509350841080159061348957508561012001518310155b6134a55760405162461bcd60e51b8152600401610737906153ab565b509193509193565b826001600160a01b03166134c082611720565b6001600160a01b0316146135055760405162461bcd60e51b815260040180806020018281038252602981526020018061581e6029913960400191505060405180910390fd5b6001600160a01b03821661354a5760405162461bcd60e51b81526004018080602001828103825260248152602001806156db6024913960400191505060405180910390fd5b613555838383610834565b613560600082612e7f565b6001600160a01b03831660009081526001602052604090206135829082614059565b506001600160a01b03821660009081526001602052604090206135a59082614065565b506135b260028284614071565b5080826001600160a01b0316846001600160a01b031660008051602061586783398151915260405160405180910390a4505050565b60006113148383614087565b4690565b600061360282611720565b905061361081600084610834565b61361b600083612e7f565b600082815260086020526040902054600260001961010060018416150201909116041561365957600082815260086020526040812061365991614a0d565b6001600160a01b038116600090815260016020526040902061367b9083614059565b506136876002836140eb565b5060405182906000906001600160a01b03841690600080516020615867833981519152908390a45050565b60008080806136c186866140f7565b909450925050505b9250929050565b6000610f7f848484614172565b6000908152600c6020526040902080546001600160601b0319811660016001600160601b039283169081019092161790915590565b3b151590565b6001600160a01b038216613773576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61377c81612e6e565b156137cd576040805162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b604482015290519081900360640190fd5b6137d960008383610834565b6001600160a01b03821660009081526001602052604090206137fb9082614065565b5061380860028284614071565b5060405181906001600160a01b03841690600090600080516020615867833981519152908290a45050565b6001600160a01b0382166000908152600a60205260409020546001600160501b0316806113175750600d805460016001600160501b03600160b01b8084048216838101909216026001600160b01b03909316929092179092556001600160a01b038085166000908152600a6020908152604080832080546001600160501b03191686179055848352600b825291829020865181549085166001600160a01b031991821617825591870151950180549287015162ffffff16600160a01b0262ffffff60a01b19969094169290911691909117939093161790915592915050565b61391d8484846134ad565b6139298484848461423c565b61263e5760405162461bcd60e51b81526004018080602001828103825260328152602001806156826032913960400191505060405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106139e05780518252601f1990920191602091820191016139c1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a42576040519150601f19603f3d011682016040523d82523d6000602084013e613a47565b606091505b5091509150818015613a75575080511580613a755750808060200190516020811015613a7257600080fd5b50515b612e67576040805162461bcd60e51b815260206004820152600260248201526114d560f21b604482015290519081900360640190fd5b6000613ab78383612f95565b9050336001600160a01b0382161461131757600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316148015613b0f5750804710155b15613c31577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015613b6f57600080fd5b505af1158015613b83573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613bff57600080fd5b505af1158015613c13573d6000803e3d6000fd5b505050506040513d6020811015613c2957600080fd5b5061263e9050565b6001600160a01b038316301415613c5257613c4d848383613964565b61263e565b61263e848484846143a4565b600061131483836144f4565b5490565b60008060008360020b12613c85578260020b613c8d565b8260020b6000035b9050620d89e8811115613ccb576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216613cdf57600160801b613cf1565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b031690506002821615613d1b576ffff97272373d413259a46990580e213a0260801c5b6004821615613d3a576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615613d59576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615613d78576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615613d97576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615613db6576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615613dd5576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615613df5576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615613e15576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615613e35576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615613e55576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613e75576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613e95576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613eb5576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613ed5576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613ef6576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613f16576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615613f35576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615613f52576b048a170391f7dc42444e8fa20260801c5b60008460020b1315613f6d578060001981613f6957fe5b0490505b600160201b810615613f80576001613f83565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b03161115613fb5579293925b846001600160a01b0316866001600160a01b031611613fe057613fd985858561450c565b9050614050565b836001600160a01b0316866001600160a01b0316101561404257600061400787868661450c565b9050600061401687898661456f565b9050806001600160801b0316826001600160801b0316106140375780614039565b815b92505050614050565b61404d85858461456f565b90505b95945050505050565b600061131483836145ac565b60006113148383614672565b6000610f7f84846001600160a01b0385166146bc565b815460009082106140c95760405162461bcd60e51b81526004018080602001828103825260228152602001806156606022913960400191505060405180910390fd5b8260000182815481106140d857fe5b9060005260206000200154905092915050565b60006113148383614753565b81546000908190831061413b5760405162461bcd60e51b81526004018080602001828103825260228152602001806157dc6022913960400191505060405180910390fd5b600084600001848154811061414c57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161420d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141d25781810151838201526020016141ba565b50505050905090810190601f1680156141ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061422057fe5b9060005260206000209060020201600101549150509392505050565b6000614250846001600160a01b0316613712565b61425c57506001610f7f565b600061436a630a85bd0160e11b614271612e7b565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156142d85781810151838201526020016142c0565b50505050905090810190601f1680156143055780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001615682603291396001600160a01b0388169190614827565b9050600081806020019051602081101561438357600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b602083106144285780518252601f199092019160209182019101614409565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461448a576040519150601f19603f3d011682016040523d82523d6000602084013e61448f565b606091505b50915091508180156144bd5750805115806144bd57508080602001905160208110156144ba57600080fd5b50515b61249f576040805162461bcd60e51b815260206004820152600360248201526229aa2360e91b604482015290519081900360640190fd5b60009081526001919091016020526040902054151590565b6000826001600160a01b0316846001600160a01b0316111561452c579192915b600061454f856001600160a01b0316856001600160a01b0316600160601b6130c9565b905061405061456a84838888036001600160a01b03166130c9565b614836565b6000826001600160a01b0316846001600160a01b0316111561458f579192915b610f7f61456a83600160601b8787036001600160a01b03166130c9565b6000818152600183016020526040812054801561466857835460001980830191908101906000908790839081106145df57fe5b90600052602060002001549050808760000184815481106145fc57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061462c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611317565b6000915050611317565b600061467e83836144f4565b6146b457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611317565b506000611317565b6000828152600184016020526040812054806147215750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556130c2565b8285600001600183038154811061473457fe5b90600052602060002090600202016001018190555060009150506130c2565b60008181526001830160205260408120548015614668578354600019808301919081019060009087908390811061478657fe5b90600052602060002090600202019050808760000184815481106147a657fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806147e557fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506113179350505050565b6060610f7f848460008561484c565b806001600160801b038116811461067557600080fd5b60608247101561488d5760405162461bcd60e51b81526004018080602001828103825260268152602001806156ff6026913960400191505060405180910390fd5b61489685613712565b6148e7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106149255780518252601f199092019160209182019101614906565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614987576040519150601f19603f3d011682016040523d82523d6000602084013e61498c565b606091505b509150915061499c8282866149a7565b979650505050505050565b606083156149b65750816130c2565b8251156149c65782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156141d25781810151838201526020016141ba565b50805460018160011615610100020316600290046000825580601f10614a335750614a51565b601f016020900490600052602060002090810190614a519190614a54565b50565b5b80821115614a695760008155600101614a55565b5090565b803561067581615609565b805161ffff8116811461067557600080fd5b803562ffffff8116811461067557600080fd5b600060208284031215614aae578081fd5b81356130c281615609565b60008060408385031215614acb578081fd5b8235614ad681615609565b91506020830135614ae681615609565b809150509250929050565b60008060008060808587031215614b06578182fd5b8435614b1181615609565b93506020850135614b2181615609565b9250614b2f60408601614a8a565b91506060850135614b3f81615609565b939692955090935050565b600080600060608486031215614b5e578081fd5b8335614b6981615609565b92506020840135614b7981615609565b929592945050506040919091013590565b60008060008060808587031215614b9f578182fd5b8435614baa81615609565b93506020850135614bba81615609565b92506040850135915060608501356001600160401b03811115614bdb578182fd5b8501601f81018713614beb578182fd5b8035614bfe614bf9826155bc565b615599565b818152886020838501011115614c12578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215614c42578182fd5b8235614c4d81615609565b91506020830135614ae68161561e565b60008060408385031215614c6f578182fd5b8235614c7a81615609565b946020939093013593505050565b600080600060608486031215614c9c578081fd5b8335614ca781615609565b9250602084013591506040840135614cbe81615609565b809150509250925092565b60008060008060008060c08789031215614ce1578384fd5b8635614cec81615609565b955060208701359450604087013593506060870135614d0a81615650565b9598949750929560808101359460a0909101359350915050565b60008060208385031215614d36578182fd5b82356001600160401b0380821115614d4c578384fd5b818501915085601f830112614d5f578384fd5b813581811115614d6d578485fd5b8660208083028501011115614d80578485fd5b60209290920196919550909350505050565b600060208284031215614da3578081fd5b81356001600160e01b0319811681146130c2578182fd5b600060208284031215614dcb578081fd5b81356130c28161562c565b600060208284031215614de7578081fd5b81516001600160401b03811115614dfc578182fd5b8201601f81018413614e0c578182fd5b8051614e1a614bf9826155bc565b818152856020838501011115614e2e578384fd5b6140508260208301602086016155dd565b600060808284031215614e50578081fd5b50919050565b600060a08284031215614e50578081fd5b600060c08284031215614e50578081fd5b60008183036080811215614e8a578182fd5b604080519081016001600160401b038082118383101715614ea757fe5b816040526060841215614eb8578485fd5b60a0830193508184108185111715614ecc57fe5b508260405284359250614ede83615609565b918252602084013591614ef083615609565b826060830152614f0260408601614a8a565b60808301528152614f1560608501614a6d565b6020820152949350505050565b60006101608284031215614e50578081fd5b600060208284031215614f45578081fd5b81356130c28161563b565b60008060408385031215614f62578182fd5b8251614f6d8161563b565b6020840151909250614ae68161563b565b600080600080600060a08688031215614f95578283fd5b8551614fa08161563b565b8095505060208601519350604086015192506060860151614fc08161563b565b6080870151909250614fd18161563b565b809150509295509295909350565b600080600080600080600060e0888a031215614ff9578485fd5b875161500481615609565b60208901519097506150158161562c565b955061502360408901614a78565b945061503160608901614a78565b935061503f60808901614a78565b925060a088015161504f81615650565b60c08901519092506150608161561e565b8091505092959891949750929550565b600060208284031215615081578081fd5b61131482614a8a565b60006020828403121561509b578081fd5b5035919050565b600080604083850312156150b4578182fd5b823591506020830135614ae681615609565b600080604083850312156150d8578182fd5b505080516020909101519092909150565b600080600080606085870312156150fe578182fd5b843593506020850135925060408501356001600160401b0380821115615122578384fd5b818701915087601f830112615135578384fd5b813581811115615143578485fd5b886020828501011115615154578485fd5b95989497505060200194505050565b6000815180845261517b8160208601602086016155dd565b601f01601f19169290920160200192915050565b60020b9052565b6001600160801b03169052565b6000828483379101908152919050565b6001600160a01b0391909116815260200190565b6001600160a01b0386168152600285810b602083015284900b60408201526001600160801b038316606082015260a06080820181905260009061499c90830184615163565b6001600160a01b03959095168552600293840b60208601529190920b60408401526001600160801b03918216606084015216608082015260a00190565b6001600160a01b039390931683526001600160801b03918216602084015216604082015260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156152c657603f198886030184526152b4858351615163565b94509285019290850190600101615298565b5092979650505050505050565b901515815260200190565b90815260200190565b6001600160a01b03929092168252602082015260400190565b600293840b81529190920b60208201526001600160801b03909116604082015260600190565b6000602082526113146020830184615163565b6020808252600c908201526b139bdd08185c1c1c9bdd995960a21b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260149082015273507269636520736c69707061676520636865636b60601b604082015260600190565b60208082526010908201526f125b9d985b1a59081d1bdad95b88125160821b604082015260600190565b6020808252600b908201526a139bdd0818db19585c995960aa1b604082015260600190565b815180516001600160a01b03908116835260208083015182168185015260409283015162ffffff1692840192909252920151909116606082015260800190565b6001600160801b039390931683526020830191909152604082015260600190565b9384526001600160801b039290921660208401526040830152606082015260800190565b918252602082015260400190565b6001600160601b038d1681526001600160a01b038c811660208301528b811660408301528a16606082015262ffffff89166080820152600288900b60a0820152610180810161550d60c083018961518f565b61551a60e0830188615196565b8561010083015284610120830152615536610140830185615196565b615544610160830184615196565b9d9c50505050505050505050505050565b6000808335601e1984360301811261556b578283fd5b8301803591506001600160401b03821115615584578283fd5b6020019150368190038213156136c957600080fd5b6040518181016001600160401b03811182821017156155b457fe5b604052919050565b60006001600160401b038211156155cf57fe5b50601f01601f191660200190565b60005b838110156155f85781810151838201526020016155e0565b8381111561263e5750506000910152565b6001600160a01b0381168114614a5157600080fd5b8015158114614a5157600080fd5b8060020b8114614a5157600080fd5b6001600160801b0381168114614a5157600080fd5b60ff81168114614a5157600080fdfe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732315065726d69743a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64733067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9adddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220b5b610e7977f515fdb877da884752efa66013853561d5200beceb7024aecef3764736f6c63430007060033" /* - * cd ./solidity/lib/punch-swap-v3-contracts - * forge inspect src/periphery/libraries/NFTDescriptor.sol bytecode - * required for NonfungiblePositionDescriptor - */ +* cd ./solidity/lib/punch-swap-v3-contracts +* forge inspect src/periphery/libraries/NFTDescriptor.sol bytecode +* required for NonfungiblePositionDescriptor +*/ access(all) let nftDescriptorBytecode = "615aff610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063c49917d71461003a575b600080fd5b61004d610048366004613b0b565b610063565b60405161005a9190614144565b60405180910390f35b6060600061007e83610079856101800151610170565b6103b6565b905060006100b26100928560600151610471565b61009f8660800151610471565b6100ad876101a001516105dc565b6105f2565b905060006101006100c68660000151610624565b6100d38760800151610471565b6100e088602001516105dc565b6100ed89604001516105dc565b6100fb8a6101800151610170565b6106fe565b9050600061011561011087610734565b61096f565b9050610145848484846040516020016101319493929190613d62565b60405160208183030381529060405261096f565b60405160200161015591906140ff565b6040516020818303038152906040529450505050505b919050565b606062ffffff821661019b5750604080518082019091526002815261302560f01b602082015261016b565b816000805b62ffffff8316156101eb5760ff8116156101bc576001016101d5565b600a62ffffff84160662ffffff166000146101d5576001015b600190910190600a62ffffff84160492506101a0565b6101f3613a06565b6000600584106102e8576000600461020e8660ff8716610aba565b101561021b57600161021e565b60005b60ff90811691506102329085166001610aba565b61023d866005610aba565b106102695761026461025360ff86166001610aba565b61025e876005610aba565b90610aba565b61026c565b60005b60ff85166080850181905290925061028b9060019061025e9085610b17565b60ff90811660a085015260808401516102b29183916102ac91166001610aba565b90610b17565b60ff90811660408501526102da9082906102ac906102d39088166001610b17565b8590610b17565b60ff16602084015250610358565b6102f3600585610aba565b6002608084018190529091506103119060019061025e908490610b17565b60ff90811660a08401526103339061032c9085166002610b17565b8290610b17565b60ff1660208301819052610348906002610aba565b60ff166040830152600160c08301525b6103776103688560ff8616610aba565b62ffffff891690600a0a610b6f565b8252600160e08301526004841161038f57600061039a565b61039a846004610aba565b60ff1660608301526103ab82610bd3565b979650505050505050565b6060816103c68460600151610471565b6103d38560800151610471565b61040c8660e00151156103eb578661012001516103f2565b8661010001515b8761016001518860c001518960a001518a60e00151610de2565b6104458760e00151156104245787610100015161042b565b8761012001515b8861016001518960c001518a60a001518b60e00151610de2565b604051602001610459959493929190614044565b60405160208183030381529060405290505b92915050565b6060816000805b82518160ff1610156104bd57828160ff168151811061049357fe5b6020910101516001600160f81b031916601160f91b14156104b5576001909101905b600101610478565b5060ff8116156105d45760008160ff168351016001600160401b03811180156104e557600080fd5b506040519080825280601f01601f191660200182016040528015610510576020820181803683370190505b5090506000805b84518160ff1610156105c757848160ff168151811061053257fe5b6020910101516001600160f81b031916601160f91b141561057c57601760fa1b83838060010194508151811061056457fe5b60200101906001600160f81b031916908160001a9053505b848160ff168151811061058b57fe5b602001015160f81c60f81b8383806001019450815181106105a857fe5b60200101906001600160f81b031916908160001a905350600101610517565b508194505050505061016b565b509192915050565b606061046b6001600160a01b0383166014610ef7565b60608383838660405160200161060b9493929190613f20565b60405160208183030381529060405290505b9392505050565b60608161064957506040805180820190915260018152600360fc1b602082015261016b565b8160005b811561066157600101600a8204915061064d565b6000816001600160401b038111801561067957600080fd5b506040519080825280601f01601f1916602001820160405280156106a4576020820181803683370190505b50859350905060001982015b83156106f557600a840660300160f81b828280600190039350815181106106d357fe5b60200101906001600160f81b031916908160001a905350600a840493506106b0565b50949350505050565b60608385848489604051602001610719959493929190613e3d565b60405160208183030381529060405290505b95945050505050565b60606000604051806102a0016040528061075185602001516105dc565b815260200161076385604001516105dc565b8152602001846101a001516001600160a01b03168152602001846060015181526020018460800151815260200161079e856101800151610170565b815260200184610100015160020b815260200184610120015160020b815260200184610160015160020b81526020016107e7856101000151866101200151876101400151611055565b60000b81526020018460000151815260200161081185602001516001600160a01b0316608861108c565b815260200161082e85604001516001600160a01b0316608861108c565b815260200161084b85602001516001600160a01b0316600061108c565b815260200161086885604001516001600160a01b0316600061108c565b815260200161089b61088d86602001516001600160a01b03166010886000015161109b565b600060ff60106101126110bb565b81526020016108ce6108c086604001516001600160a01b03166010886000015161109b565b600060ff60646101e46110bb565b81526020016108f361088d86602001516001600160a01b03166020886000015161109b565b81526020016109186108c086604001516001600160a01b03166020886000015161109b565b815260200161093d61088d86602001516001600160a01b03166030886000015161109b565b81526020016109626108c086604001516001600160a01b03166030886000015161109b565b9052905061061d81611103565b6060815160001415610990575060408051602081019091526000815261016b565b6000604051806060016040528060408152602001614d64604091399050600060038451600201816109bd57fe5b0460040290506000816020016001600160401b03811180156109de57600080fd5b506040519080825280601f01601f191660200182016040528015610a09576020820181803683370190505b509050818152600183018586518101602084015b81831015610a75576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101610a1d565b600389510660018114610a8f5760028114610aa057610aac565b613d3d60f01b600119830152610aac565b603d60f81b6000198301525b509398975050505050505050565b600082821115610b11576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561061d576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b6000808211610bc2576040805162461bcd60e51b815260206004820152601a602482015279536166654d6174683a206469766973696f6e206279207a65726f60301b604482015290519081900360640190fd5b818381610bcb57fe5b049392505050565b60606000826020015160ff166001600160401b0381118015610bf457600080fd5b506040519080825280601f01601f191660200182016040528015610c1f576020820181803683370190505b5090508260e0015115610c5957602560f81b81600183510381518110610c4157fe5b60200101906001600160f81b031916908160001a9053505b8260c0015115610cb657600360fc1b81600081518110610c7557fe5b60200101906001600160f81b031916908160001a905350601760f91b81600181518110610c9e57fe5b60200101906001600160f81b031916908160001a9053505b608083015160ff165b60a0840151610cd29060ff166001610b17565b811015610d0957603060f81b828281518110610cea57fe5b60200101906001600160f81b031916908160001a905350600101610cbf565b505b82511561046b576000836060015160ff16118015610d365750826060015160ff16836040015160ff16145b15610d795760408301805160ff600019820181169092528251601760f91b92849216908110610d6157fe5b60200101906001600160f81b031916908160001a9053505b8251610d8b90603090600a9006610b17565b60f81b818460400180518091906001900360ff1660ff1681525060ff1681518110610db257fe5b60200101906001600160f81b031916908160001a905350600a8360000181815181610dd957fe5b04905250610d0b565b606084600281900b620d89e71981610df657fe5b050260020b8660020b1415610e50578115610e2c576040518060400160405280600381526020016209a82b60eb1b815250610e49565b6040518060400160405280600381526020016226a4a760e91b8152505b905061072b565b84600281900b620d89e881610e6157fe5b050260020b8660020b1415610eb7578115610e97576040518060400160405280600381526020016226a4a760e91b815250610e49565b5060408051808201909152600381526209a82b60eb1b602082015261072b565b6000610ec28761137b565b90508215610ee457610ee1600160c01b6001600160a01b038316610b6f565b90505b610eef8186866116a2565b91505061072b565b60606000826002026002016001600160401b0381118015610f1757600080fd5b506040519080825280601f01601f191660200182016040528015610f42576020820181803683370190505b509050600360fc1b81600081518110610f5757fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610f8057fe5b60200101906001600160f81b031916908160001a905350600160028402015b6001811115611001576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610fca57fe5b1a60f81b828281518110610fda57fe5b60200101906001600160f81b031916908160001a90535060049490941c9360001901610f9f565b50831561061d576040805162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015290519081900360640190fd5b60008360020b8260020b121561106e575060001961061d565b8260020b8260020b13156110845750600161061d565b50600061061d565b606061061d83831c600361185f565b600060ff826110aa8686611918565b02816110b257fe5b06949350505050565b60606110f96110f4846102ac6110d1888a610aba565b6110ee6110de888a610aba565b6110e88d8d610aba565b9061191f565b90610b6f565b610624565b9695505050505050565b606061110e82611978565b61112a8360000151846020015185606001518660800151611fd7565b611141846060015185608001518660a00151612302565b61115f8560c001518660e00151876101000151886101200151612452565b61117f611170876101400151610624565b8760c001518860e00151612735565b6111928761014001518860400151612b4d565b6040516020018087805190602001908083835b602083106111c45780518252601f1990920191602091820191016111a5565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b6020831061120c5780518252601f1990920191602091820191016111ed565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b602083106112545780518252601f199092019160209182019101611235565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b6020831061129c5780518252601f19909201916020918201910161127d565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b602083106112e45780518252601f1990920191602091820191016112c5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061132c5780518252601f19909201916020918201910161130d565b5181516020939093036101000a6000190180199091169216919091179052651e17b9bb339f60d11b92019182525060408051808303601919018152600690920190529998505050505050505050565b60008060008360020b12611392578260020b61139a565b8260020b6000035b9050620d89e88111156113d8576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166113ec57600160801b6113fe565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b031690506002821615611428576ffff97272373d413259a46990580e213a0260801c5b6004821615611447576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611466576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611485576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156114a4576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156114c3576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156114e2576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611502576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611522576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611542576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611562576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611582576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156115a2576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156115c2576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156115e2576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611603576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611623576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611642576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561165f576b048a170391f7dc42444e8fa20260801c5b60008460020b131561167a57806000198161167657fe5b0490505b600160201b81061561168d576001611690565b60005b60ff16602082901c0192505050919050565b606060006116b1858585612bc5565b905060006116c48283600160401b612cc7565b9050600160601b821080156116f9576116f2826c47bf19673df52e37f2410011d1602c1b600160801b612cc7565b915061170e565b61170b82620186a0600160801b612cc7565b91505b8160005b811561172657600101600a82049150611712565b600019016000806117378684612d76565b915091508015611748576001909201915b611750613a06565b85156117bd5761176f611767602b60ff8716610aba565b600790610b17565b60ff908116602083015260026080830152611795906001906102ac90602b908816610aba565b60ff90811660a083015260208201516117b091166001610aba565b60ff166040820152611834565b60098460ff1610611806576117d660ff85166004610aba565b60ff1660208201819052600560808301526117f2906001610aba565b60ff1660a082015260046040820152611834565b6006602082015260056040820181905261182b906001906102ac9060ff881690610aba565b60ff1660608201525b82815285151560c0820152600060e082015261184f81610bd3565b9c9b505050505050505050505050565b60606000826002026001600160401b038111801561187c57600080fd5b506040519080825280601f01601f1916602001820160405280156118a7576020820181803683370190505b5080519091505b8015611910576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106118d657fe5b1a60f81b8260018303815181106118e957fe5b60200101906001600160f81b031916908160001a90535060049490941c93600019016118ae565b509392505050565b1c60ff1690565b60008261192e5750600061046b565b8282028284828161193b57fe5b041461061d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614f836021913960400191505060405180910390fd5b6060611a0d8261016001516040516020018080614b3d6081913960810182805190602001908083835b602083106119c05780518252601f1990920191602091820191016119a1565b6001836020036101000a038019825116818451168082178552505050505050905001806813979f1e17b9bb339f60b91b81525060090191505060405160208183030381529060405261096f565b611b6f836101e00151846102000151856101800151604051602001808061467a6063913960630184805190602001908083835b60208310611a5f5780518252601f199092019160209182019101611a40565b51815160209384036101000a600019018019909216911617905265272063793d2760d01b919093019081528551600690910192860191508083835b60208310611ab95780518252601f199092019160209182019101611a9a565b51815160209384036101000a6000190180199092169116179052722720723d273132307078272066696c6c3d272360681b919093019081528451601390910192850191508083835b60208310611b205780518252601f199092019160209182019101611b01565b6001836020036101000a038019825116818451168082178552505050505050905001806813979f1e17b9bb339f60b91b815250600901935050505060405160208183030381529060405261096f565b611bc0846102200151856102400151866101a00151604051602001808061467a60639139606301848051906020019080838360208310611a5f5780518252601f199092019160209182019101611a40565b611cd5856102600151866102800151876101c00151604051602001808061467a6063913960630184805190602001908083835b60208310611c125780518252601f199092019160209182019101611bf3565b51815160209384036101000a600019018019909216911617905265272063793d2760d01b919093019081528551600690910192860191508083835b60208310611c6c5780518252601f199092019160209182019101611c4d565b51815160001960209485036101000a01908116901991909116179052722720723d273130307078272066696c6c3d272360681b939091019283528451601390930192908501915080838360208310611b205780518252601f199092019160209182019101611b01565b6101608601516040516020018060566143f58239605601602c614da48239651e3232b3399f60d11b602c820152603201604b614af28239604b0186805190602001908083835b60208310611d3a5780518252601f199092019160209182019101611d1b565b6001836020036101000a0380198251168184511680821785525050505050509050018061562a603e9139603e0185805190602001908083835b60208310611d925780518252601f199092019160209182019101611d73565b6001836020036101000a03801982511681845116808217855250505050505090500180614bbe603e9139603e0184805190602001908083835b60208310611dea5780518252601f199092019160209182019101611dcb565b5181516020939093036101000a6000190180199091169216919091179052631110179f60e11b920191825250600401603b6142ed8239603b0183805190602001908083835b60208310611e4e5780518252601f199092019160209182019101611e2f565b6001836020036101000a0380198251168184511680821785525050505050509050018061473a60999139609901607f6151db8239607f0160886155a2823960880160416147d38239604101605d6157628239605d01607261528782396072016049614256823960490160be614a34823960be0160716145068239607101607561511e82396075016066614814823960660160a4614dd0823960a401608561566882397f3c6720636c69702d706174683d2275726c2823636f726e65727329223e00000060858201526b1e3932b1ba103334b6361e9160a11b60a2820152825160ae9091019060208401908083835b60208310611f5b5780518252601f199092019160209182019101611f3c565b6001836020036101000a0380198251168184511680821785525050505050509050018061487a60319139603101604e61429f8239604e01605d6146dd8239605d016041614d2382396041016052614bfc823960520160756156ed8239607501955050505050506040516020818303038152906040529050919050565b60608382858488878a89604051602001808061584560259139602501607d6149b78239607d0189805190602001908083835b602083106120285780518252601f199092019160209182019101612009565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528a516005909101928b0191508083835b602083106120815780518252601f199092019160209182019101612062565b6001836020036101000a038019825116818451168082178552505050505050905001806148ab6079913960790160866157bf823960860187805190602001908083835b602083106120e35780518252601f1990920191602091820191016120c4565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528851600590910192890191508083835b6020831061213c5780518252601f19909201916020918201910161211d565b6001836020036101000a0380198251168184511680821785525050505050509050018061448160859139608501607b6154108239607b0185805190602001908083835b6020831061219e5780518252601f19909201916020918201910161217f565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528651600590910192870191508083835b602083106121f75780518252601f1990920191602091820191016121d8565b6001836020036101000a038019825116818451168082178552505050505050905001806145cb605d9139605d0160a361507b823960a30183805190602001908083835b602083106122595780518252601f19909201916020918201910161223a565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528451600590910192850191508083835b602083106122b25780518252601f199092019160209182019101612293565b6001836020036101000a038019825116818451168082178552505050505050905001806141cb608b9139608b01985050505050505050506040516020818303038152906040529050949350505050565b6060838383604051602001808061432860cd913960cd0184805190602001908083835b602083106123445780518252601f199092019160209182019101612325565b6001836020036101000a03801982511681845116808217855250505050505090500180602f60f81b81525060010183805190602001908083835b6020831061239d5780518252601f19909201916020918201910161237e565b6001836020036101000a038019825116818451168082178552505050505050905001806159ee6077913960770182805190602001908083835b602083106123f55780518252601f1990920191602091820191016123d6565b5181516020939093036101000a60001901801990911692169190911790526a1e17ba32bc3a1f1e17b39f60a91b920191825250600b01607361588e8239607301935050505060405160208183030381529060405290509392505050565b606060008260000b6001146124b9578260000b600019146124905760405180604001604052806005815260200164236e6f6e6560d81b8152506124b4565b6040518060400160405280600a81526020016911b330b23296b237bbb760b11b8152505b6124db565b60405180604001604052806008815260200167023666164652d75760c41b8152505b905060006124ea878787612de7565b9050818183836124f988613015565b60405160200180806c078ce40dac2e6d67a44eae4d85609b1b815250600d0186805190602001908083835b602083106125435780518252601f199092019160209182019101612524565b5181516020939093036101000a600019018019909116921691909117905261149160f11b9201918252506002016077614e74823960770185805190602001908083835b602083106125a55780518252601f199092019160209182019101612586565b6001836020036101000a038019825116818451168082178552505050505050905001806145776054913960540180700785ece7c78ce40dac2e6d67a44eae4d85607b1b81525060110184805190602001908083835b602083106126195780518252601f1990920191602091820191016125fa565b5181516020939093036101000a600019018019909116921691909117905261149160f11b9201918252506002016029614eeb82396029016045614f3e823960450180681e3830ba3410321e9160b91b81525060090183805190602001908083835b602083106126995780518252601f19909201916020918201910161267a565b6001836020036101000a038019825116818451168082178552505050505050905001806151936048913960480182805190602001908083835b602083106126f15780518252601f1990920191602091820191016126d2565b6001836020036101000a0380198251168184511680821785525050505050509050019550505050505060405160208183030381529060405292505050949350505050565b606060006127428461347c565b9050600061274f8461347c565b865183518251929350600490910191600a91820191016000806127728a8a613586565b9150915061278585600401600702610624565b8b61279586600401600702610624565b896127a587600401600702610624565b8a8787604051602001808061525a602d9139602d01806c1e3932b1ba103bb4b23a341e9160991b815250600d0189805190602001908083835b602083106127fd5780518252601f1990920191602091820191016127de565b6001836020036101000a03801982511681845116808217855250505050505090500180614c4e603d9139603d01608d6159018239608d0188805190602001908083835b6020831061285f5780518252601f199092019160209182019101612840565b5181516020939093036101000a60001901801990911692169190911790526a1e17ba32bc3a1f1e17b39f60a91b920191825250600b01602d615a9d8239602d01806c1e3932b1ba103bb4b23a341e9160991b815250600d0187805190602001908083835b602083106128e25780518252601f1990920191602091820191016128c3565b6001836020036101000a03801982511681845116808217855250505050505090500180614c4e603d9139603d016093614924823960930186805190602001908083835b602083106129445780518252601f199092019160209182019101612925565b5181516020939093036101000a60001901801990911692169190911790526a1e17ba32bc3a1f1e17b39f60a91b920191825250600b01602d6146288239602d01806c1e3932b1ba103bb4b23a341e9160991b815250600d0185805190602001908083835b602083106129c75780518252601f1990920191602091820191016129a8565b6001836020036101000a03801982511681845116808217855250505050505090500180614c4e603d9139603d01609361548b823960930184805190602001908083835b60208310612a295780518252601f199092019160209182019101612a0a565b6001836020036101000a03801982511681845116808217855250505050505090500180615a6560389139603801606061598e8239606001606461501782396064016025614655823960250183805190602001908083835b60208310612a9f5780518252601f199092019160209182019101612a80565b51815160209384036101000a6000190180199092169116179052630383c16160e51b919093019081528451600490910192850191508083835b60208310612af75780518252601f199092019160209182019101612ad8565b6001836020036101000a0380198251168184511680821785525050505050509050018061444b60369139603601985050505050505050506040516020818303038152906040529750505050505050509392505050565b6060612b598383613892565b15612baf5760405160200180608d6153838239608d016073614fa482396073016071614cb28239607101608a6152f98239608a01608461551e82396084019050604051602081830303815290604052905061046b565b5060408051602081019091526000815292915050565b600080612be0612bdb60ff8681169086166138f0565b613955565b9050600081118015612bf3575060128111155b15612cb4578260ff168460ff161115612c5d57612c27612c14826002610b6f565b6001600160a01b03871690600a0a61191f565b91506002810660011415612c5857612c55827003298b075b4b6a5240945790619b37fd4a600160801b612cc7565b91505b612caf565b612c7e612c6b826002610b6f565b6001600160a01b03871690600a0a610b6f565b91506002810660011415612caf57612cac82600160801b7003298b075b4b6a5240945790619b37fd4a612cc7565b91505b611910565b50506001600160a01b0390921692915050565b6000808060001985870986860292508281109083900303905080612cfd5760008411612cf257600080fd5b50829004905061061d565b808411612d0957600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600080600060058460ff161115612d9e57612d9b8560ff600419870116600a0a610b6f565b94505b60006004600a8706119050612db486600a610b6f565b95508015612dc3578560010195505b85620186a01415612dd957600a86049550600191505b5084925090505b9250929050565b606060008260020b85850360020b81612dfc57fe5b05905060048160020b13612e44576040518060400160405280601a8152602001794d3120314334312034312031303520313035203134352031343560301b8152509150611910565b60088160020b13612e8857604051806040016040528060198152602001784d31203143333320343920393720313133203134352031343560381b8152509150611910565b60108160020b13612ecc57604051806040016040528060198152602001784d31203143333320353720383920313133203134352031343560381b8152509150611910565b60208160020b13612f1057604051806040016040528060198152602001784d31203143323520363520383120313231203134352031343560381b8152509150611910565b60408160020b13612f5457604051806040016040528060198152602001784d31203143313720373320373320313239203134352031343560381b8152509150611910565b60808160020b13612f9757604051806040016040528060188152602001774d312031433920383120363520313337203134352031343560401b8152509150611910565b6101008160020b13612fdd576040518060400160405280601a8152602001794d31203143312038392035372e3520313435203134352031343560301b8152509150611910565b50506040805180820190915260188152774d312031433120393720343920313435203134352031343560401b60208201529392505050565b6040805180820182526002815261373360f01b6020808301919091528251808401845260038082526203139360ec1b82840152845180860186528181526232313760e81b818501528551808701909652908552620ccccd60ea1b928501929092526060939091906001600087900b148061309357508560000b600019145b1561328a578560000b600019146130aa57816130ac565b835b8660000b600019146130be57816130c0565b835b8760000b600019146130d257836130d4565b855b8860000b600019146130e657836130e8565b855b60405160200180806b1e31b4b931b6329031bc1e9160a11b815250600c0185805190602001908083835b602083106131315780518252601f199092019160209182019101613112565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528651600890910192870191508083835b6020831061318d5780518252601f19909201916020918201910161316e565b6001836020036101000a03801982511681845116808217855250505050505090500180614c8b6027913960270183805190602001908083835b602083106131e55780518252601f1990920191602091820191016131c6565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528451600890910192850191508083835b602083106132415780518252601f199092019160209182019101613222565b6001836020036101000a03801982511681845116808217855250505050505090500180614f14602a9139602a019450505050506040516020818303038152906040529450613473565b8383838360405160200180806b1e31b4b931b6329031bc1e9160a11b815250600c0185805190602001908083835b602083106132d75780518252601f1990920191602091820191016132b8565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528651600890910192870191508083835b602083106133335780518252601f199092019160209182019101613314565b51815160209384036101000a60001901801990921691161790527a383c1110391e911a383c11103334b6361e913bb434ba329110179f60291b919093019081526b1e31b4b931b6329031bc1e9160a11b601b8201528551602790910192860191508083835b602083106133b75780518252601f199092019160209182019101613398565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528451600890910192850191508083835b602083106134135780518252601f1990920191602091820191016133f4565b6001836020036101000a038019825116818451168082178552505050505050905001807a383c1110391e911a383c11103334b6361e913bb434ba329110179f60291b815250601b0194505050505060405160208183030381529060405294505b50505050919050565b6060600060405180602001604052806000815250905060008360020b12156134c25782600019029250604051806040016040528060018152602001602d60f81b81525090505b806134cf8460020b610624565b6040516020018083805190602001908083835b602083106135015780518252601f1990920191602091820191016134e2565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135495780518252601f19909201916020918201910161352a565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b60608060006002858501810b0590506201e847198160020b12156135e257604051806040016040528060018152602001600760fb1b815250604051806040016040528060018152602001603760f81b8152509250925050612de0565b620124f7198160020b121561363257604051806040016040528060018152602001600760fb1b8152506040518060400160405280600481526020016331302e3560e01b8152509250925050612de0565b6161a7198160020b121561368257604051806040016040528060018152602001600760fb1b8152506040518060400160405280600581526020016431342e323560d81b8152509250925050612de0565b611387198160020b12156136d05760405180604001604052806002815260200161031360f41b81525060405180604001604052806002815260200161062760f31b8152509250925050612de0565b60008160020b121561371c5760405180604001604052806002815260200161313160f01b81525060405180604001604052806002815260200161323160f01b8152509250925050612de0565b6113888160020b12156137695760405180604001604052806002815260200161313360f01b81525060405180604001604052806002815260200161323360f01b8152509250925050612de0565b6161a88160020b12156137b65760405180604001604052806002815260200161313560f01b81525060405180604001604052806002815260200161323560f01b8152509250925050612de0565b620124f88160020b12156138045760405180604001604052806002815260200161062760f31b81525060405180604001604052806002815260200161191b60f11b8152509250925050612de0565b6201e8488160020b12156138525760405180604001604052806002815260200161323160f01b81525060405180604001604052806002815260200161323760f01b8152509250925050612de0565b604051806040016040528060028152602001610c8d60f21b81525060405180604001604052806002815260200161323760f01b8152509250925050612de0565b6040805160208082018590526001600160601b0319606085901b168284015282516034818403018152605490920190925280519101206000906138d48461396c565b60020260010160ff16600019816138e757fe5b04119392505050565b60008183038183128015906139055750838113155b8061391a575060008312801561391a57508381135b61061d5760405162461bcd60e51b815260040180806020018281038252602481526020018061586a6024913960400191505060405180910390fd5b600080821215613968578160000361046b565b5090565b600080821161397a57600080fd5b600160801b821061398d57608091821c91015b600160401b82106139a057604091821c91015b600160201b82106139b357602091821c91015b6201000082106139c557601091821c91015b61010082106139d657600891821c91015b601082106139e657600491821c91015b600482106139f657600291821c91015b6002821061016b57600101919050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b80356001600160a01b038116811461016b57600080fd5b8035801515811461016b57600080fd5b8035600281900b811461016b57600080fd5b600082601f830112613a93578081fd5b81356001600160401b03811115613aa657fe5b613ab9601f8201601f1916602001614177565b818152846020838601011115613acd578283fd5b816020850160208301379081016020019190915292915050565b803562ffffff8116811461016b57600080fd5b803560ff8116811461016b57600080fd5b600060208284031215613b1c578081fd5b81356001600160401b0380821115613b32578283fd5b81840191506101c0808387031215613b48578384fd5b613b5181614177565b905082358152613b6360208401613a4a565b6020820152613b7460408401613a4a565b6040820152606083013582811115613b8a578485fd5b613b9687828601613a83565b606083015250608083013582811115613bad578485fd5b613bb987828601613a83565b608083015250613bcb60a08401613afa565b60a0820152613bdc60c08401613afa565b60c0820152613bed60e08401613a61565b60e08201526101009150613c02828401613a71565b828201526101209150613c16828401613a71565b828201526101409150613c2a828401613a71565b828201526101609150613c3e828401613a71565b828201526101809150613c52828401613ae7565b828201526101a09150613c66828401613a4a565b91810191909152949350505050565b60008151613c8781856020860161419a565b9290920192915050565b7fe29aa0efb88f20444953434c41494d45523a204475652064696c6967656e636581527f20697320696d7065726174697665207768656e20617373657373696e6720746860208201527f6973204e46542e204d616b65207375726520746f6b656e20616464726573736560408201527f73206d617463682074686520657870656374656420746f6b656e732c2061732060608201527f746f6b656e2073796d626f6c73206d617920626520696d6974617465642e00006080820152609e0190565b632e372e3760e11b815260040190565b683d913730b6b2911d1160b91b81528451600090613d87816009850160208a0161419a565b71111610113232b9b1b934b83a34b7b7111d1160711b6009918401918201528551613db981601b840160208a0161419a565b8551910190613dcf81601b84016020890161419a565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b60288201528351613e2081604284016020880161419a565b61227d60f01b604292909101918201526044019695505050505050565b60006901020b2323932b9b99d160b51b8083528751613e6381600a860160208c0161419a565b612e3760f11b600a918501918201528751613e8581600c840160208c0161419a565b01600c810191909152855190613ea2826016830160208a0161419a565b8181019150506b02e372332b2902a34b2b91d160a51b60168201528451613ed081602284016020890161419a565b6b02e372a37b5b2b71024a21d160a51b602292909101918201528351613efd81602e84016020880161419a565b613f13613f0e602e83850101613d52565b613c91565b9998505050505050505050565b60007f54686973204e465420726570726573656e74732061206c69717569646974792082527a03837b9b4ba34b7b71034b7103090283ab731b429bbb0b8102b199602d1b60208301528551613f7c81603b850160208a0161419a565b602d60f81b603b918401918201528551613f9d81603c840160208a0161419a565b660103837b7b617160cd1b603c92909101918201527f546865206f776e6572206f662074686973204e46542063616e206d6f646966796043820152791037b9103932b232b2b6903a3432903837b9b4ba34b7b7172e3760311b60638201526f02e372837b7b61020b2323932b9b99d160851b607d820152845161402781608d84016020890161419a565b612e3760f11b608d92909101918201526103ab608f820185613c75565b60006b0283ab731b429bbb0b81016960a51b8252865161406b81600c850160208b0161419a565b80830190506201016960ed1b80600c830152875161409081600f850160208c0161419a565b602f60f81b600f939091019283015286516140b2816010850160208b0161419a565b601092019182015284516140cd81601384016020890161419a565b611e1f60f11b6013929091019182015283516140f081601584016020880161419a565b01601501979650505050505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161413781601d85016020870161419a565b91909101601d0192915050565b600060208252825180602084015261416381604085016020870161419a565b601f01601f19169190910160400192915050565b6040518181016001600160401b038111828210171561419257fe5b604052919050565b60005b838110156141b557818101518382015260200161419d565b838111156141c4576000848401525b5050505056fe203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d223330732220726570656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506174683e3c2f746578743e3c73746f70206f66667365743d222e39222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e3c72656374207374796c653d2266696c7465723a2075726c28236631292220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22353030707822202f3e3c6665496d61676520726573756c743d2270332220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c67206d61736b3d2275726c2823666164652d73796d626f6c29223e3c726563742066696c6c3d226e6f6e652220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22323030707822202f3e203c7465787420793d22373070782220783d2233327078222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d7765696768743d223230302220666f6e742d73697a653d2233367078223e3c7376672077696474683d2232393022206865696768743d22353030222076696577426f783d2230203020323930203530302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672270782c2030707829222063783d22307078222063793d223070782220723d22347078222066696c6c3d227768697465222f3e3c2f673e203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d223330732220726570656174436f756e743d22696e646566696e69746522202f3e203c2f74657874506174683e3c6d61736b2069643d22666164652d757022206d61736b436f6e74656e74556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742077696474683d223122206865696768743d2231222066696c6c3d2275726c2823677261642d75702922202f3e3c2f6d61736b3e22207374726f6b653d227267626128302c302c302c302e332922207374726f6b652d77696474683d2233327078222066696c6c3d226e6f6e6522207374726f6b652d6c696e656361703d22726f756e6422202f3e203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d2233307322203c67207374796c653d227472616e73666f726d3a7472616e736c61746528323970782c20343434707829223e3c636972636c65207374796c653d227472616e73666f726d3a7472616e736c6174653364283c7376672077696474683d2732393027206865696768743d27353030272076696577426f783d2730203020323930203530302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063783d27203c67207374796c653d2266696c7465723a75726c2823746f702d726567696f6e2d626c7572293b207472616e73666f726d3a7363616c6528312e35293b207472616e73666f726d2d6f726967696e3a63656e74657220746f703b223e22202f3e3c6665426c656e64206d6f64653d226f7665726c61792220696e3d2270302220696e323d22703122202f3e3c6665426c656e64206d6f64653d226578636c7573696f6e2220696e323d22703222202f3e3c6665426c656e64206d6f64653d226f7665726c61792220696e323d2270332220726573756c743d22626c656e644f757422202f3e3c6665476175737369616e426c7572203c706174682069643d226d696e696d61702220643d224d3233342034343443323334203435372e393439203234322e323120343633203235332034363322202f3e3c6d61736b2069643d226e6f6e6522206d61736b436f6e74656e74556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742077696474683d223122206865696768743d2231222066696c6c3d22776869746522202f3e3c2f6d61736b3e2220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22353030707822202f3e203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d223330732220726570656174436f756e743d22696e646566696e69746522202f3e3c7465787420783d22313270782220793d22313770782220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747370616e2066696c6c3d2272676261283235352c3235352c3235352c302e3629223e4d696e205469636b3a203c2f747370616e3e3c74657874506174682073746172744f66667365743d222d31303025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c6c696e6561724772616469656e742069643d22677261642d646f776e222078313d2230222078323d2231222079313d2230222079323d2231223e3c73746f70206f66667365743d22302e30222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223122202f3e3c73746f70206f66667365743d22302e39222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e3c66696c7465722069643d226631223e3c6665496d61676520726573756c743d2270302220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c7376672077696474683d2732393027206865696768743d27353030272076696577426f783d2730203020323930203530302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e3c726563742077696474683d27323930707827206865696768743d273530307078272066696c6c3d2723222f3e3c6665496d61676520726573756c743d2270322220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c656c6c697073652063783d22353025222063793d22307078222072783d223138307078222072793d223132307078222066696c6c3d222330303022206f7061636974793d22302e383522202f3e3c2f673e707822206865696768743d2232367078222072783d22387078222072793d22387078222066696c6c3d227267626128302c302c302c302e362922202f3e70782220723d22347078222066696c6c3d22776869746522202f3e3c636972636c652063783d2231312e333437384c32342031324c31342e343334312031322e363532324c32322e333932332031384c31332e373831392031332e373831394c31382032322e333932334c31322e363532322031342e343334314c31322032344c31312e333437382031342e343334314c362032322e33393c726563742066696c6c3d226e6f6e652220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22353030707822202f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f20786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273e3c6c696e6561724772616469656e742069643d22677261642d73796d626f6c223e3c73746f70206f66667365743d22302e37222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223122202f3e3c73746f70206f66667365743d222e3935222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e207374796c653d227472616e73666f726d3a7472616e736c61746528373270782c313839707829223e3c7265637420783d222d313670782220793d222d31367078222077696474683d22313830707822206865696768743d223138307078222066696c6c3d226e6f6e6522202f3e3c7061746820643d22207374796c653d227472616e73666f726d3a7472616e736c61746528373270782c313839707829223e70782220723d2232347078222066696c6c3d226e6f6e6522207374726f6b653d22776869746522202f3e3c7265637420783d222d313670782220793d222d31367078222077696474683d22313830707822206865696768743d223138307078222066696c6c3d226e6f6e6522202f3e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f773c673e3c70617468207374796c653d227472616e73666f726d3a7472616e736c617465283670782c367078292220643d224d313220304c31322e3635323220392e35363538374c313820312e363037374c31332e373831392031302e323138314c32322e3339323320364c31342e34333431203c70617468207374726f6b652d6c696e656361703d22726f756e642220643d224d38203943382e30303030342032322e393439342031362e32303939203238203237203238222066696c6c3d226e6f6e6522207374726f6b653d22776869746522202f3e20726570656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506174683e3c74657874506174682073746172744f66667365743d222d353025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c6d61736b2069643d22666164652d646f776e22206d61736b436f6e74656e74556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742077696474683d223122206865696768743d2231222066696c6c3d2275726c2823677261642d646f776e2922202f3e3c2f6d61736b3e22207374726f6b653d2272676261283235352c3235352c3235352c3129222066696c6c3d226e6f6e6522207374726f6b652d6c696e656361703d22726f756e6422202f3e3c2f673e696e3d22626c656e644f75742220737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e203c636c6970506174682069643d22636f726e657273223e3c726563742077696474683d2232393022206865696768743d22353030222072783d223432222072793d22343222202f3e3c2f636c6970506174683e203c67207374796c653d227472616e73666f726d3a7472616e736c61746528323970782c20333834707829223e3c6c696e6561724772616469656e742069643d22677261642d7570222078313d2231222078323d2230222079313d2231222079323d2230223e3c73746f70206f66667365743d22302e30222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223122202f3e32334c31302e323138312031332e373831394c312e363037372031384c392e35363538372031322e363532324c302031324c392e35363538372031312e333437384c312e3630373720364c31302e323138312031302e323138314c3620312e363037374c31312e3334373820392e35363538374c313220305a222066696c6c3d22776869746522202f3e3c67207374796c653d227472616e73666f726d3a7472616e736c6174652832323670782c20333932707829223e3c726563742077696474683d223336707822206865696768743d2233367078222072783d22387078222072793d22387078222066696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c74657874506174682073746172744f66667365743d22353025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c7465787420783d22313270782220793d22313770782220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747370616e2066696c6c3d2272676261283235352c3235352c3235352c302e3629223e4d6178205469636b3a203c2f747370616e3e3c616e696d6174655472616e73666f726d206174747269627574654e616d653d227472616e73666f726d2220747970653d22726f74617465222066726f6d3d22302031382031382220746f3d2233363020313820313822206475723d223130732220726570656174436f756e743d22696e646566696e697465222f3e3c2f673e3c2f673e3c706174682069643d22746578742d706174682d612220643d224d34302031322048323530204132382032382030203020312032373820343020563436302041323820323820302030203120323530203438382048343020413238203238203020302031203132203436302056343020413238203238203020302031203430203132207a22202f3e222f3e3c6665496d61676520726573756c743d2270312220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c6d61736b2069643d22666164652d73796d626f6c22206d61736b436f6e74656e74556e6974733d227573657253706163654f6e557365223e3c726563742077696474683d22323930707822206865696768743d223230307078222066696c6c3d2275726c2823677261642d73796d626f6c2922202f3e3c2f6d61736b3e3c2f646566733e3c7265637420783d22302220793d2230222077696474683d2232393022206865696768743d22353030222072783d223432222072793d223432222066696c6c3d227267626128302c302c302c302922207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c2f673e3c66696c7465722069643d22746f702d726567696f6e2d626c7572223e3c6665476175737369616e426c757220696e3d22536f75726365477261706869632220737464446576696174696f6e3d22323422202f3e3c2f66696c7465723e3c2f74657874506174683e203c74657874506174682073746172744f66667365743d223025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c7465787420746578742d72656e646572696e673d226f7074696d697a655370656564223e5369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f773c7265637420783d2231362220793d223136222077696474683d2232353822206865696768743d22343638222072783d223236222072793d223236222066696c6c3d227267626128302c302c302c302922207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c7465787420783d22313270782220793d22313770782220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747370616e2066696c6c3d2272676261283235352c3235352c3235352c302e3629223e49443a203c2f747370616e3e3c726563742077696474683d223336707822206865696768743d2233367078222072783d22387078222072793d22387078222066696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c2f746578743e3c7465787420793d2231313570782220783d2233327078222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d7765696768743d223230302220666f6e742d73697a653d2233367078223e3c2f746578743e3c2f673e3c67207374796c653d227472616e73666f726d3a7472616e736c6174652832323670782c20343333707829223e203c67207374796c653d227472616e73666f726d3a7472616e736c61746528323970782c20343134707829223ea26469706673582212204ed85b38f26d972764646f01eeda343ad75aeb3a83d256b494074e33f348d9f964736f6c63430007060033" /* - * > cd ./solidity/lib/punch-swap-v3-contracts - * > forge inspect src/periphery/EmulatorNonfungibleTokenPositionDescriptor.sol bytecode - * - * this contract contains a linkReference at position [1] - * which needs to be replaced with an address of deployed "src/periphery/libraries/NFTDescriptor.sol" - */ +* > cd ./solidity/lib/punch-swap-v3-contracts +* > forge inspect src/periphery/EmulatorNonfungibleTokenPositionDescriptor.sol bytecode +* +* this contract contains a linkReference at position [1] +* which needs to be replaced with an address of deployed "src/periphery/libraries/NFTDescriptor.sol" +*/ access(all) let nftPositionDescriptorBytecodeChunks = [ - "60c060405234801561001057600080fd5b5060405161147938038061147983398101604081905261002f9161005b565b6001600160601b0319606083901b1660805260a08190528181610050610059565b50505050610093565b565b6000806040838503121561006d578182fd5b82516001600160a01b0381168114610083578283fd5b6020939093015192949293505050565b60805160601c60a0516113a76100d2600039806101e0528061021452806102af5250806101155280610174528061055252806105a652506113a76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c80634aa4a4fc146100725780635ec0f502146100905780637e5af771146100b05780639d7b0ea8146100d0578063a18246e2146100e3578063b7af3cdc146100eb578063e9dc637514610100575b600080fd5b61007a610113565b60405161008791906111d0565b60405180910390f35b6100a361009e366004611057565b610137565b60405161008791906111ef565b6100c36100be366004610ead565b610151565b60405161008791906111e4565b6100a36100de366004610eed565b610170565b6100a36101de565b6100f3610202565b60405161008791906111f8565b6100f361010e366004610eed565b61030f565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060208181529281526040808220909352908152205481565b600061015d8383610170565b6101678584610170565b13949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156101b557506063196101d8565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b60208110801561024f57507f0000000000000000000000000000000000000000000000000000000000000000816020811061023e57fe5b1a60f81b6001600160f81b03191615155b1561025c57600101610207565b6000816001600160401b038111801561027457600080fd5b506040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b82811015610308577f000000000000000000000000000000000000000000000000000000000000000081602081106102d957fe5b1a60f81b8282815181106102e957fe5b60200101906001600160f81b031916908160001a9053506001016102a5565b5091505090565b60606000806000806000876001600160a01b03166399fbab88886040518263ffffffff1660e01b815260040161034591906111ef565b6101806040518083038186803b15801561035e57600080fd5b505afa158015610372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039691906110a0565b50505050509650965096509650965050506000610454896001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d9190610e8a565b6040518060600160405280896001600160a01b03168152602001886001600160a01b031681526020018762ffffff1681525061081f565b9050600061046587876100be6108fe565b9050600081156104755787610477565b865b9050600082156104875787610489565b885b90506000846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104c657600080fd5b505afa1580156104da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fe9190610fc8565b505050505091505073", - "__$9cd247c4105613f60afc31857a39206089$__", - "63c49917d7604051806101c001604052808f8152602001866001600160a01b03168152602001856001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146105975761059287610902565b61059f565b61059f610202565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316146105eb576105e686610902565b6105f3565b6105f3610202565b8152602001866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561063157600080fd5b505afa158015610645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106699190611086565b60ff168152602001856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190611086565b60ff16815260200187151581526020018a60020b81526020018960020b81526020018460020b8152602001886001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074657600080fd5b505afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190610f18565b60020b81526020018b62ffffff168152602001886001600160a01b03168152506040518263ffffffff1660e01b81526004016107ba919061120b565b60006040518083038186803b1580156107d257600080fd5b505af41580156107e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080e9190810190610f32565b9d9c50505050505050505050505050565b600081602001516001600160a01b031682600001516001600160a01b03161061084757600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b4690565b60606000610917836395d89b4160e01b61093c565b90508051600014156109345761092c83610b62565b915050610937565b90505b919050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b031985161781529151815160609360009384936001600160a01b03891693919290918291908083835b602083106109a85780518252601f199092019160209182019101610989565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610a08576040519150601f19603f3d011682016040523d82523d6000602084013e610a0d565b606091505b5091509150811580610a1e57508051155b15610a3c5760405180602001604052806000815250925050506101d8565b805160201415610a74576000818060200190516020811015610a5d57600080fd5b50519050610a6a81610b6f565b93505050506101d8565b604081511115610b4a57808060200190516020811015610a9357600080fd5b8101908080516040519392919084600160201b821115610ab257600080fd5b908301906020820185811115610ac757600080fd5b8251600160201b811182820188101715610ae057600080fd5b82525081516020918201929091019080838360005b83811015610b0d578181015183820152602001610af5565b50505050905090810190601f168015610b3a5780820380516001836020036101000a031916815260200191505b50604052505050925050506101d8565b50506040805160208101909152600081529392505050565b6060610934826006610c96565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015610bf9576000858260208110610baf57fe5b1a60f81b90506001600160f81b0319811615610bf05780848481518110610bd257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101610b98565b506000816001600160401b0381118015610c1257600080fd5b506040519080825280601f01601f191660200182016040528015610c3d576020820181803683370190505b50905060005b82811015610c8d57838181518110610c5757fe5b602001015160f81c60f81b828281518110610c6e57fe5b60200101906001600160f81b031916908160001a905350600101610c43565b50949350505050565b606060028206158015610ca95750600082115b8015610cb6575060288211155b610d07576040805162461bcd60e51b815260206004820152601e60248201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604482015290519081900360640190fd5b6000826001600160401b0381118015610d1f57600080fd5b506040519080825280601f01601f191660200182016040528015610d4a576020820181803683370190505b5090506001600160a01b03841660005b60028504811015610dee57600860138290030282901c600f600482901c1660f082168203610d8782610df8565b868560020281518110610d9657fe5b60200101906001600160f81b031916908160001a905350610db681610df8565b868560020260010181518110610dc857fe5b60200101906001600160f81b031916908160001a9053505060019092019150610d5a9050565b5090949350505050565b6000600a8260ff161015610e1357506030810160f81b610937565b506037810160f81b610937565b805161093781611359565b8051600281900b811461093757600080fd5b80516001600160801b038116811461093757600080fd5b805161ffff8116811461093757600080fd5b805162ffffff8116811461093757600080fd5b805160ff8116811461093757600080fd5b600060208284031215610e9b578081fd5b8151610ea681611359565b9392505050565b600080600060608486031215610ec1578182fd5b8335610ecc81611359565b92506020840135610edc81611359565b929592945050506040919091013590565b60008060408385031215610eff578182fd5b8235610f0a81611359565b946020939093013593505050565b600060208284031215610f29578081fd5b610ea682610e2b565b600060208284031215610f43578081fd5b81516001600160401b0380821115610f59578283fd5b818401915084601f830112610f6c578283fd5b815181811115610f7857fe5b604051601f8201601f191681016020018381118282101715610f9657fe5b604052818152838201602001871015610fad578485fd5b610fbe826020830160208701611329565b9695505050505050565b600080600080600080600060e0888a031215610fe2578283fd5b8751610fed81611359565b9650610ffb60208901610e2b565b955061100960408901610e54565b945061101760608901610e54565b935061102560808901610e54565b925061103360a08901610e79565b915060c08801518015158114611047578182fd5b8091505092959891949750929550565b60008060408385031215611069578182fd5b82359150602083013561107b81611359565b809150509250929050565b600060208284031215611097578081fd5b610ea682610e79565b6000806000806000806000806000806000806101808d8f0312156110c2578485fd5b8c516001600160601b03811681146110d8578586fd5b9b506110e660208e01610e20565b9a506110f460408e01610e20565b995061110260608e01610e20565b985061111060808e01610e66565b975061111e60a08e01610e2b565b965061112c60c08e01610e2b565b955061113a60e08e01610e3d565b94506101008d015193506101208d015192506111596101408e01610e3d565b91506111686101608e01610e3d565b90509295989b509295989b509295989b565b6001600160a01b03169052565b15159052565b60020b9052565b600081518084526111ac816020860160208601611329565b601f01601f19169290920160200192915050565b62ffffff169052565b60ff169052565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b600060208252610ea66020830184611194565b60006020825282516020830152602083015161122a604084018261117a565b50604083015161123d606084018261117a565b5060608301516101c080608085015261125a6101e0850183611194565b91506080850151601f198584030160a08601526112778382611194565b92505060a085015161128c60c08601826111c9565b5060c085015161129f60e08601826111c9565b5060e08501516101006112b481870183611187565b86015190506101206112c88682018361118d565b86015190506101406112dc8682018361118d565b86015190506101606112f08682018361118d565b86015190506101806113048682018361118d565b86015190506101a0611318868201836111c0565b8601519050610dee8583018261117a565b60005b8381101561134457818101518382015260200161132c565b83811115611353576000848401525b50505050565b6001600160a01b038116811461136e57600080fd5b5056fea26469706673582212206b6c14f9f0c03cfd3ce4ff104e8de3398f73b0a0b4d9ad39dfc53780fb1a655864736f6c63430007060033"] +"60c060405234801561001057600080fd5b5060405161147938038061147983398101604081905261002f9161005b565b6001600160601b0319606083901b1660805260a08190528181610050610059565b50505050610093565b565b6000806040838503121561006d578182fd5b82516001600160a01b0381168114610083578283fd5b6020939093015192949293505050565b60805160601c60a0516113a76100d2600039806101e0528061021452806102af5250806101155280610174528061055252806105a652506113a76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c80634aa4a4fc146100725780635ec0f502146100905780637e5af771146100b05780639d7b0ea8146100d0578063a18246e2146100e3578063b7af3cdc146100eb578063e9dc637514610100575b600080fd5b61007a610113565b60405161008791906111d0565b60405180910390f35b6100a361009e366004611057565b610137565b60405161008791906111ef565b6100c36100be366004610ead565b610151565b60405161008791906111e4565b6100a36100de366004610eed565b610170565b6100a36101de565b6100f3610202565b60405161008791906111f8565b6100f361010e366004610eed565b61030f565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060208181529281526040808220909352908152205481565b600061015d8383610170565b6101678584610170565b13949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156101b557506063196101d8565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b60208110801561024f57507f0000000000000000000000000000000000000000000000000000000000000000816020811061023e57fe5b1a60f81b6001600160f81b03191615155b1561025c57600101610207565b6000816001600160401b038111801561027457600080fd5b506040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b82811015610308577f000000000000000000000000000000000000000000000000000000000000000081602081106102d957fe5b1a60f81b8282815181106102e957fe5b60200101906001600160f81b031916908160001a9053506001016102a5565b5091505090565b60606000806000806000876001600160a01b03166399fbab88886040518263ffffffff1660e01b815260040161034591906111ef565b6101806040518083038186803b15801561035e57600080fd5b505afa158015610372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039691906110a0565b50505050509650965096509650965050506000610454896001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d9190610e8a565b6040518060600160405280896001600160a01b03168152602001886001600160a01b031681526020018762ffffff1681525061081f565b9050600061046587876100be6108fe565b9050600081156104755787610477565b865b9050600082156104875787610489565b885b90506000846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104c657600080fd5b505afa1580156104da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fe9190610fc8565b505050505091505073", +"__$9cd247c4105613f60afc31857a39206089$__", +"63c49917d7604051806101c001604052808f8152602001866001600160a01b03168152602001856001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146105975761059287610902565b61059f565b61059f610202565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316146105eb576105e686610902565b6105f3565b6105f3610202565b8152602001866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561063157600080fd5b505afa158015610645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106699190611086565b60ff168152602001856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190611086565b60ff16815260200187151581526020018a60020b81526020018960020b81526020018460020b8152602001886001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074657600080fd5b505afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190610f18565b60020b81526020018b62ffffff168152602001886001600160a01b03168152506040518263ffffffff1660e01b81526004016107ba919061120b565b60006040518083038186803b1580156107d257600080fd5b505af41580156107e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080e9190810190610f32565b9d9c50505050505050505050505050565b600081602001516001600160a01b031682600001516001600160a01b03161061084757600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b4690565b60606000610917836395d89b4160e01b61093c565b90508051600014156109345761092c83610b62565b915050610937565b90505b919050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b031985161781529151815160609360009384936001600160a01b03891693919290918291908083835b602083106109a85780518252601f199092019160209182019101610989565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610a08576040519150601f19603f3d011682016040523d82523d6000602084013e610a0d565b606091505b5091509150811580610a1e57508051155b15610a3c5760405180602001604052806000815250925050506101d8565b805160201415610a74576000818060200190516020811015610a5d57600080fd5b50519050610a6a81610b6f565b93505050506101d8565b604081511115610b4a57808060200190516020811015610a9357600080fd5b8101908080516040519392919084600160201b821115610ab257600080fd5b908301906020820185811115610ac757600080fd5b8251600160201b811182820188101715610ae057600080fd5b82525081516020918201929091019080838360005b83811015610b0d578181015183820152602001610af5565b50505050905090810190601f168015610b3a5780820380516001836020036101000a031916815260200191505b50604052505050925050506101d8565b50506040805160208101909152600081529392505050565b6060610934826006610c96565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015610bf9576000858260208110610baf57fe5b1a60f81b90506001600160f81b0319811615610bf05780848481518110610bd257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101610b98565b506000816001600160401b0381118015610c1257600080fd5b506040519080825280601f01601f191660200182016040528015610c3d576020820181803683370190505b50905060005b82811015610c8d57838181518110610c5757fe5b602001015160f81c60f81b828281518110610c6e57fe5b60200101906001600160f81b031916908160001a905350600101610c43565b50949350505050565b606060028206158015610ca95750600082115b8015610cb6575060288211155b610d07576040805162461bcd60e51b815260206004820152601e60248201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604482015290519081900360640190fd5b6000826001600160401b0381118015610d1f57600080fd5b506040519080825280601f01601f191660200182016040528015610d4a576020820181803683370190505b5090506001600160a01b03841660005b60028504811015610dee57600860138290030282901c600f600482901c1660f082168203610d8782610df8565b868560020281518110610d9657fe5b60200101906001600160f81b031916908160001a905350610db681610df8565b868560020260010181518110610dc857fe5b60200101906001600160f81b031916908160001a9053505060019092019150610d5a9050565b5090949350505050565b6000600a8260ff161015610e1357506030810160f81b610937565b506037810160f81b610937565b805161093781611359565b8051600281900b811461093757600080fd5b80516001600160801b038116811461093757600080fd5b805161ffff8116811461093757600080fd5b805162ffffff8116811461093757600080fd5b805160ff8116811461093757600080fd5b600060208284031215610e9b578081fd5b8151610ea681611359565b9392505050565b600080600060608486031215610ec1578182fd5b8335610ecc81611359565b92506020840135610edc81611359565b929592945050506040919091013590565b60008060408385031215610eff578182fd5b8235610f0a81611359565b946020939093013593505050565b600060208284031215610f29578081fd5b610ea682610e2b565b600060208284031215610f43578081fd5b81516001600160401b0380821115610f59578283fd5b818401915084601f830112610f6c578283fd5b815181811115610f7857fe5b604051601f8201601f191681016020018381118282101715610f9657fe5b604052818152838201602001871015610fad578485fd5b610fbe826020830160208701611329565b9695505050505050565b600080600080600080600060e0888a031215610fe2578283fd5b8751610fed81611359565b9650610ffb60208901610e2b565b955061100960408901610e54565b945061101760608901610e54565b935061102560808901610e54565b925061103360a08901610e79565b915060c08801518015158114611047578182fd5b8091505092959891949750929550565b60008060408385031215611069578182fd5b82359150602083013561107b81611359565b809150509250929050565b600060208284031215611097578081fd5b610ea682610e79565b6000806000806000806000806000806000806101808d8f0312156110c2578485fd5b8c516001600160601b03811681146110d8578586fd5b9b506110e660208e01610e20565b9a506110f460408e01610e20565b995061110260608e01610e20565b985061111060808e01610e66565b975061111e60a08e01610e2b565b965061112c60c08e01610e2b565b955061113a60e08e01610e3d565b94506101008d015193506101208d015192506111596101408e01610e3d565b91506111686101608e01610e3d565b90509295989b509295989b509295989b565b6001600160a01b03169052565b15159052565b60020b9052565b600081518084526111ac816020860160208601611329565b601f01601f19169290920160200192915050565b62ffffff169052565b60ff169052565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b600060208252610ea66020830184611194565b60006020825282516020830152602083015161122a604084018261117a565b50604083015161123d606084018261117a565b5060608301516101c080608085015261125a6101e0850183611194565b91506080850151601f198584030160a08601526112778382611194565b92505060a085015161128c60c08601826111c9565b5060c085015161129f60e08601826111c9565b5060e08501516101006112b481870183611187565b86015190506101206112c88682018361118d565b86015190506101406112dc8682018361118d565b86015190506101606112f08682018361118d565b86015190506101806113048682018361118d565b86015190506101a0611318868201836111c0565b8601519050610dee8583018261117a565b60005b8381101561134457818101518382015260200161132c565b83811115611353576000848401525b50505050565b6001600160a01b038116811461136e57600080fd5b5056fea26469706673582212206b6c14f9f0c03cfd3ce4ff104e8de3398f73b0a0b4d9ad39dfc53780fb1a655864736f6c63430007060033"] access(all) fun transferFlow(signer: Test.TestAccount, recipient: Address, amount: UFix64) { @@ -662,7 +662,7 @@ fun getEVMAddressHexFromEvents(_ evts: [AnyStruct], idx: Int): String { Test.assert(evts.length > idx, message: "Event index out of bounds") let evt = evts[idx] as? EVM.TransactionExecuted - ?? panic("Event at index ".concat(idx.toString()).concat(" is not a TransactionExecuted event")) + ?? panic("Event at index ".concat(idx.toString()).concat(" is not a TransactionExecuted event")) let emittedAddress = evt.contractAddress Test.assert(emittedAddress.length != 0, message: "Emitted .contractAddress value is empty") @@ -739,8 +739,10 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun // Transfer bridge account some $FLOW transferFlow(signer: serviceAccount, recipient: bridgeAccount.address, amount: 10_000.0) + transferFlow(signer: serviceAccount, recipient: deployerAccount.address, amount: 10_000.0) // Configure bridge account with a COA createCOA(bridgeAccount, fundingAmount: 1_000.0) + createCOA(deployerAccount, fundingAmount: 1_000.0) err = Test.deployContract( name: "IBridgePermissions", @@ -820,10 +822,10 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun Test.expect(erc721DeployerDeploymentResult, Test.beSucceeded()) // Assign contract addresses var evts = Test.eventsOfType(Type()) - Test.assertEqual(5, evts.length) - let registryAddressHex = getEVMAddressHexFromEvents(evts, idx: 2) - let erc20DeployerAddressHex = getEVMAddressHexFromEvents(evts, idx: 3) - let erc721DeployerAddressHex = getEVMAddressHexFromEvents(evts, idx: 4) + Test.assertEqual(7, evts.length) + let registryAddressHex = getEVMAddressHexFromEvents(evts, idx: 4) + let erc20DeployerAddressHex = getEVMAddressHexFromEvents(evts, idx: 5) + let erc721DeployerAddressHex = getEVMAddressHexFromEvents(evts, idx: 6) // Deploy factory let deploymentResult = _executeTransaction( @@ -834,8 +836,8 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun Test.expect(deploymentResult, Test.beSucceeded()) // Assign the factory contract address evts = Test.eventsOfType(Type()) - Test.assertEqual(6, evts.length) - let factoryAddressHex = getEVMAddressHexFromEvents(evts, idx: 5) + Test.assertEqual(8, evts.length) + let factoryAddressHex = getEVMAddressHexFromEvents(evts, idx: 7) Test.assertEqual(factoryAddressHex.length, 40) err = Test.deployContract( @@ -987,9 +989,9 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun let setBridgedNFTDisplayViewResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_nft_display_view.cdc", [ - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // thumbnailURI - Type().identifier, // thumbnailFileTypeIdentifier - nil // ipfsFilePath + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // thumbnailURI + Type().identifier, // thumbnailFileTypeIdentifier + nil // ipfsFilePath ], bridgeAccount ) @@ -999,16 +1001,16 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun let setBridgedNFTCollectionDisplayResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_nft_collection_display_view.cdc", [ - "https://port.flow.com", // externalURL - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // squareImageURI - Type().identifier, // squareImageFileTypeIdentifier - nil, // squareImageIPFSFilePath - "image/svg+xml", // squareImageMediaType - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // bannerImageURI - Type().identifier, // bannerImageFileTypeIdentifier - nil, // bannerImageIPFSFilePath - "image/svg+xml", // bannerImageMediaType - socialsDict // socialsDict + "https://port.flow.com", // externalURL + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // squareImageURI + Type().identifier, // squareImageFileTypeIdentifier + nil, // squareImageIPFSFilePath + "image/svg+xml", // squareImageMediaType + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // bannerImageURI + Type().identifier, // bannerImageFileTypeIdentifier + nil, // bannerImageIPFSFilePath + "image/svg+xml", // bannerImageMediaType + socialsDict // socialsDict ], bridgeAccount ) @@ -1017,12 +1019,12 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun let setFTDisplayResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_ft_display_view.cdc", [ - "https://port.flow.com", // externalURL - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // logoURI - Type().identifier, // logoFileTypeIdentifier - nil, // logoIPFSFilePath - "image/svg+xml", // logoMediaType - socialsDict // socialsDict + "https://port.flow.com", // externalURL + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // logoURI + Type().identifier, // logoFileTypeIdentifier + nil, // logoIPFSFilePath + "image/svg+xml", // logoMediaType + socialsDict // socialsDict ], bridgeAccount ) @@ -1057,7 +1059,7 @@ fun evmDeploy(_ bytecode: String, _ args: [String]): String { let argsBytecode = EVM.encodeABI(args) let bytecodeWithArgs = String.encodeHex(bytecode.decodeHex().concat(argsBytecode)) - return evmDeployRaw(bridgeAccount, bytecode: bytecodeWithArgs, gasLimit: UInt64(15_000_000), value: 0.0) + return evmDeployRaw(deployerAccount, bytecode: bytecodeWithArgs, gasLimit: UInt64(15_000_000), value: 0.0) } access(all) @@ -1065,6 +1067,20 @@ fun deployWFLOW(_ signer: Test.TestAccount): String { return evmDeployRaw(signer, bytecode: wflowBytecode, gasLimit: UInt64(15_000_000), value: 0.0) } +access(all) +fun evmCallRaw(_ signer: Test.TestAccount, target: String, calldata: String, gasLimit: UInt64, value: UInt, beFailed: Bool) { + let res = _executeTransaction( + "../../lib/flow-evm-bridge/cadence/transactions/evm/call.cdc", + [target, calldata, gasLimit, value], + signer + ) + Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) +} +access(all) +fun evmCall(_ target: String, _ calldata: String) { + return evmCallRaw(deployerAccount, target: target, calldata: calldata, gasLimit: UInt64(15_000_000), value: 0, beFailed: false) +} + access(all) let uniV2FactoryBytecode = "608060405234801561001057600080fd5b506040516136863803806136868339818101604052602081101561003357600080fd5b5051600180546001600160a01b0319166001600160a01b03909216919091179055613623806100636000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a2e74af61161005b578063a2e74af6146100fd578063c9c6539614610132578063e6a439051461016d578063f46901ed146101a857610088565b8063017e7e581461008d578063094b7415146100be5780631e3dd18b146100c6578063574f2ba3146100e3575b600080fd5b6100956101db565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100956101f7565b610095600480360360208110156100dc57600080fd5b5035610213565b6100eb610247565b60408051918252519081900360200190f35b6101306004803603602081101561011357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661024d565b005b6100956004803603604081101561014857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661031a565b6100956004803603604081101561018357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661076d565b610130600480360360208110156101be57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166107a0565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6003818154811061022057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60035490565b60015473ffffffffffffffffffffffffffffffffffffffff1633146102d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156103b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056323a204944454e544943414c5f4144445245535345530000604482015290519081900360640190fd5b6000808373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106103f45783856103f7565b84845b909250905073ffffffffffffffffffffffffffffffffffffffff821661047e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f556e697377617056323a205a45524f5f41444452455353000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82811660009081526002602090815260408083208585168452909152902054161561051f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f556e697377617056323a20504149525f45584953545300000000000000000000604482015290519081900360640190fd5b6060604051806020016105319061086d565b6020820181038252601f19601f82011660405250905060008383604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140192505050604051602081830303815290604052805190602001209050808251602084016000f5604080517f485cc95500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152868116602483015291519297509087169163485cc9559160448082019260009290919082900301818387803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff84811660008181526002602081815260408084208987168086529083528185208054978d167fffffffffffffffffffffffff000000000000000000000000000000000000000098891681179091559383528185208686528352818520805488168517905560038054600181018255958190527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90950180549097168417909655925483519283529082015281517f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9929181900390910190a35050505092915050565b600260209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16331461082657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612d748061087b8339019056fe60806040526001600c5534801561001557600080fd5b506040514690806052612d228239604080519182900360520182208282018252600a8352692ab734b9bbb0b8102b1960b11b6020938401528151808301835260018152603160f81b908401528151808401919091527fbfcc8ef98ffbf7b6c3fec7bf5185b566b9863e35a9d83acd49ad6824b5969738818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060035550600580546001600160a01b03191633179055612c1d806101056000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a7146105da578063d505accf146105e2578063dd62ed3e14610640578063fff6cae91461067b576101b9565b8063ba9a7a5614610597578063bc25cf771461059f578063c45a0155146105d2576101b9565b80637ecebe00116100d35780637ecebe00146104d757806389afcb441461050a57806395d89b4114610556578063a9059cbb1461055e576101b9565b80636a6278421461046957806370a082311461049c5780637464fc3d146104cf576101b9565b806323b872dd116101665780633644e515116101405780633644e51514610416578063485cc9551461041e5780635909c0d5146104595780635a3d549314610461576101b9565b806323b872dd146103ad57806330adf81f146103f0578063313ce567146103f8576101b9565b8063095ea7b311610197578063095ea7b3146103155780630dfe16811461036257806318160ddd14610393576101b9565b8063022c0d9f146101be57806306fdde03146102595780630902f1ac146102d6575b600080fd5b610257600480360360808110156101d457600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561021857600080fd5b82018360208201111561022a57600080fd5b8035906020019184600183028401116401000000008311171561024c57600080fd5b509092509050610683565b005b610261610d57565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102de610d90565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b61034e6004803603604081101561032b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610de5565b604080519115158252519081900360200190f35b61036a610dfc565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61039b610e18565b60408051918252519081900360200190f35b61034e600480360360608110156103c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610e1e565b61039b610efd565b610400610f21565b6040805160ff9092168252519081900360200190f35b61039b610f26565b6102576004803603604081101561043457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f2c565b61039b611005565b61039b61100b565b61039b6004803603602081101561047f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611011565b61039b600480360360208110156104b257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113cb565b61039b6113dd565b61039b600480360360208110156104ed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113e3565b61053d6004803603602081101561052057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113f5565b6040805192835260208301919091528051918290030190f35b610261611892565b61034e6004803603604081101561057457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356118cb565b61039b6118d8565b610257600480360360208110156105b557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118de565b61036a611ad4565b61036a611af0565b610257600480360360e08110156105f857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611b0c565b61039b6004803603604081101561065657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611dd8565b610257611df5565b600c546001146106f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55841515806107075750600084115b61075c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612b2f6025913960400191505060405180910390fd5b600080610767610d90565b5091509150816dffffffffffffffffffffffffffff168710801561079a5750806dffffffffffffffffffffffffffff1686105b6107ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b786021913960400191505060405180910390fd5b600654600754600091829173ffffffffffffffffffffffffffffffffffffffff91821691908116908916821480159061085457508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b6108bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e697377617056323a20494e56414c49445f544f0000000000000000000000604482015290519081900360640190fd5b8a156108d0576108d0828a8d611fdb565b89156108e1576108e1818a8c611fdb565b86156109c3578873ffffffffffffffffffffffffffffffffffffffff166310d1e85c338d8d8c8c6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610a2f57600080fd5b505afa158015610a43573d6000803e3d6000fd5b505050506040513d6020811015610a5957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191955073ffffffffffffffffffffffffffffffffffffffff8316916370a0823191602480820192602092909190829003018186803b158015610acb57600080fd5b505afa158015610adf573d6000803e3d6000fd5b505050506040513d6020811015610af557600080fd5b5051925060009150506dffffffffffffffffffffffffffff85168a90038311610b1f576000610b35565b89856dffffffffffffffffffffffffffff160383035b9050600089856dffffffffffffffffffffffffffff16038311610b59576000610b6f565b89856dffffffffffffffffffffffffffff160383035b90506000821180610b805750600081115b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612b546024913960400191505060405180910390fd5b6000610c09610beb84600363ffffffff6121e816565b610bfd876103e863ffffffff6121e816565b9063ffffffff61226e16565b90506000610c21610beb84600363ffffffff6121e816565b9050610c59620f4240610c4d6dffffffffffffffffffffffffffff8b8116908b1663ffffffff6121e816565b9063ffffffff6121e816565b610c69838363ffffffff6121e816565b1015610cd657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e697377617056323a204b0000000000000000000000000000000000000000604482015290519081900360640190fd5b5050610ce4848488886122e0565b60408051838152602081018390528082018d9052606081018c9052905173ffffffffffffffffffffffffffffffffffffffff8b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600a81526020017f556e69737761702056320000000000000000000000000000000000000000000081525081565b6008546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000008304909116917c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b6000610df233848461259c565b5060015b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610ee85773ffffffffffffffffffffffffffffffffffffffff84166000908152600260209081526040808320338452909152902054610eb6908363ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610ef384848461260b565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60055473ffffffffffffffffffffffffffffffffffffffff163314610fb257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c5460011461108457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611094610d90565b50600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905193955091935060009273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d602081101561113857600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d60208110156111db57600080fd5b505190506000611201836dffffffffffffffffffffffffffff871663ffffffff61226e16565b90506000611225836dffffffffffffffffffffffffffff871663ffffffff61226e16565b9050600061123387876126ec565b600054909150806112705761125c6103e8610bfd611257878763ffffffff6121e816565b612878565b985061126b60006103e86128ca565b6112cd565b6112ca6dffffffffffffffffffffffffffff8916611294868463ffffffff6121e816565b8161129b57fe5b046dffffffffffffffffffffffffffff89166112bd868563ffffffff6121e816565b816112c457fe5b0461297a565b98505b60008911611326576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612bc16028913960400191505060405180910390fd5b6113308a8a6128ca565b61133c86868a8a6122e0565b811561137e5760085461137a906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c5460011461146957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611479610d90565b50600654600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b1580156114fb57600080fd5b505afa15801561150f573d6000803e3d6000fd5b505050506040513d602081101561152557600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b15801561159957600080fd5b505afa1580156115ad573d6000803e3d6000fd5b505050506040513d60208110156115c357600080fd5b5051306000908152600160205260408120549192506115e288886126ec565b600054909150806115f9848763ffffffff6121e816565b8161160057fe5b049a5080611614848663ffffffff6121e816565b8161161b57fe5b04995060008b11801561162e575060008a115b611683576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612b996028913960400191505060405180910390fd5b61168d3084612992565b611698878d8d611fdb565b6116a3868d8c611fdb565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b15801561170f57600080fd5b505afa158015611723573d6000803e3d6000fd5b505050506040513d602081101561173957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191965073ffffffffffffffffffffffffffffffffffffffff8816916370a0823191602480820192602092909190829003018186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d60208110156117d557600080fd5b505193506117e585858b8b6122e0565b811561182757600854611823906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b604080518c8152602081018c9052815173ffffffffffffffffffffffffffffffffffffffff8f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600681526020017f554e492d5632000000000000000000000000000000000000000000000000000081525081565b6000610df233848461260b565b6103e881565b600c5460011461194f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654600754600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9485169490931692611a2b9285928792611a26926dffffffffffffffffffffffffffff169185916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6020811015611a1857600080fd5b50519063ffffffff61226e16565b611fdb565b600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611aca9284928792611a26926e01000000000000000000000000000090046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff8616916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b50506001600c5550565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b42841015611b7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e697377617056323a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff80891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015611cdc573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611d5757508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611dc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e415455524500000000604482015290519081900360640190fd5b611dcd89898961259c565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611e6657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611fd49273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015611edd57600080fd5b505afa158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b158015611f7a57600080fd5b505afa158015611f8e573d6000803e3d6000fd5b505050506040513d6020811015611fa457600080fd5b50516008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166122e0565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b602083106120e157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016120a4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b5091509150818015612176575080511580612176575080806020019051602081101561217357600080fd5b50515b6121e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b60008115806122035750508082028282828161220057fe5b04145b610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820382811115610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6dffffffffffffffffffffffffffff841180159061230c57506dffffffffffffffffffffffffffff8311155b61237757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f556e697377617056323a204f564552464c4f5700000000000000000000000000604482015290519081900360640190fd5b60085463ffffffff428116917c0100000000000000000000000000000000000000000000000000000000900481168203908116158015906123c757506dffffffffffffffffffffffffffff841615155b80156123e257506dffffffffffffffffffffffffffff831615155b15612492578063ffffffff16612425856123fb86612a57565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169063ffffffff612a7b16565b600980547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169290920201905563ffffffff8116612465846123fb87612a57565b600a80547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216929092020190555b600880547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff888116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008883168102919091177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612641908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612683908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d602081101561278157600080fd5b5051600b5473ffffffffffffffffffffffffffffffffffffffff821615801594509192509061286457801561285f5760006127d86112576dffffffffffffffffffffffffffff88811690881663ffffffff6121e816565b905060006127e583612878565b90508082111561285c576000612813612804848463ffffffff61226e16565b6000549063ffffffff6121e816565b905060006128388361282c86600563ffffffff6121e816565b9063ffffffff612abc16565b9050600081838161284557fe5b04905080156128585761285887826128ca565b5050505b50505b612870565b8015612870576000600b555b505092915050565b600060038211156128bb575080600160028204015b818110156128b5578091506002818285816128a457fe5b0401816128ad57fe5b04905061288d565b506128c5565b81156128c5575060015b919050565b6000546128dd908263ffffffff612abc16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054612915908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310612989578161298b565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546129c8908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554612a02908263ffffffff61226e16565b600090815560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6dffffffffffffffffffffffffffff166e0100000000000000000000000000000290565b60006dffffffffffffffffffffffffffff82167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841681612ab457fe5b049392505050565b80820182811015610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe556e697377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f494e5055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f4c4951554944495459556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4255524e4544556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a723158207dca18479e58487606bf70c79e44d8dee62353c9ee6d01f9a9d70885b8765f2264736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429a265627a7a723158202760f92d7fa1db6f5aa16307bad65df4ebcc8550c4b1f03755ab8dfd830c178f64736f6c63430005100032" access(all) let uniV2RouterBytecode = "60c06040523480156200001157600080fd5b506040516200577338038062005773833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6155ec62000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611e1e5280611fa252806120725280612179528061232c52806123c15280612673528061271a52806127ef52806128f452806129dc5280612a5d52806130ec5280613422528061347852806134ac528061352d528061374752806138f7528061398c5250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061225f528061240052806125a95280612a9c5280612ddf5280613071528061309a52806130ca52806132a75280613456528061382d52806139cb5280614434528061447752806147d752806149b85280614f335280615014528061509452506155ec6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961306f565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613093945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130c0565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613218565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133a7565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136d3565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612d65565b9093509150610e96898685613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613ce9565b50965096945050505050565b6000610f44848484613e26565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140b0565b8560008151811061124a57fe5b602002602001015161419b565b6112968287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061436b915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613ce9565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846145f2565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f6140b0565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b61162a868660008181106111a257fe5b6113598287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154e76027913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140b0565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a61419b565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c32929091899189918291850190849080828437600092019190915250889250614780915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b1316565b1015611d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f59858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614780915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613ce9565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6122b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b5095945050505050565b6000610f44848484614b85565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6126027f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154e76027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614ca9565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b612743887f00000000000000000000000000000000000000000000000000000000000000008989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613ce9565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a918291850190849080828437600092019190915250899250614780915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6000612e057f00000000000000000000000000000000000000000000000000000000000000008c8c6140b0565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614d89565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a871015613005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061550e6026913960400191505060405180910390fd5b8986101561305e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154746026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613f4a565b60008060006131107f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140b0565b905060008761311f578c613141565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156131dd57600080fd5b505af11580156131f1573d6000803e3d6000fd5b505050506132038e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561328d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61329b8c8c8c8c8c8c614edc565b909450925060006132cd7f00000000000000000000000000000000000000000000000000000000000000008e8e6140b0565b90506132db8d33838861419b565b6132e78c33838761419b565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050506040513d602081101561339057600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561341c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61344a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614edc565b9094509250600061349c7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140b0565b90506134aa8b33838861419b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561351257600080fd5b505af1158015613526573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d60208110156135fc57600080fd5b505161360457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b50519250348410156136c5576136c533853403613ce9565b505096509650969350505050565b6060814281101561374557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061378957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461382857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6138867f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150348260008151811061389657fe5b602002602001015111156138f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154e76027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061393e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139f77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b84600081518110613a0457fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b5051613aa757fe5b613ae68287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b81600081518110613af357fe5b602002602001015134111561251b5761251b3383600081518110613b1357fe5b60200260200101513403613ce9565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613bf857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613bbb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5091509150818015613c8d575080511580613c8d5750808060200190516020811015613c8a57600080fd5b50515b613ce2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061555f602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613d6057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d23565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dc2576040519150601f19603f3d011682016040523d82523d6000602084013e613dc7565b606091505b5050905080613e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061541b6034913960400191505060405180910390fd5b505050565b6000808411613e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061558c602b913960400191505060405180910390fd5b600083118015613e905750600082115b613ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061549a6028913960400191505060405180910390fd5b6000613ef9856103e563ffffffff6151dd16565b90506000613f0d828563ffffffff6151dd16565b90506000613f3383613f27886103e863ffffffff6151dd16565b9063ffffffff61526316565b9050808281613f3e57fe5b04979650505050505050565b6060600282511015613fbd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613fd557600080fd5b50604051908082528060200260200182016040528015613fff578160200160208202803683370190505b509050828160008151811061401057fe5b60200260200101818152505060005b60018351038110156140a8576000806140628786858151811061403e57fe5b602002602001015187866001018151811061405557fe5b60200260200101516152d5565b9150915061408484848151811061407557fe5b60200260200101518383613e26565b84846001018151811061409357fe5b6020908102919091010152505060010161401f565b509392505050565b60008060006140bf8585614d89565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061427957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161423c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142db576040519150601f19603f3d011682016040523d82523d6000602084013e6142e0565b606091505b509150915081801561430e57508051158061430e575080806020019051602081101561430b57600080fd5b50515b614363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806153ea6031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156145ec5760008084838151811061438957fe5b60200260200101518584600101815181106143a057fe5b60200260200101519150915060006143b88383614d89565b50905060008785600101815181106143cc57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461441457826000614418565b6000835b91509150600060028a5103881061442f5788614470565b6144707f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061446357fe5b60200260200101516140b0565b905061449d7f000000000000000000000000000000000000000000000000000000000000000088886140b0565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156144e7576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561457257818101518382015260200161455a565b50505050905090810190601f16801561459f5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145c157600080fd5b505af11580156145d5573d6000803e3d6000fd5b50506001909901985061436e975050505050505050565b50505050565b606060028251101561466557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561467d57600080fd5b506040519080825280602002602001820160405280156146a7578160200160208202803683370190505b50905082816001835103815181106146bb57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140a85760008061471b8786600186038151811061470757fe5b602002602001015187868151811061405557fe5b9150915061473d84848151811061472e57fe5b60200260200101518383614b85565b84600185038151811061474c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016146eb565b60005b6001835103811015613e215760008084838151811061479e57fe5b60200260200101518584600101815181106147b557fe5b60200260200101519150915060006147cd8383614d89565b50905060006147fd7f000000000000000000000000000000000000000000000000000000000000000085856140b0565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561484b57600080fd5b505afa15801561485f573d6000803e3d6000fd5b505050506040513d606081101561487557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146148bf5782846148c2565b83835b91509150614947828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b9550614954868383613e26565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149985782600061499c565b6000835b91509150600060028c51038a106149b3578a6149e7565b6149e77f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061446357fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614a97578181015183820152602001614a7f565b50505050905090810190601f168015614ac45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614ae657600080fd5b505af1158015614afa573d6000803e3d6000fd5b50506001909b019a506147839950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806153be602c913960400191505060405180910390fd5b600083118015614bef5750600082115b614c44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061549a6028913960400191505060405180910390fd5b6000614c686103e8614c5c868863ffffffff6151dd16565b9063ffffffff6151dd16565b90506000614c826103e5614c5c868963ffffffff614b1316565b9050614c9f6001828481614c9257fe5b049063ffffffff61526316565b9695505050505050565b6000808411614d03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154c26025913960400191505060405180910390fd5b600083118015614d135750600082115b614d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061549a6028913960400191505060405180910390fd5b82614d79858463ffffffff6151dd16565b81614d8057fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061544f6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614e4b578284614e4e565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614ed557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614f7c57600080fd5b505afa158015614f90573d6000803e3d6000fd5b505050506040513d6020811015614fa657600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561508c57604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561505f57600080fd5b505af1158015615073573d6000803e3d6000fd5b505050506040513d602081101561508957600080fd5b50505b6000806150ba7f00000000000000000000000000000000000000000000000000000000000000008b8b6152d5565b915091508160001480156150cc575080155b156150dc578793508692506151d0565b60006150e9898484614ca9565b9050878111615156578581101561514b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154746026913960400191505060405180910390fd5b8894509250826151ce565b6000615163898486614ca9565b90508981111561516f57fe5b878110156151c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061550e6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806151f8575050808202828282816151f557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006152e48585614d89565b5090506000806152f58888886140b0565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561533a57600080fd5b505afa15801561534e573d6000803e3d6000fd5b505050506040513d606081101561536457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146153ab5780826153ae565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220cd8090fbf0eabe8cf2d2e7c9b3a7f79b408338f37b24017b6f6495c82b19cbde64736f6c63430006060033" @@ -1126,17 +1142,17 @@ fun setupPunchswap(): {String: String} { log("deploy NFTPositionDescriptor") let nftPositionDescriptorAddress = evmDeploy( nftPositionDescriptorBytecodeChunks[0] - .concat(nftDescriptorAddress) - .concat(nftPositionDescriptorBytecodeChunks[2]), + .concat(nftDescriptorAddress) + .concat(nftPositionDescriptorBytecodeChunks[2]), [wflowAddress,"WFLOW"] ) log("NFTPositionDescriptor address \(nftPositionDescriptorAddress)") log("deploy UniswapV2Factory") - let bridgeCOA = getCOA(bridgeAccount.address)! + let ownerCOA = getCOA(deployerAccount.address)! let univ2FactoryAddress = evmDeploy( uniV2FactoryBytecode, - [bridgeCOA] + [ownerCOA] ) log("UniswapV2Factory address \(univ2FactoryAddress)") @@ -1162,8 +1178,8 @@ fun setupPunchswap(): {String: String} { log("QuoterV2 address \(quoterV2Address)") return { - quoterV2Address: quoterV2Address, - swapRouter02Address: swapRouter02Address, - punchswapV3FactoryAddress: punchswapV3FactoryAddress + "quoterV2Address": quoterV2Address, + "swapRouter02Address": swapRouter02Address, + "punchswapV3FactoryAddress": punchswapV3FactoryAddress } } diff --git a/cadence/tests/transactions/create_and_store_pool.cdc b/cadence/tests/transactions/create_and_store_pool.cdc new file mode 100644 index 00000000..b4789a1c --- /dev/null +++ b/cadence/tests/transactions/create_and_store_pool.cdc @@ -0,0 +1,30 @@ +import "FungibleToken" + +import "DeFiActions" +import "FlowALP" +import "MockOracle" + +/// THIS TRANSACTION IS NOT INTENDED FOR PRODUCTION +/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +/// +/// Creates the protocol pool in the FlowALP account via the stored PoolFactory resource +/// +/// @param defaultTokenIdentifier: The Type identifier (e.g. resource.getType().identifier) of the Pool's default token +/// +transaction(defaultTokenIdentifier: String) { + + let factory: &FlowALP.PoolFactory + let defaultToken: Type + let oracle: {DeFiActions.PriceOracle} + + prepare(signer: auth(BorrowValue) &Account) { + self.factory = signer.storage.borrow<&FlowALP.PoolFactory>(from: FlowALP.PoolFactoryPath) + ?? panic("Could not find PoolFactory in signer's account") + self.defaultToken = CompositeType(defaultTokenIdentifier) ?? panic("Invalid defaultTokenIdentifier \(defaultTokenIdentifier)") + self.oracle = MockOracle.PriceOracle() + } + + execute { + self.factory.createPool(defaultToken: self.defaultToken, priceOracle: self.oracle) + } +} diff --git a/cadence/tests/univ3_connector_test.cdc b/cadence/tests/univ3_connector_test.cdc new file mode 100644 index 00000000..720173b9 --- /dev/null +++ b/cadence/tests/univ3_connector_test.cdc @@ -0,0 +1,56 @@ +import Test +import BlockchainHelpers +import "EVM" + +import "test_helpers.cdc" + + +access(all) fun setup() { + deployContracts() + let punchswapConfig = setupPunchswap() + log(punchswapConfig) +} + +access(self) +fun mint(_ target: String, _ recepient: String, _ amount: UInt256) { + evmCall( + target, + String.encodeHex(EVM.encodeABIWithSignature("mint(address,uint256)", [recepient, amount])), + ) +} + +access(self) +fun approve(_ target: EVM.EVMAddress, _ approvee: EVM.EVMAddress, _ amount: UInt256) { + evmCall( + target.toString(), + String.encodeHex(EVM.encodeABIWithSignature("approve(address,uint256)", [approvee.toString(), amount])), + ) +} + +access(all) +fun test_Univ3Connector() { + log("deploy USDC6") + let bridgeCOA = getCOA(bridgeAccount.address)! + let usdc6Address = evmDeploy( + usdc6Bytecode, + [bridgeCOA] + ) + log("USDC6 address \(usdc6Address)") + + let onboardUSDC6 = _executeTransaction( + "../../lib/flow-evm-bridge/cadence/transactions/bridge/onboarding/onboard_by_evm_address.cdc", + [usdc6Address], + bridgeAccount + ) + Test.expect(onboardUSDC6, Test.beSucceeded()) + log("USDC6 onboarded") + + let usdc6Type = _executeScript( + "../../lib/flow-evm-bridge/cadence/scripts/bridge/get_associated_type.cdc", + [usdc6Address] + ) + log(usdc6Type) + + mint(usdc6Address, "0x".concat(bridgeCOA), 1_000_000_000_000) + +} diff --git a/cadence/transactions/moet/mint_moet.cdc b/cadence/transactions/moet/mint_moet.cdc index 1a0ddd43..c7aac4ab 100644 --- a/cadence/transactions/moet/mint_moet.cdc +++ b/cadence/transactions/moet/mint_moet.cdc @@ -17,7 +17,7 @@ transaction(to: Address, amount: UFix64) { prepare(signer: auth(BorrowValue) &Account) { self.minter = signer.storage.borrow<&MOET.Minter>(from: MOET.AdminStoragePath) ?? panic("Could not borrow reference to MOET Minter from signer's account at path \(MOET.AdminStoragePath)") - self.receiver = getAccount(to).capabilities.borrow<&{FungibleToken.Vault}>(MOET.VaultPublicPath) + self.receiver = getAccount(to).capabilities.borrow<&{FungibleToken.Vault}>(/public/moetTokenReceiver_0xd27920b6384e2a78) ?? panic("Could not borrow reference to MOET Vault from recipient's account at path \(MOET.VaultPublicPath)") } From 40edea295e9f8e41936faf694ae384d52caad43f Mon Sep 17 00:00:00 2001 From: Alex <12097569+nialexsan@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:52:28 -0500 Subject: [PATCH 2/7] use evmDeloy --- cadence/tests/test_helpers.cdc | 81 +++++++++++++------------- cadence/tests/univ3_connector_test.cdc | 1 + 2 files changed, 40 insertions(+), 42 deletions(-) diff --git a/cadence/tests/test_helpers.cdc b/cadence/tests/test_helpers.cdc index 452a31da..73ebb6db 100644 --- a/cadence/tests/test_helpers.cdc +++ b/cadence/tests/test_helpers.cdc @@ -800,44 +800,37 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun Test.expect(err, Test.beNil()) // Deploy registry - let registryDeploymentResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/evm/deploy.cdc", - [registryBytecode, UInt64(15_000_000), 0.0], - bridgeAccount + let registryAddressHex = evmDeploy( + bridgeAccount, + registryBytecode, + [] ) - Test.expect(registryDeploymentResult, Test.beSucceeded()) + log(registryAddressHex) // Deploy ERC20Deployer - let erc20DeployerDeploymentResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/evm/deploy.cdc", - [erc20DeployerBytecode, UInt64(15_000_000), 0.0], - bridgeAccount + let erc20DeployerAddressHex = evmDeploy( + bridgeAccount, + erc20DeployerBytecode, + [] ) - Test.expect(erc20DeployerDeploymentResult, Test.beSucceeded()) // Deploy ERC721Deployer - let erc721DeployerDeploymentResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/evm/deploy.cdc", - [erc721DeployerBytecode, UInt64(15_000_000), 0.0], - bridgeAccount + let erc721DeployerAddressHex = evmDeploy( + bridgeAccount, + erc721DeployerBytecode, + [] ) - Test.expect(erc721DeployerDeploymentResult, Test.beSucceeded()) // Assign contract addresses var evts = Test.eventsOfType(Type()) - Test.assertEqual(7, evts.length) - let registryAddressHex = getEVMAddressHexFromEvents(evts, idx: 4) - let erc20DeployerAddressHex = getEVMAddressHexFromEvents(evts, idx: 5) - let erc721DeployerAddressHex = getEVMAddressHexFromEvents(evts, idx: 6) + Test.assertEqual(25, evts.length) // Deploy factory - let deploymentResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/evm/deploy.cdc", - [compiledFactoryBytecode, UInt64(15_000_000), 0.0], - bridgeAccount + let factoryAddressHex = evmDeploy( + bridgeAccount, + compiledFactoryBytecode, + [] ) - Test.expect(deploymentResult, Test.beSucceeded()) // Assign the factory contract address evts = Test.eventsOfType(Type()) - Test.assertEqual(8, evts.length) - let factoryAddressHex = getEVMAddressHexFromEvents(evts, idx: 7) + Test.assertEqual(26, evts.length) Test.assertEqual(factoryAddressHex.length, 40) err = Test.deployContract( @@ -1055,7 +1048,7 @@ fun evmDeployRaw(_ signer: Test.TestAccount, bytecode: String, gasLimit: UInt64, } access(all) -fun evmDeploy(_ bytecode: String, _ args: [String]): String { +fun evmDeploy(_ signer: Test.TestAccount, _ bytecode: String, _ args: [String]): String { let argsBytecode = EVM.encodeABI(args) let bytecodeWithArgs = String.encodeHex(bytecode.decodeHex().concat(argsBytecode)) @@ -1064,7 +1057,7 @@ fun evmDeploy(_ bytecode: String, _ args: [String]): String { access(all) fun deployWFLOW(_ signer: Test.TestAccount): String { - return evmDeployRaw(signer, bytecode: wflowBytecode, gasLimit: UInt64(15_000_000), value: 0.0) + return evmDeploy(signer, wflowBytecode, []) } access(all) @@ -1089,21 +1082,18 @@ access(all) fun setupUniswapV2(_ signer: Test.TestAccount, feeToSetter: String, wflowAddress: String): String { // deserialize the feeToSetter & WFLOW addresses let feeToSetterAddr = EVM.addressFromString(feeToSetter) - let wflowAddr = EVM.addressFromString(wflowAddress) // deploy uniV2Factory, concatenating feeToSetter as constructor arg - let factoryArgsBytecode = EVM.encodeABI([feeToSetter]) - let univ2FactoryAddress = evmDeployRaw(signer, - bytecode: String.encodeHex(uniV2FactoryBytecode.decodeHex().concat(factoryArgsBytecode)), - gasLimit: UInt64(15_000_000), - value: 0.0 + let univ2FactoryAddress = evmDeploy( + signer, + uniV2FactoryBytecode, + [feeToSetter] ) // deploy uniV2Router, concatenating the factory and WFLOW addresses as constructor args - let routerArgsBytecode = EVM.encodeABI([univ2FactoryAddress, wflowAddr]) - let univ2RouterAddress = evmDeployRaw(signer, - bytecode: String.encodeHex(uniV2RouterBytecode.decodeHex().concat(routerArgsBytecode)), - gasLimit: UInt64(15_000_000), - value: 0.0 - ) + let univ2RouterAddress = evmDeploy( + signer, + uniV2RouterBytecode, + [univ2FactoryAddress, wflowAddress] + ) return univ2RouterAddress // get the router EVM address from the deployedContract value in the previously emitted event & return @@ -1127,6 +1117,7 @@ fun setupPunchswap(): {String: String} { log("deploy PunchswapV3Factory") let punchswapV3FactoryAddress = evmDeploy( + deployerAccount, punchswapV3FactoryBytecode, [] ) @@ -1134,6 +1125,7 @@ fun setupPunchswap(): {String: String} { log("deploy NFTDescriptor") let nftDescriptorAddress = evmDeploy( + deployerAccount, nftDescriptorBytecode, [] ) @@ -1141,9 +1133,10 @@ fun setupPunchswap(): {String: String} { log("deploy NFTPositionDescriptor") let nftPositionDescriptorAddress = evmDeploy( + deployerAccount, nftPositionDescriptorBytecodeChunks[0] - .concat(nftDescriptorAddress) - .concat(nftPositionDescriptorBytecodeChunks[2]), + .concat(nftDescriptorAddress) + .concat(nftPositionDescriptorBytecodeChunks[2]), [wflowAddress,"WFLOW"] ) log("NFTPositionDescriptor address \(nftPositionDescriptorAddress)") @@ -1151,6 +1144,7 @@ fun setupPunchswap(): {String: String} { log("deploy UniswapV2Factory") let ownerCOA = getCOA(deployerAccount.address)! let univ2FactoryAddress = evmDeploy( + deployerAccount, uniV2FactoryBytecode, [ownerCOA] ) @@ -1158,6 +1152,7 @@ fun setupPunchswap(): {String: String} { log("deploy NonfungiblePositionManager") let npmAddress = evmDeploy( + deployerAccount, npmBytecode, [punchswapV3FactoryAddress, wflowAddress, nftPositionDescriptorAddress] ) @@ -1165,6 +1160,7 @@ fun setupPunchswap(): {String: String} { log("deploy SwapRouter02") let swapRouter02Address = evmDeploy( + deployerAccount, swapRouter02Bytecode, [univ2FactoryAddress, punchswapV3FactoryAddress, npmAddress, wflowAddress] ) @@ -1172,6 +1168,7 @@ fun setupPunchswap(): {String: String} { log("deploy QuoterV2") let quoterV2Address = evmDeploy( + deployerAccount, quoterV2Bytecode, [punchswapV3FactoryAddress, wflowAddress] ) diff --git a/cadence/tests/univ3_connector_test.cdc b/cadence/tests/univ3_connector_test.cdc index 720173b9..906556c6 100644 --- a/cadence/tests/univ3_connector_test.cdc +++ b/cadence/tests/univ3_connector_test.cdc @@ -32,6 +32,7 @@ fun test_Univ3Connector() { log("deploy USDC6") let bridgeCOA = getCOA(bridgeAccount.address)! let usdc6Address = evmDeploy( + deployerAccount, usdc6Bytecode, [bridgeCOA] ) From 1dcbd8714b94c0c5be8995ce1624c81b13e2910b Mon Sep 17 00:00:00 2001 From: Alex <12097569+nialexsan@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:25:50 -0500 Subject: [PATCH 3/7] evm deploy --- cadence/tests/test_helpers.cdc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cadence/tests/test_helpers.cdc b/cadence/tests/test_helpers.cdc index 73ebb6db..c72ccae0 100644 --- a/cadence/tests/test_helpers.cdc +++ b/cadence/tests/test_helpers.cdc @@ -812,12 +812,14 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun erc20DeployerBytecode, [] ) + log(erc20DeployerAddressHex) // Deploy ERC721Deployer let erc721DeployerAddressHex = evmDeploy( bridgeAccount, erc721DeployerBytecode, [] ) + log(erc721DeployerAddressHex) // Assign contract addresses var evts = Test.eventsOfType(Type()) Test.assertEqual(25, evts.length) @@ -828,6 +830,7 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun compiledFactoryBytecode, [] ) + log(factoryAddressHex) // Assign the factory contract address evts = Test.eventsOfType(Type()) Test.assertEqual(26, evts.length) @@ -856,6 +859,8 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun /* Integrate EVM bridge contract */ + log("registryAddressHex") + log(registryAddressHex) // Set factory as registrar in registry let setRegistrarResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/set_registrar.cdc", From 62437625694306ef27338467af924482cb547029 Mon Sep 17 00:00:00 2001 From: Alex <12097569+nialexsan@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:54:24 -0500 Subject: [PATCH 4/7] format --- cadence/tests/test_helpers.cdc | 241 ++++++++++++++++----------------- 1 file changed, 118 insertions(+), 123 deletions(-) diff --git a/cadence/tests/test_helpers.cdc b/cadence/tests/test_helpers.cdc index c72ccae0..d0fef447 100644 --- a/cadence/tests/test_helpers.cdc +++ b/cadence/tests/test_helpers.cdc @@ -210,12 +210,12 @@ access(all) fun deployContracts() { name: "FlowVaultsStrategies", path: "../contracts/FlowVaultsStrategies.cdc", arguments: [ - "0x986Cb42b0557159431d48fE0A40073296414d410", - "0x92657b195e22b69E4779BBD09Fa3CD46F0CF8e39", - "0x8dd92c8d0C3b304255fF9D98ae59c3385F88360C", - "0xaCCF0c4EeD4438Ad31Cd340548f4211a465B6528", - [] as [String], - [] as [UInt32] + "0x986Cb42b0557159431d48fE0A40073296414d410", + "0x92657b195e22b69E4779BBD09Fa3CD46F0CF8e39", + "0x8dd92c8d0C3b304255fF9D98ae59c3385F88360C", + "0xaCCF0c4EeD4438Ad31Cd340548f4211a465B6528", + [] as [String], + [] as [UInt32] ] ) Test.expect(err, Test.beNil()) @@ -234,9 +234,9 @@ access(all) fun deployContracts() { access(all) fun setupFlowALP(signer: Test.TestAccount) { let res = _executeTransaction("../transactions/flow-alp/create_and_store_pool.cdc", - [], - signer -) + [], + signer + ) } /* --- Script helpers */ @@ -279,11 +279,11 @@ fun getAutoBalancerCurrentValue(id: UInt64): UFix64? { access(all) fun getPositionDetails(pid: UInt64, beFailed: Bool): FlowALP.PositionDetails { let res = _executeScript("../scripts/flow-alp/position_details.cdc", - [pid] -) -Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) + [pid] + ) + Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) -return res.returnValue as! FlowALP.PositionDetails + return res.returnValue as! FlowALP.PositionDetails } access(all) @@ -379,10 +379,10 @@ fun mintYield(signer: Test.TestAccount, to: Address, amount: UFix64, beFailed: B access(all) fun addStrategyComposer(signer: Test.TestAccount, strategyIdentifier: String, composerIdentifier: String, issuerStoragePath: StoragePath, beFailed: Bool) { let addRes = _executeTransaction("../transactions/flow-vaults/admin/add_strategy_composer.cdc", - [ strategyIdentifier, composerIdentifier, issuerStoragePath ], - signer -) -Test.expect(addRes, beFailed ? Test.beFailed() : Test.beSucceeded()) + [ strategyIdentifier, composerIdentifier, issuerStoragePath ], + signer + ) + Test.expect(addRes, beFailed ? Test.beFailed() : Test.beSucceeded()) } access(all) @@ -394,10 +394,10 @@ fun createTide( beFailed: Bool ) { let res = _executeTransaction("../transactions/flow-vaults/create_tide.cdc", - [ strategyIdentifier, vaultIdentifier, amount ], - signer -) -Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) + [ strategyIdentifier, vaultIdentifier, amount ], + signer + ) + Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) } access(all) @@ -530,56 +530,56 @@ access(all) let erc721DeployerBytecode = "608060405234801561001057600080fd5b5033 access(all) let compiledFactoryBytecode = "608060405234801561001057600080fd5b50338061003757604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61004081610046565b50610096565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6114b9806100a56000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063aff51c3e11610097578063daa09e5411610066578063daa09e5414610216578063db6d56cd14610229578063dfe1ac361461023c578063f2fde38b1461024f57600080fd5b8063aff51c3e146101bd578063b3d5dbdc146101d0578063cc435bf3146101f0578063d974d2381461020357600080fd5b806366cd5014116100d357806366cd50141461017e578063715018a61461019157806383843c9e146101995780638da5cb5b146101ac57600080fd5b806304433bbc1461010557806314902ad314610135578063263e0c1b1461014a5780635ab1bd531461016d575b600080fd5b610118610113366004611101565b610262565b6040516001600160a01b0390911681526020015b60405180910390f35b610148610143366004611153565b6102da565b005b61015d610158366004611153565b610347565b604051901515815260200161012c565b6001546001600160a01b0316610118565b61011861018c366004611101565b610737565b610148610768565b6101486101a7366004611101565b6107d6565b6000546001600160a01b0316610118565b6101486101cb366004611170565b6108eb565b6101e36101de366004611153565b610a20565b60405161012c9190611212565b61015d6101fe366004611153565b610a93565b610148610211366004611170565b610ab3565b61015d610224366004611153565b610ba0565b610118610237366004611225565b610c16565b61015d61024a366004611153565b610ceb565b61014861025d366004611153565b610d5a565b600154604051630110ceef60e21b81526000916001600160a01b0316906304433bbc90610293908590600401611212565b602060405180830381865afa1580156102b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d4919061131a565b92915050565b6102e2610d98565b6102eb81610dc7565b6001546040516001600160a01b038084169216907f61dad6e94cd5c0b65c9265246706a09bd0d11d5330f3e6b659d328151a664e8c90600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b60408051600481526024810182526020810180516001600160e01b03166318160ddd60e01b1790529051600091829182916001600160a01b0386169161038d9190611337565b600060405180830381855afa9150503d80600081146103c8576040519150601f19603f3d011682016040523d82523d6000602084013e6103cd565b606091505b50915091508115806103de57508051155b156103ed575060009392505050565b604051600060248201526001600160a01b0385169060440160408051601f198184030181529181526020820180516001600160e01b03166370a0823160e01b1790525161043a9190611337565b600060405180830381855afa9150503d8060008114610475576040519150601f19603f3d011682016040523d82523d6000602084013e61047a565b606091505b50909250905081158061048c57508051155b1561049b575060009392505050565b60405160006024820181905260448201526001600160a01b0385169060640160408051601f198184030181529181526020820180516001600160e01b0316636eb1769f60e11b179052516104ef9190611337565b600060405180830381855afa9150503d806000811461052a576040519150601f19603f3d011682016040523d82523d6000602084013e61052f565b606091505b50909250905081158061054157508051155b15610550575060009392505050565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b17905290516001600160a01b0386169161058e91611337565b600060405180830381855afa9150503d80600081146105c9576040519150601f19603f3d011682016040523d82523d6000602084013e6105ce565b606091505b5090925090508115806105e057508051155b156105ef575060009392505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b17905290516001600160a01b0386169161062d91611337565b600060405180830381855afa9150503d8060008114610668576040519150601f19603f3d011682016040523d82523d6000602084013e61066d565b606091505b50909250905081158061067f57508051155b1561068e575060009392505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516001600160a01b038616916106cc91611337565b600060405180830381855afa9150503d8060008114610707576040519150601f19603f3d011682016040523d82523d6000602084013e61070c565b606091505b50909250905081158061071e57508051155b1561072d575060009392505050565b5060019392505050565b60006002826040516107499190611337565b908152604051908190036020019020546001600160a01b031692915050565b610770610d98565b60405162461bcd60e51b815260206004820152603060248201527f466c6f77427269646765466163746f72793a204f776e6572736869702063616e60448201526f1b9bdd081899481c995b9bdd5b98d95960821b60648201526084015b60405180910390fd5b6107de610d98565b60006002826040516107f09190611337565b908152604051908190036020019020546001600160a01b031690508061086b5760405162461bcd60e51b815260206004820152602a60248201527f466c6f77427269646765466163746f72793a204465706c6f796572206e6f74206044820152691c9959da5cdd195c995960b21b60648201526084016107cd565b60028260405161087b9190611337565b90815260405190819003602001812080546001600160a01b03191690556108a3908390611337565b6040519081900381206001600160a01b0383168252907f03c7566b5f4959b890c1a6d38f39df053c6737c9965d9c0ddf612c86100a838b906020015b60405180910390a25050565b6108f3610d98565b6108fc81610e39565b60006001600160a01b03166002836040516109179190611337565b908152604051908190036020019020546001600160a01b0316146109945760405162461bcd60e51b815260206004820152602e60248201527f466c6f77427269646765466163746f72793a204465706c6f79657220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016107cd565b806002836040516109a59190611337565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b0319909316929092179091556109e0908390611337565b6040519081900381206001600160a01b0383168252907fc0c30f085f0b1397c8bf23f8b851b63b33e13d11832b8320a37fca1c07dcb40f906020016108df565b600154604051632cf576f760e21b81526001600160a01b038381166004830152606092169063b3d5dbdc90602401600060405180830381865afa158015610a6b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102d49190810190611353565b6000610a9e82610ba0565b1515610aa983610347565b1515141592915050565b610abb610d98565b610ac481610e39565b6000600283604051610ad69190611337565b908152604051908190036020019020546001600160a01b0316905080610b0557610b0083836108eb565b505050565b81600284604051610b169190611337565b90815260405190819003602001812080546001600160a01b03939093166001600160a01b031990931692909217909155610b51908490611337565b604080519182900382206001600160a01b03808516845285166020840152917f848576f8a081c5af60d89f0215c8af528186670eefd6349c05014d5b22688646910160405180910390a2505050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526000906001600160a01b038316906301ffc9a790602401602060405180830381865afa925050508015610c0a575060408051601f3d908101601f19168201909252610c07918101906113ca565b60015b6102d457506000919050565b6000610c20610d98565b6000600288604051610c329190611337565b908152604051908190036020019020546001600160a01b03169050610c5681610e39565b60405163476d399760e01b815281906000906001600160a01b0383169063476d399790610c8f908c908c908c908c908c906004016113ec565b6020604051808303816000875af1158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd2919061131a565b9050610cde8682610eab565b9998505050505050505050565b60015460405163a6de610560e01b81526001600160a01b038381166004830152600092169063a6de610590602401602060405180830381865afa158015610d36573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d491906113ca565b610d62610d98565b6001600160a01b038116610d8c57604051631e4fbdf760e01b8152600060048201526024016107cd565b610d9581610f16565b50565b6000546001600160a01b03163314610dc55760405163118cdaa760e01b81523360048201526024016107cd565b565b610dd081610f66565b610de18163976998cb60e01b610fbc565b610d955760405162461bcd60e51b815260206004820152602360248201527f466c6f77427269646765466163746f72793a20496e76616c696420726567697360448201526274727960e81b60648201526084016107cd565b610e4281610f66565b610e538163476d399760e01b610fbc565b610d955760405162461bcd60e51b815260206004820152602360248201527f466c6f77427269646765466163746f72793a20496e76616c6964206465706c6f6044820152623cb2b960e91b60648201526084016107cd565b60015460405163522791d160e01b81526001600160a01b0390911690819063522791d190610edf9086908690600401611459565b600060405180830381600087803b158015610ef957600080fd5b505af1158015610f0d573d6000803e3d6000fd5b50505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116610d955760405162461bcd60e51b815260206004820152601f60248201527f466c6f77427269646765466163746f72793a205a65726f20616464726573730060448201526064016107cd565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a790602401602060405180830381865afa925050508015611029575060408051601f3d908101601f19168201909252611026918101906113ca565b60015b611035575060006102d4565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561107b5761107b61103c565b604052919050565b600067ffffffffffffffff82111561109d5761109d61103c565b50601f01601f191660200190565b600082601f8301126110bc57600080fd5b81356110cf6110ca82611083565b611052565b8181528460208386010111156110e457600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561111357600080fd5b813567ffffffffffffffff81111561112a57600080fd5b611136848285016110ab565b949350505050565b6001600160a01b0381168114610d9557600080fd5b60006020828403121561116557600080fd5b81356110358161113e565b6000806040838503121561118357600080fd5b823567ffffffffffffffff81111561119a57600080fd5b6111a6858286016110ab565b92505060208301356111b78161113e565b809150509250929050565b60005b838110156111dd5781810151838201526020016111c5565b50506000910152565b600081518084526111fe8160208601602086016111c2565b601f01601f19169290920160200192915050565b60208152600061103560208301846111e6565b60008060008060008060c0878903121561123e57600080fd5b863567ffffffffffffffff8082111561125657600080fd5b6112628a838b016110ab565b9750602089013591508082111561127857600080fd5b6112848a838b016110ab565b9650604089013591508082111561129a57600080fd5b6112a68a838b016110ab565b955060608901359150808211156112bc57600080fd5b6112c88a838b016110ab565b945060808901359150808211156112de57600080fd5b6112ea8a838b016110ab565b935060a089013591508082111561130057600080fd5b5061130d89828a016110ab565b9150509295509295509295565b60006020828403121561132c57600080fd5b81516110358161113e565b600082516113498184602087016111c2565b9190910192915050565b60006020828403121561136557600080fd5b815167ffffffffffffffff81111561137c57600080fd5b8201601f8101841361138d57600080fd5b805161139b6110ca82611083565b8181528560208385010111156113b057600080fd5b6113c18260208301602086016111c2565b95945050505050565b6000602082840312156113dc57600080fd5b8151801515811461103557600080fd5b60a0815260006113ff60a08301886111e6565b828103602084015261141181886111e6565b9050828103604084015261142581876111e6565b9050828103606084015261143981866111e6565b9050828103608084015261144d81856111e6565b98975050505050505050565b60408152600061146c60408301856111e6565b905060018060a01b0383166020830152939250505056fea26469706673582212200af9d80b662861a856536a56fb3a4afaa201b1b9be2839aa487140e647786f8f64736f6c63430008180033" access(all) let bridgedNFTCodeChunks = [ -"696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d4272696467654e46544d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467654e4654457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d4e46542066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e6174697665204e46547320627269646765642066726f6d20466c6f772045564d20746f20466c6f772e0a2f2f2f2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e2045524337323120616b610a2f2f2f20616e204e46542920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c2074686520455243373231206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e642061206e6577204e4654206973206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206c6f636b65640a2f2f2f20696e204e465420657363726f7720616e642074686520455243373231206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e636520746f6b656e206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d204e465420616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", -"203a204943726f7373564d2c204943726f7373564d41737365742c204945564d4272696467654e46544d696e7465722c204e6f6e46756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d4e4654436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f2052657461696e206120436f6c6c656374696f6e20746f207265666572656e6365207768656e207265736f6c76696e6720436f6c6c656374696f6e204d657461646174610a202020206163636573732873656c6629206c657420636f6c6c656374696f6e3a2040436f6c6c656374696f6e0a202020202f2f2f204d617070696e67206f6620746f6b656e205552497320696e6465786564206f6e207468656972204552433732312049442e205468697320776f756c64206e6f74206e6f726d616c6c792062652072657461696e65642077697468696e206120436164656e6365204e46540a202020202f2f2f20636f6e74726163742c206275742073696e6365204e4654206d65746164617461206d6179206265207570646174656420696e2045564d2c20697427732072657461696e6564206865726520736f207468617420746865206272696467652063616e207570646174650a202020202f2f2f20697420616761696e73742074686520736f757263652045524337323120636f6e7472616374207768696368206973207472656174656420617320746865204e4654277320736f75726365206f662074727574682e0a2020202061636365737328616c6c29206c657420746f6b656e555249733a207b55496e743235363a20537472696e677d0a0a202020202f2f2f20546865204e4654207265736f7572636520726570726573656e74696e672074686520627269646765642045524337323120746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365204e4654203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d4e46542e45564d4e4654207b0a20202020202020202f2f2f2054686520436164656e6365204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742069643a2055496e7436340a20202020202020202f2f2f2054686520455243373231204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742065766d49443a2055496e743235360a20202020202020202f2f2f204164646974696f6e616c206f6e636861696e206d657461646174610a202020202020202061636365737328616c6c29206c6574206d657461646174613a207b537472696e673a20416e795374727563747d0a0a2020202020202020696e6974280a20202020202020202020202065766d49443a2055496e743235362c0a2020202020202020202020206d657461646174613a207b537472696e673a20416e795374727563747d0a202020202020202029207b0a20202020202020202020202073656c662e6964203d2073656c662e757569640a20202020202020202020202073656c662e65766d4944203d2065766d49440a20202020202020202020202073656c662e6d65746164617461203d206d657461646174610a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320746865206d65746164617461207669657720747970657320737570706f727465642062792074686973204e46540a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e205b0a20202020202020202020202020202020547970653c4d6574616461746156696577732e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e53657269616c3e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a2020202020202020202020205d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", -"2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", -"2e73796d626f6c0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20746f6b656e55524928293a20537472696e67207b0a20202020202020202020202072657475726e20", -"2e746f6b656e555249735b73656c662e65766d49445d203f3f2022220a20202020202020207d0a0a20202020202020202f2f2f205265736f6c7665732061206d65746164617461207669657720666f722074686973204e46540a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a2020202020202020202020207377697463682076696577207b0a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e446973706c61793e28293a0a20202020202020202020202020202020202020206c657420636f6e7472616374526566203d20", -"2e626f72726f7754686973436f6e747261637428290a202020202020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c4d6574616461746156696577732e446973706c61793e2829290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e53657269616c3e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e53657269616c280a20202020202020202020202020202020202020202020202073656c662e69640a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020202020202072657475726e20", -"2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020202020202072657475726e20", -"2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a2020202020202020202020202020202020202020202020206e616d653a2073656c662e6765744e616d6528292c0a20202020202020202020202020202020202020202020202073796d626f6c3a2073656c662e67657453796d626f6c28292c0a2020202020202020202020202020202020202020202020207572693a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e746f6b656e5552492829290a2020202020202020202020202020202020202020290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f207075626c69632066756e6374696f6e207468617420616e796f6e652063616e2063616c6c20746f206372656174652061206e657720656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202072657475726e203c2d20", -"2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a2073656c662e676574547970652829290a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d4e465420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e46540a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", -"2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a202020207d0a0a202020202f2f2f2054686973207265736f7572636520686f6c6473206173736f636961746564204e4654732c20616e642073657276657320717565726965732061626f75742073746f726564204e4654730a2020202061636365737328616c6c29207265736f7572636520436f6c6c656374696f6e203a2043726f7373564d4e46542e45564d4e4654436f6c6c656374696f6e207b0a20202020202020202f2f2f2064696374696f6e617279206f66204e465420636f6e666f726d696e6720746f6b656e7320696e6465786564206f6e2074686569722049440a202020202020202061636365737328616c6c2920766172206f776e65644e4654733a20407b55496e7436343a207b4e6f6e46756e6769626c65546f6b656e2e4e46547d7d0a20202020202020202f2f2f204d617070696e67206f662045564d2049447320746f20466c6f77204e4654204944730a202020202020202061636365737328636f6e747261637429206c65742065766d4944546f466c6f7749443a207b55496e743235363a2055496e7436347d0a0a202020202020202061636365737328616c6c29207661722073746f72616765506174683a2053746f72616765506174680a202020202020202061636365737328616c6c2920766172207075626c6963506174683a205075626c6963506174680a0a2020202020202020696e6974202829207b0a20202020202020202020202073656c662e6f776e65644e465473203c2d207b7d0a20202020202020202020202073656c662e65766d4944546f466c6f774944203d207b7d0a2020202020202020202020206c657420636f6c6c656374696f6e44617461203d20", -"2e7265736f6c7665436f6e747261637456696577280a20202020202020202020202020202020202020207265736f75726365547970653a20547970653c40", -"2e4e46543e28292c0a202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a202020202020202020202020202020202920617321204d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613f0a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f74207265736f6c76652074686520636f6c6c656374696f6e2064617461207669657720666f7220746865204e465420636f6c6c656374696f6e22290a20202020202020202020202073656c662e73746f7261676550617468203d20636f6c6c656374696f6e446174612e73746f72616765506174680a20202020202020202020202073656c662e7075626c696350617468203d20636f6c6c656374696f6e446174612e7075626c6963506174680a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", -"2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", -"2e73796d626f6c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732061206c697374206f66204e46542074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465644e4654547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b20547970653c40", -"2e4e46543e28293a2074727565207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732077686574686572206f72206e6f742074686520676976656e20747970652069732061636365707465642062792074686520636f6c6c656374696f6e0a20202020202020202f2f2f204120636f6c6c656374696f6e20746861742063616e2061636365707420616e7920747970652073686f756c64206a7573742072657475726e20747275652062792064656661756c740a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465644e46545479706528747970653a2054797065293a20426f6f6c207b0a202020202020202020202072657475726e2074797065203d3d20547970653c40", -"2e4e46543e28290a20202020202020207d0a0a20202020202020202f2f2f2052656d6f76657320616e204e46542066726f6d2074686520636f6c6c656374696f6e20616e64206d6f76657320697420746f207468652063616c6c65720a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728776974686472617749443a2055496e743634293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a2020202020202020202020206c657420746f6b656e203c2d2073656c662e6f776e65644e4654732e72656d6f7665286b65793a2077697468647261774944290a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642049442066726f6d2074686520636f6c6c656374696f6e22290a0a20202020202020202020202072657475726e203c2d746f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2057697468647261777320616e204e46542066726f6d2074686520636f6c6c656374696f6e206279206974732045564d2049440a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e207769746864726177427945564d4944285f2069643a2055496e74323536293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a20202020202020202020202072657475726e203c2d2073656c662e776974686472617728776974686472617749443a200a2020202020202020202020202020202073656c662e676574436164656e636549442866726f6d3a20696429203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642045564d2049442066726f6d2074686520636f6c6c656374696f6e22290a202020202020202020202020290a20202020202020207d0a0a20202020202020202f2f2f205474616b65732061204e465420616e64206164647320697420746f2074686520636f6c6c656374696f6e732064696374696f6e61727920616e6420616464732074686520494420746f207468652065766d4944546f466c6f774944206d617070696e670a202020202020202061636365737328616c6c292066756e206465706f73697428746f6b656e3a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d29207b0a2020202020202020202020206c657420746f6b656e203c2d20746f6b656e206173212040", -"2e4e46540a0a2020202020202020202020202f2f2061646420746865206e657720746f6b656e20746f207468652064696374696f6e6172792077686963682072656d6f76657320746865206f6c64206f6e650a20202020202020202020202073656c662e65766d4944546f466c6f7749445b746f6b656e2e65766d49445d203d20746f6b656e2e69640a2020202020202020202020206c6574206f6c64546f6b656e203c2d2073656c662e6f776e65644e4654735b746f6b656e2e69645d203c2d20746f6b656e0a0a20202020202020202020202064657374726f79206f6c64546f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657449447328293a205b55496e7436345d207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652045564d2049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49447328293a205b55496e743235365d207b0a20202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749442e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520436164656e6365204e46542e696420666f722074686520676976656e2045564d204e46542049442069662069742065786973747320696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e20676574436164656e636549442866726f6d2065766d49443a2055496e74323536293a2055496e7436343f207b0a20202020202020202020202069662073656c662e65766d4944546f466c6f7749445b65766d49445d20213d206e696c207b0a2020202020202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749445b65766d49445d0a2020202020202020202020207d20656c73652069662065766d4944203c2055496e743235362855496e7436342e6d6178292026262073656c662e626f72726f774e46542855496e7436342865766d4944292920213d206e696c207b0a2020202020202020202020202020202072657475726e2055496e7436342865766d4944290a2020202020202020202020207d20656c7365207b0a2020202020202020202020202020202072657475726e206e696c0a2020202020202020202020207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e73207468652045564d204e4654204944206173736f63696174656420776974682074686520436164656e6365204e46542049442e2054686520676f616c20697320746f20726574726965766520746865204552433732312049442076616c75652e0a20202020202020202f2f2f20417320666172206173207468652062726964676520697320636f6e6365726e65642c20616e2045524337323120646566696e6564206279207468652062726964676520697320746865204e46542773204944206174207468652074696d65206f66206272696467696e670a20202020202020202f2f2f206f72207468652076616c7565206f6620746865204e46542e65766d494420696620697420696d706c656d656e7473207468652043726f7373564d4e46542e45564d4e465420696e74657266616365207768656e20627269646765642e0a20202020202020202f2f2f20466f6c6c6f77696e672074686973207061747465726e2c206966206c6f636b65642c20746865204e465420697320636865636b656420666f722045564d4e465420636f6e666f726d616e63652072657475726e696e67202e65766d494420696620736f2c0a20202020202020202f2f2f206f746865727769736520746865204e465427732049442069732072657475726e656420617320612055496e743235362073696e63652074686174277320686f77207468652062726964676520776f756c642068616e646c65206d696e74696e6720696e207468650a20202020202020202f2f2f20636f72726573706f6e64696e672045524337323120636f6e74726163742e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49442866726f6d20636164656e636549443a2055496e743634293a2055496e743235363f207b0a2020202020202020202020206966206c6574206e6674203d2073656c662e626f72726f774e465428636164656e6365494429207b0a202020202020202020202020202020206966206c65742065766d4e4654203d2043726f7373564d4e46542e67657445564d49442866726f6d3a206e667429207b0a202020202020202020202020202020202020202072657475726e2065766d4e46540a202020202020202020202020202020207d0a2020202020202020202020202020202072657475726e2055496e74323536286e66742e6964290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520636f6e747261637455524920666f7220746865204e465420636f6c6c656374696f6e20617320646566696e656420696e2074686520736f757263652045524337323120636f6e74726163742e204966206e6f6e65207761730a20202020202020202f2f2f20646566696e6564206174207468652074696d65206f66206272696467696e672c20616e20656d70747920737472696e672069732072657475726e65642e0a202020202020202061636365737328616c6c2920766965772066756e20636f6e747261637455524928293a20537472696e673f207b0a20202020202020202020202072657475726e20", -"2e636f6e74726163745552490a20202020202020207d0a0a20202020202020202f2f2f20476574732074686520616d6f756e74206f66204e4654732073746f72656420696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e206765744c656e67746828293a20496e74207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579732e6c656e6774680a20202020202020207d0a0a20202020202020202f2f2f205265747269657665732061207265666572656e636520746f20746865204e46542073746f72656420696e2074686520636f6c6c656374696f6e206279206974732049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f774e4654285f2069643a2055496e743634293a20267b4e6f6e46756e6769626c65546f6b656e2e4e46547d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d0a20202020202020207d0a0a20202020202020202f2f2f20426f72726f77207468652076696577207265736f6c76657220666f722074686520737065636966696564204e46542049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f77566965775265736f6c7665722869643a2055496e743634293a20267b566965775265736f6c7665722e5265736f6c7665727d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d20617320267b566965775265736f6c7665722e5265736f6c7665727d3f203f3f206e696c0a20202020202020207d0a0a20202020202020202f2f2f204372656174657320616e20656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d20207b0a20202020202020202020202072657475726e203c2d", -"2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", -"2e4e46543e2829290a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d707479436f6c6c656374696f6e206372656174657320616e20656d70747920436f6c6c656374696f6e20666f722074686520737065636966696564204e465420747970650a202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c657220736f207468617420746865792063616e206f776e204e4654730a2020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e286e6674547970653a2054797065293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a202020202020202072657475726e203c2d2063726561746520436f6c6c656374696f6e28290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e4654207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d4e4654436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e7465642062792061204e6f6e2046756e6769626c6520546f6b656e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c20626520757365642062790a202020202f2f2f202020202020202020646576656c6f7065727320746f206b6e6f7720776869636820706172616d6574657220746f207061737320746f20746865207265736f6c7665566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020206c6574206964656e746966696572203d2022", -"436f6c6c656374696f6e220a202020202020202020202020202020206c657420636f6c6c656374696f6e44617461203d204d6574616461746156696577732e4e4654436f6c6c656374696f6e44617461280a202020202020202020202020202020202020202073746f72616765506174683a2053746f7261676550617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963506174683a205075626c696350617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963436f6c6c656374696f6e3a20547970653c26", -"2e436f6c6c656374696f6e3e28292c0a20202020202020202020202020202020202020207075626c69634c696e6b6564547970653a20547970653c26", -"2e436f6c6c656374696f6e3e28292c0a2020202020202020202020202020202020202020637265617465456d707479436f6c6c656374696f6e46756e6374696f6e3a202866756e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d", -"2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", -"2e4e46543e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020202020202072657475726e20636f6c6c656374696f6e446174610a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020206c65742073656c66526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a2073656c665265662c20766965773a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e2829290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e74204e4654732066726f6d206272696467652d646566696e6564204e465420636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e206d696e744e46542869643a2055496e743235362c20746f6b656e5552493a20537472696e67293a20404e4654207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b69645d203d3d206e696c3a20224120746f6b656e20776974682074686520676976656e2045524337323120494420616c726561647920657869737473220a20202020202020207d0a202020202020202073656c662e746f6b656e555249735b69645d203d20746f6b656e5552490a202020202020202072657475726e203c2d637265617465204e4654280a20202020202020202020202065766d49443a2069642c0a2020202020202020202020206d657461646174613a207b0a20202020202020202020202020202020224272696467656420426c6f636b223a2067657443757272656e74426c6f636b28292e6865696768742c0a2020202020202020202020202020202022427269646765642054696d657374616d70223a2067657443757272656e74426c6f636b28292e74696d657374616d700a2020202020202020202020207d0a2020202020202020290a202020207d0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f207570646174652074686520555249206f662062726964676564204e4654732e205468697320617373756d65732074686174207468652045564d2d646566696e696e672070726f6a656374206d617920636f6e7461696e0a202020202f2f2f206c6f67696320286f6e636861696e206f72206f6666636861696e292077686963682075706461746573204e4654206d6574616461746120696e2074686520736f757263652045524337323120636f6e74726163742e204f6e206272696467696e672c20746865205552492063616e0a202020202f2f2f207468656e206265207570646174656420696e207468697320636f6e747261637420746f207265666c6563742074686520736f757263652045524337323120636f6e74726163742773206d657461646174612e0a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e20757064617465546f6b656e5552492865766d49443a2055496e743235362c206e65775552493a20537472696e6729207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d20213d206e696c3a20224e6f20746f6b656e20776974682074686520676976656e2045524337323120494420657869737473220a20202020202020207d0a202020202020202069662073656c662e746f6b656e555249735b65766d49445d20213d206e6577555249207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d203d206e65775552490a20202020202020207d0a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", -"2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d4e4654436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f6b656e55524973203d207b7d0a202020202020202073656c662e636f6c6c656374696f6e203c2d2063726561746520436f6c6c656374696f6e28290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", -"2e4e46543e28292c20776974683a2073656c662e65766d4e4654436f6e747261637441646472657373290a2020202020202020466c6f7745564d4272696467654e4654457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020666f72547970653a20547970653c40", -"2e4e46543e28292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020657263373231416464726573733a2073656c662e65766d4e4654436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" + "696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d4272696467654e46544d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467654e4654457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d4e46542066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e6174697665204e46547320627269646765642066726f6d20466c6f772045564d20746f20466c6f772e0a2f2f2f2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e2045524337323120616b610a2f2f2f20616e204e46542920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c2074686520455243373231206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e642061206e6577204e4654206973206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206c6f636b65640a2f2f2f20696e204e465420657363726f7720616e642074686520455243373231206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e636520746f6b656e206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d204e465420616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", + "203a204943726f7373564d2c204943726f7373564d41737365742c204945564d4272696467654e46544d696e7465722c204e6f6e46756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d4e4654436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f6620746865204e465420636f6c6c656374696f6e20646566696e656420696e2074686520636f72726573706f6e64696e672045524337323120636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f2052657461696e206120436f6c6c656374696f6e20746f207265666572656e6365207768656e207265736f6c76696e6720436f6c6c656374696f6e204d657461646174610a202020206163636573732873656c6629206c657420636f6c6c656374696f6e3a2040436f6c6c656374696f6e0a202020202f2f2f204d617070696e67206f6620746f6b656e205552497320696e6465786564206f6e207468656972204552433732312049442e205468697320776f756c64206e6f74206e6f726d616c6c792062652072657461696e65642077697468696e206120436164656e6365204e46540a202020202f2f2f20636f6e74726163742c206275742073696e6365204e4654206d65746164617461206d6179206265207570646174656420696e2045564d2c20697427732072657461696e6564206865726520736f207468617420746865206272696467652063616e207570646174650a202020202f2f2f20697420616761696e73742074686520736f757263652045524337323120636f6e7472616374207768696368206973207472656174656420617320746865204e4654277320736f75726365206f662074727574682e0a2020202061636365737328616c6c29206c657420746f6b656e555249733a207b55496e743235363a20537472696e677d0a0a202020202f2f2f20546865204e4654207265736f7572636520726570726573656e74696e672074686520627269646765642045524337323120746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365204e4654203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d4e46542e45564d4e4654207b0a20202020202020202f2f2f2054686520436164656e6365204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742069643a2055496e7436340a20202020202020202f2f2f2054686520455243373231204944206f6620746865204e46540a202020202020202061636365737328616c6c29206c65742065766d49443a2055496e743235360a20202020202020202f2f2f204164646974696f6e616c206f6e636861696e206d657461646174610a202020202020202061636365737328616c6c29206c6574206d657461646174613a207b537472696e673a20416e795374727563747d0a0a2020202020202020696e6974280a20202020202020202020202065766d49443a2055496e743235362c0a2020202020202020202020206d657461646174613a207b537472696e673a20416e795374727563747d0a202020202020202029207b0a20202020202020202020202073656c662e6964203d2073656c662e757569640a20202020202020202020202073656c662e65766d4944203d2065766d49440a20202020202020202020202073656c662e6d65746164617461203d206d657461646174610a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320746865206d65746164617461207669657720747970657320737570706f727465642062792074686973204e46540a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e205b0a20202020202020202020202020202020547970653c4d6574616461746156696577732e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e53657269616c3e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a20202020202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a2020202020202020202020205d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", + "2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", + "2e73796d626f6c0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20746f6b656e55524928293a20537472696e67207b0a20202020202020202020202072657475726e20", + "2e746f6b656e555249735b73656c662e65766d49445d203f3f2022220a20202020202020207d0a0a20202020202020202f2f2f205265736f6c7665732061206d65746164617461207669657720666f722074686973204e46540a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a2020202020202020202020207377697463682076696577207b0a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e446973706c61793e28293a0a20202020202020202020202020202020202020206c657420636f6e7472616374526566203d20", + "2e626f72726f7754686973436f6e747261637428290a202020202020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c4d6574616461746156696577732e446973706c61793e2829290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e53657269616c3e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e53657269616c280a20202020202020202020202020202020202020202020202073656c662e69640a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020202020202072657475726e20", + "2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020202020202072657475726e20", + "2e7265736f6c7665436f6e747261637456696577280a2020202020202020202020202020202020202020202020207265736f75726365547970653a2073656c662e6765745479706528292c0a20202020202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28290a2020202020202020202020202020202020202020290a202020202020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a202020202020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a2020202020202020202020202020202020202020202020206e616d653a2073656c662e6765744e616d6528292c0a20202020202020202020202020202020202020202020202073796d626f6c3a2073656c662e67657453796d626f6c28292c0a2020202020202020202020202020202020202020202020207572693a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e746f6b656e5552492829290a2020202020202020202020202020202020202020290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f207075626c69632066756e6374696f6e207468617420616e796f6e652063616e2063616c6c20746f206372656174652061206e657720656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202072657475726e203c2d20", + "2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a2073656c662e676574547970652829290a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d4e465420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e46540a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", + "2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a202020207d0a0a202020202f2f2f2054686973207265736f7572636520686f6c6473206173736f636961746564204e4654732c20616e642073657276657320717565726965732061626f75742073746f726564204e4654730a2020202061636365737328616c6c29207265736f7572636520436f6c6c656374696f6e203a2043726f7373564d4e46542e45564d4e4654436f6c6c656374696f6e207b0a20202020202020202f2f2f2064696374696f6e617279206f66204e465420636f6e666f726d696e6720746f6b656e7320696e6465786564206f6e2074686569722049440a202020202020202061636365737328616c6c2920766172206f776e65644e4654733a20407b55496e7436343a207b4e6f6e46756e6769626c65546f6b656e2e4e46547d7d0a20202020202020202f2f2f204d617070696e67206f662045564d2049447320746f20466c6f77204e4654204944730a202020202020202061636365737328636f6e747261637429206c65742065766d4944546f466c6f7749443a207b55496e743235363a2055496e7436347d0a0a202020202020202061636365737328616c6c29207661722073746f72616765506174683a2053746f72616765506174680a202020202020202061636365737328616c6c2920766172207075626c6963506174683a205075626c6963506174680a0a2020202020202020696e6974202829207b0a20202020202020202020202073656c662e6f776e65644e465473203c2d207b7d0a20202020202020202020202073656c662e65766d4944546f466c6f774944203d207b7d0a2020202020202020202020206c657420636f6c6c656374696f6e44617461203d20", + "2e7265736f6c7665436f6e747261637456696577280a20202020202020202020202020202020202020207265736f75726365547970653a20547970653c40", + "2e4e46543e28292c0a202020202020202020202020202020202020202076696577547970653a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28290a202020202020202020202020202020202920617321204d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613f0a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f74207265736f6c76652074686520636f6c6c656374696f6e2064617461207669657720666f7220746865204e465420636f6c6c656374696f6e22290a20202020202020202020202073656c662e73746f7261676550617468203d20636f6c6c656374696f6e446174612e73746f72616765506174680a20202020202020202020202073656c662e7075626c696350617468203d20636f6c6c656374696f6e446174612e7075626c6963506174680a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", + "2e6e616d650a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", + "2e73796d626f6c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732061206c697374206f66204e46542074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465644e4654547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b20547970653c40", + "2e4e46543e28293a2074727565207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732077686574686572206f72206e6f742074686520676976656e20747970652069732061636365707465642062792074686520636f6c6c656374696f6e0a20202020202020202f2f2f204120636f6c6c656374696f6e20746861742063616e2061636365707420616e7920747970652073686f756c64206a7573742072657475726e20747275652062792064656661756c740a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465644e46545479706528747970653a2054797065293a20426f6f6c207b0a202020202020202020202072657475726e2074797065203d3d20547970653c40", + "2e4e46543e28290a20202020202020207d0a0a20202020202020202f2f2f2052656d6f76657320616e204e46542066726f6d2074686520636f6c6c656374696f6e20616e64206d6f76657320697420746f207468652063616c6c65720a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728776974686472617749443a2055496e743634293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a2020202020202020202020206c657420746f6b656e203c2d2073656c662e6f776e65644e4654732e72656d6f7665286b65793a2077697468647261774944290a202020202020202020202020202020203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642049442066726f6d2074686520636f6c6c656374696f6e22290a0a20202020202020202020202072657475726e203c2d746f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2057697468647261777320616e204e46542066726f6d2074686520636f6c6c656374696f6e206279206974732045564d2049440a2020202020202020616363657373284e6f6e46756e6769626c65546f6b656e2e5769746864726177292066756e207769746864726177427945564d4944285f2069643a2055496e74323536293a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d207b0a20202020202020202020202072657475726e203c2d2073656c662e776974686472617728776974686472617749443a200a2020202020202020202020202020202073656c662e676574436164656e636549442866726f6d3a20696429203f3f2070616e69632822436f756c64206e6f7420776974686472617720616e204e46542077697468207468652070726f76696465642045564d2049442066726f6d2074686520636f6c6c656374696f6e22290a202020202020202020202020290a20202020202020207d0a0a20202020202020202f2f2f205474616b65732061204e465420616e64206164647320697420746f2074686520636f6c6c656374696f6e732064696374696f6e61727920616e6420616464732074686520494420746f207468652065766d4944546f466c6f774944206d617070696e670a202020202020202061636365737328616c6c292066756e206465706f73697428746f6b656e3a20407b4e6f6e46756e6769626c65546f6b656e2e4e46547d29207b0a2020202020202020202020206c657420746f6b656e203c2d20746f6b656e206173212040", + "2e4e46540a0a2020202020202020202020202f2f2061646420746865206e657720746f6b656e20746f207468652064696374696f6e6172792077686963682072656d6f76657320746865206f6c64206f6e650a20202020202020202020202073656c662e65766d4944546f466c6f7749445b746f6b656e2e65766d49445d203d20746f6b656e2e69640a2020202020202020202020206c6574206f6c64546f6b656e203c2d2073656c662e6f776e65644e4654735b746f6b656e2e69645d203c2d20746f6b656e0a0a20202020202020202020202064657374726f79206f6c64546f6b656e0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657449447328293a205b55496e7436345d207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e7320616e206172726179206f66207468652045564d2049447320746861742061726520696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49447328293a205b55496e743235365d207b0a20202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749442e6b6579730a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520436164656e6365204e46542e696420666f722074686520676976656e2045564d204e46542049442069662069742065786973747320696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e20676574436164656e636549442866726f6d2065766d49443a2055496e74323536293a2055496e7436343f207b0a20202020202020202020202069662073656c662e65766d4944546f466c6f7749445b65766d49445d20213d206e696c207b0a2020202020202020202020202020202072657475726e2073656c662e65766d4944546f466c6f7749445b65766d49445d0a2020202020202020202020207d20656c73652069662065766d4944203c2055496e743235362855496e7436342e6d6178292026262073656c662e626f72726f774e46542855496e7436342865766d4944292920213d206e696c207b0a2020202020202020202020202020202072657475726e2055496e7436342865766d4944290a2020202020202020202020207d20656c7365207b0a2020202020202020202020202020202072657475726e206e696c0a2020202020202020202020207d0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e73207468652045564d204e4654204944206173736f63696174656420776974682074686520436164656e6365204e46542049442e2054686520676f616c20697320746f20726574726965766520746865204552433732312049442076616c75652e0a20202020202020202f2f2f20417320666172206173207468652062726964676520697320636f6e6365726e65642c20616e2045524337323120646566696e6564206279207468652062726964676520697320746865204e46542773204944206174207468652074696d65206f66206272696467696e670a20202020202020202f2f2f206f72207468652076616c7565206f6620746865204e46542e65766d494420696620697420696d706c656d656e7473207468652043726f7373564d4e46542e45564d4e465420696e74657266616365207768656e20627269646765642e0a20202020202020202f2f2f20466f6c6c6f77696e672074686973207061747465726e2c206966206c6f636b65642c20746865204e465420697320636865636b656420666f722045564d4e465420636f6e666f726d616e63652072657475726e696e67202e65766d494420696620736f2c0a20202020202020202f2f2f206f746865727769736520746865204e465427732049442069732072657475726e656420617320612055496e743235362073696e63652074686174277320686f77207468652062726964676520776f756c642068616e646c65206d696e74696e6720696e207468650a20202020202020202f2f2f20636f72726573706f6e64696e672045524337323120636f6e74726163742e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d49442866726f6d20636164656e636549443a2055496e743634293a2055496e743235363f207b0a2020202020202020202020206966206c6574206e6674203d2073656c662e626f72726f774e465428636164656e6365494429207b0a202020202020202020202020202020206966206c65742065766d4e4654203d2043726f7373564d4e46542e67657445564d49442866726f6d3a206e667429207b0a202020202020202020202020202020202020202072657475726e2065766d4e46540a202020202020202020202020202020207d0a2020202020202020202020202020202072657475726e2055496e74323536286e66742e6964290a2020202020202020202020207d0a20202020202020202020202072657475726e206e696c0a20202020202020207d0a0a20202020202020202f2f2f2052657475726e732074686520636f6e747261637455524920666f7220746865204e465420636f6c6c656374696f6e20617320646566696e656420696e2074686520736f757263652045524337323120636f6e74726163742e204966206e6f6e65207761730a20202020202020202f2f2f20646566696e6564206174207468652074696d65206f66206272696467696e672c20616e20656d70747920737472696e672069732072657475726e65642e0a202020202020202061636365737328616c6c2920766965772066756e20636f6e747261637455524928293a20537472696e673f207b0a20202020202020202020202072657475726e20", + "2e636f6e74726163745552490a20202020202020207d0a0a20202020202020202f2f2f20476574732074686520616d6f756e74206f66204e4654732073746f72656420696e2074686520636f6c6c656374696f6e0a202020202020202061636365737328616c6c2920766965772066756e206765744c656e67746828293a20496e74207b0a20202020202020202020202072657475726e2073656c662e6f776e65644e4654732e6b6579732e6c656e6774680a20202020202020207d0a0a20202020202020202f2f2f205265747269657665732061207265666572656e636520746f20746865204e46542073746f72656420696e2074686520636f6c6c656374696f6e206279206974732049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f774e4654285f2069643a2055496e743634293a20267b4e6f6e46756e6769626c65546f6b656e2e4e46547d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d0a20202020202020207d0a0a20202020202020202f2f2f20426f72726f77207468652076696577207265736f6c76657220666f722074686520737065636966696564204e46542049440a202020202020202061636365737328616c6c2920766965772066756e20626f72726f77566965775265736f6c7665722869643a2055496e743634293a20267b566965775265736f6c7665722e5265736f6c7665727d3f207b0a20202020202020202020202072657475726e202673656c662e6f776e65644e4654735b69645d20617320267b566965775265736f6c7665722e5265736f6c7665727d3f203f3f206e696c0a20202020202020207d0a0a20202020202020202f2f2f204372656174657320616e20656d70747920636f6c6c656374696f6e0a202020202020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d20207b0a20202020202020202020202072657475726e203c2d", + "2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", + "2e4e46543e2829290a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d707479436f6c6c656374696f6e206372656174657320616e20656d70747920436f6c6c656374696f6e20666f722074686520737065636966696564204e465420747970650a202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c657220736f207468617420746865792063616e206f776e204e4654730a2020202061636365737328616c6c292066756e20637265617465456d707479436f6c6c656374696f6e286e6674547970653a2054797065293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a202020202020202072657475726e203c2d2063726561746520436f6c6c656374696f6e28290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f6620746865204e4654207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d4e4654436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e7465642062792061204e6f6e2046756e6769626c6520546f6b656e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c20626520757365642062790a202020202f2f2f202020202020202020646576656c6f7065727320746f206b6e6f7720776869636820706172616d6574657220746f207061737320746f20746865207265736f6c7665566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446174613e28293a0a202020202020202020202020202020206c6574206964656e746966696572203d2022", + "436f6c6c656374696f6e220a202020202020202020202020202020206c657420636f6c6c656374696f6e44617461203d204d6574616461746156696577732e4e4654436f6c6c656374696f6e44617461280a202020202020202020202020202020202020202073746f72616765506174683a2053746f7261676550617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963506174683a205075626c696350617468286964656e7469666965723a206964656e74696669657229212c0a20202020202020202020202020202020202020207075626c6963436f6c6c656374696f6e3a20547970653c26", + "2e436f6c6c656374696f6e3e28292c0a20202020202020202020202020202020202020207075626c69634c696e6b6564547970653a20547970653c26", + "2e436f6c6c656374696f6e3e28292c0a2020202020202020202020202020202020202020637265617465456d707479436f6c6c656374696f6e46756e6374696f6e3a202866756e28293a20407b4e6f6e46756e6769626c65546f6b656e2e436f6c6c656374696f6e7d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d", + "2e637265617465456d707479436f6c6c656374696f6e286e6674547970653a20547970653c40", + "2e4e46543e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020202020202072657475726e20636f6c6c656374696f6e446174610a2020202020202020202020206361736520547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e28293a0a202020202020202020202020202020206c65742073656c66526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a2073656c665265662c20766965773a20547970653c4d6574616461746156696577732e4e4654436f6c6c656374696f6e446973706c61793e2829290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e74204e4654732066726f6d206272696467652d646566696e6564204e465420636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e206d696e744e46542869643a2055496e743235362c20746f6b656e5552493a20537472696e67293a20404e4654207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b69645d203d3d206e696c3a20224120746f6b656e20776974682074686520676976656e2045524337323120494420616c726561647920657869737473220a20202020202020207d0a202020202020202073656c662e746f6b656e555249735b69645d203d20746f6b656e5552490a202020202020202072657475726e203c2d637265617465204e4654280a20202020202020202020202065766d49443a2069642c0a2020202020202020202020206d657461646174613a207b0a20202020202020202020202020202020224272696467656420426c6f636b223a2067657443757272656e74426c6f636b28292e6865696768742c0a2020202020202020202020202020202022427269646765642054696d657374616d70223a2067657443757272656e74426c6f636b28292e74696d657374616d700a2020202020202020202020207d0a2020202020202020290a202020207d0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f207570646174652074686520555249206f662062726964676564204e4654732e205468697320617373756d65732074686174207468652045564d2d646566696e696e672070726f6a656374206d617920636f6e7461696e0a202020202f2f2f206c6f67696320286f6e636861696e206f72206f6666636861696e292077686963682075706461746573204e4654206d6574616461746120696e2074686520736f757263652045524337323120636f6e74726163742e204f6e206272696467696e672c20746865205552492063616e0a202020202f2f2f207468656e206265207570646174656420696e207468697320636f6e747261637420746f207265666c6563742074686520736f757263652045524337323120636f6e74726163742773206d657461646174612e0a202020202f2f2f0a20202020616363657373286163636f756e74290a2020202066756e20757064617465546f6b656e5552492865766d49443a2055496e743235362c206e65775552493a20537472696e6729207b0a2020202020202020707265207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d20213d206e696c3a20224e6f20746f6b656e20776974682074686520676976656e2045524337323120494420657869737473220a20202020202020207d0a202020202020202069662073656c662e746f6b656e555249735b65766d49445d20213d206e6577555249207b0a20202020202020202020202073656c662e746f6b656e555249735b65766d49445d203d206e65775552490a20202020202020207d0a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", + "2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d4e4654436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f6b656e55524973203d207b7d0a202020202020202073656c662e636f6c6c656374696f6e203c2d2063726561746520436f6c6c656374696f6e28290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", + "2e4e46543e28292c20776974683a2073656c662e65766d4e4654436f6e747261637441646472657373290a2020202020202020466c6f7745564d4272696467654e4654457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020666f72547970653a20547970653c40", + "2e4e46543e28292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020657263373231416464726573733a2073656c662e65766d4e4654436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" ] access(all) let bridgedTokenCodeChunks = [ -"696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e4d6574616461746156696577732066726f6d203078303030303030303030303030303030320a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d427269646765546f6b656e4d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765546f6b656e457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d546f6b656e2066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e61746976652066756e6769626c6520746f6b656e7320627269646765642066726f6d20466c6f772045564d20746f200a2f2f2f20436164656e63652e2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e200a2f2f2f2045524332302920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c20746865204552433230206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e6420746f6b656e7320617265206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206275726e65640a2f2f2f20696e207468697320636f6e747261637420616e6420746865204552433230206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e6365205661756c74206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d20746f6b656e7320616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", -"203a204943726f7373564d2c204943726f7373564d41737365742c204945564d427269646765546f6b656e4d696e7465722c2046756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d546f6b656e436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20446563696d616c20706c6163652076616c756520646566696e656420696e2074686520736f7572636520455243323020636f6e74726163740a2020202061636365737328616c6c29206c657420646563696d616c733a2055496e74380a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f20546f74616c20737570706c79206f66207468697320436164656e636520746f6b656e20696e2063697263756c6174696f6e0a202020202f2f2f204e4f54453a205468697320646f6573206e6f74207265666c6563742074686520746f74616c20737570706c79206f662074686520736f7572636520455243323020696e2063697263756c6174696f6e2077697468696e2045564d0a2020202061636365737328616c6c292076617220746f74616c537570706c793a205546697836340a202020202f2f2f2052657461696e2061205661756c7420746f207265666572656e6365207768656e207265736f6c76696e67205661756c74204d657461646174610a202020206163636573732873656c6629206c6574207661756c743a20405661756c740a0a202020202f2f2f20546865205661756c74207265736f7572636520726570726573656e74696e6720746865206272696467656420455243323020746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365205661756c74203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d546f6b656e2e45564d546f6b656e496e666f2c2046756e6769626c65546f6b656e2e5661756c74207b0a20202020202020202f2f2f2042616c616e6365206f662074686520746f6b656e7320696e206120676976656e205661756c740a202020202020202061636365737328616c6c29207661722062616c616e63653a205546697836340a0a2020202020202020696e69742862616c616e63653a2055466978363429207b0a20202020202020202020202073656c662e62616c616e6365203d2062616c616e63650a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d546f6b656e2e45564d46545661756c7420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f204765747320746865204552433230206e616d652076616c75650a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", -"2e6e616d650a20202020202020207d0a20202020202020202f2f2f2047657473207468652045524332302073796d626f6c2076616c75650a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", -"2e73796d626f6c0a20202020202020207d0a20202020202020202f2f2f20476574732074686520455243323020646563696d616c732076616c75650a202020202020202061636365737328616c6c2920766965772066756e20676574446563696d616c7328293a2055496e7438207b0a20202020202020202020202072657475726e20", -"2e646563696d616c730a20202020202020207d0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", -"2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e20", -"2e676574436f6e74726163745669657773287265736f75726365547970653a206e696c290a20202020202020207d0a0a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a20202020202020202020202072657475726e20", -"2e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a2076696577290a20202020202020207d0a0a20202020202020202f2f2f20676574537570706f727465645661756c745479706573206f7074696f6e616c6c792072657475726e732061206c697374206f66207661756c742074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465645661756c74547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b2073656c662e6765745479706528293a2074727565207d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465645661756c745479706528747970653a2054797065293a20426f6f6c207b0a20202020202020202020202072657475726e2073656c662e676574537570706f727465645661756c74547970657328295b747970655d203f3f2066616c73650a20202020202020207d0a0a20202020202020202f2f2f2041736b732069662074686520616d6f756e742063616e2062652077697468647261776e2066726f6d2074686973207661756c740a202020202020202061636365737328616c6c2920766965772066756e206973417661696c61626c65546f576974686472617728616d6f756e743a20554669783634293a20426f6f6c207b0a20202020202020202020202072657475726e20616d6f756e74203c3d2073656c662e62616c616e63650a20202020202020207d0a0a20202020202020202f2f2f206465706f7369740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b65732061205661756c74206f626a65637420617320616e20617267756d656e7420616e6420616464730a20202020202020202f2f2f206974732062616c616e636520746f207468652062616c616e6365206f6620746865206f776e657273205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420697320616c6c6f77656420746f2064657374726f79207468652073656e74205661756c74206265636175736520746865205661756c740a20202020202020202f2f2f2077617320612074656d706f7261727920686f6c646572206f662074686520746f6b656e732e20546865205661756c7427732062616c616e6365206861730a20202020202020202f2f2f206265656e20636f6e73756d656420616e64207468657265666f72652063616e2062652064657374726f7965642e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e206465706f7369742866726f6d3a20407b46756e6769626c65546f6b656e2e5661756c747d29207b0a2020202020202020202020206c6574207661756c74203c2d2066726f6d2061732120405661756c740a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202b207661756c742e62616c616e63650a2020202020202020202020207661756c742e62616c616e6365203d20302e300a20202020202020202020202064657374726f79207661756c740a20202020202020207d0a0a20202020202020202f2f2f20637265617465456d7074795661756c740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f0a20202020202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c20746869732066756e6374696f6e0a20202020202020202f2f2f20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f772074686569720a20202020202020202f2f2f206163636f756e7420746f2062652061626c6520746f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e20637265617465456d7074795661756c7428293a20405661756c74207b0a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20302e30290a20202020202020207d0a0a20202020202020202f2f2f2077697468647261770a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b657320616e20616d6f756e7420617320616e20617267756d656e740a20202020202020202f2f2f20616e6420776974686472617773207468617420616d6f756e742066726f6d20746865205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420637265617465732061206e65772074656d706f72617279205661756c742074686174206973207573656420746f20686f6c640a20202020202020202f2f2f2074686520746f6b656e73207468617420617265206265696e67207472616e736665727265642e2049742072657475726e7320746865206e65776c790a20202020202020202f2f2f2063726561746564205661756c7420746f2074686520636f6e7465787420746861742063616c6c656420736f2069742063616e206265206465706f73697465640a20202020202020202f2f2f20656c736577686572652e0a20202020202020202f2f2f0a20202020202020206163636573732846756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728616d6f756e743a20554669783634293a20405661756c74207b0a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202d20616d6f756e740a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20616d6f756e74290a20202020202020207d0a0a20202020202020202f2f2f2043616c6c6564207768656e20612066756e6769626c6520746f6b656e206973206275726e6564207669612074686520604275726e65722e6275726e282960206d6574686f640a202020202020202061636365737328636f6e7472616374292066756e206275726e43616c6c6261636b2829207b0a20202020202020202020202069662073656c662e62616c616e6365203e20302e30207b0a20202020202020202020202020202020", -"2e746f74616c537570706c79203d20", -"2e746f74616c537570706c79202d2073656c662e62616c616e63650a2020202020202020202020207d0a20202020202020202020202073656c662e62616c616e6365203d20302e300a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d7074795661756c740a202020202f2f2f0a202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c0a202020202f2f2f20746869732066756e6374696f6e20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f77207468656972206163636f756e7420746f2062652061626c6520746f0a202020202f2f2f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a202020202f2f2f0a2020202061636365737328616c6c292066756e20637265617465456d7074795661756c74287661756c74547970653a2054797065293a2040", -"2e5661756c74207b0a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20302e30290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d546f6b656e436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e74656420627920746869732066756e6769626c6520746f6b656e20636f6e74726163742e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c206265207573656420627920646576656c6f7065727320746f206b6e6f772077686963680a202020202f2f2f202020202020202020706172616d6574657220746f207061737320746f20746865207265736f6c7665436f6e7472616374566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e465456696577280a20202020202020202020202020202020202020206674446973706c61793a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793f2c0a202020202020202020202020202020202020202066745661756c74446174613a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613f0a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28293a0a202020202020202020202020202020206c657420636f6e7472616374526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e2829290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c7444617461280a202020202020202020202020202020202020202073746f72616765506174683a202f73746f726167652f", -"5661756c742c0a20202020202020202020202020202020202020207265636569766572506174683a202f7075626c69632f", -"52656365697665722c0a20202020202020202020202020202020202020206d65746164617461506174683a202f7075626c69632f", -"5661756c742c0a202020202020202020202020202020202020202072656365697665724c696e6b6564547970653a20547970653c26", -"2e5661756c743e28292c0a20202020202020202020202020202020202020206d657461646174614c696e6b6564547970653a20547970653c26", -"2e5661756c743e28292c0a2020202020202020202020202020202020202020637265617465456d7074795661756c7446756e6374696f6e3a202866756e28293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d73656c662e637265617465456d7074795661756c74287661756c74547970653a20547970653c40", -"2e5661756c743e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c79280a2020202020202020202020202020202020202020746f74616c537570706c793a2073656c662e746f74616c537570706c790a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e7420746f6b656e732066726f6d206272696467652d646566696e65642066756e6769626c6520746f6b656e20636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74292066756e206d696e74546f6b656e7328616d6f756e743a20554669783634293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a202020202020202073656c662e746f74616c537570706c79203d2073656c662e746f74616c537570706c79202b20616d6f756e740a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20616d6f756e74290a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", -"2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c20646563696d616c733a2055496e74382c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d546f6b656e436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e646563696d616c73203d20646563696d616c730a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f74616c537570706c79203d20302e300a202020202020202073656c662e7661756c74203c2d20637265617465205661756c742862616c616e63653a20302e30290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", -"2e5661756c743e28292c20776974683a2073656c662e65766d546f6b656e436f6e747261637441646472657373290a2020202020202020466c6f7745564d427269646765546f6b656e457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020776974683a203c2d637265617465205661756c742862616c616e63653a20302e30292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020646563696d616c733a20646563696d616c732c0a20202020202020202020202065766d546f6b656e416464726573733a2073656c662e65766d546f6b656e436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" + "696d706f7274204e6f6e46756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030310a696d706f7274204d6574616461746156696577732066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e4d6574616461746156696577732066726f6d203078303030303030303030303030303030320a696d706f727420566965775265736f6c7665722066726f6d203078303030303030303030303030303030310a696d706f72742046756e6769626c65546f6b656e2066726f6d203078303030303030303030303030303030320a696d706f727420466c6f77546f6b656e2066726f6d203078303030303030303030303030303030330a0a696d706f72742045564d2066726f6d203078303030303030303030303030303030310a0a696d706f7274204943726f7373564d2066726f6d203078303030303030303030303030303030370a696d706f7274204943726f7373564d41737365742066726f6d203078303030303030303030303030303030370a696d706f7274204945564d427269646765546f6b656e4d696e7465722066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765546f6b656e457363726f772066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d427269646765436f6e6669672066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655574696c732066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467652066726f6d203078303030303030303030303030303030370a696d706f72742043726f7373564d546f6b656e2066726f6d203078303030303030303030303030303030370a696d706f727420466c6f7745564d4272696467655265736f6c7665722066726f6d203078303030303030303030303030303030370a0a2f2f2f205468697320636f6e747261637420697320612074656d706c617465207573656420627920466c6f7745564d42726964676520746f20646566696e652045564d2d6e61746976652066756e6769626c6520746f6b656e7320627269646765642066726f6d20466c6f772045564d20746f200a2f2f2f20436164656e63652e2055706f6e206465706c6f796d656e74206f66207468697320636f6e74726163742c2074686520636f6e7472616374206e616d65206973206465726976656420617320612066756e6374696f6e206f6620746865206173736574207479706520286865726520616e200a2f2f2f2045524332302920616e642074686520636f6e747261637427732045564d20616464726573732e20546865206465726976656420636f6e7472616374206e616d65206973207468656e206a6f696e65642077697468207468697320636f6e7472616374277320636f64652c0a2f2f2f207072657061726564206173206368756e6b7320696e20466c6f7745564d42726964676554656d706c61746573206265666f7265206265696e67206465706c6f79656420746f2074686520466c6f772045564d20427269646765206163636f756e742e0a2f2f2f0a2f2f2f204f6e206272696467696e672c20746865204552433230206973207472616e7366657272656420746f2074686520627269646765277320436164656e63654f776e65644163636f756e742045564d206164647265737320616e6420746f6b656e7320617265206d696e7465642066726f6d0a2f2f2f207468697320636f6e747261637420746f20746865206272696467696e672063616c6c65722e204f6e2072657475726e20746f20466c6f772045564d2c2074686520726576657273652070726f6365737320697320666f6c6c6f776564202d2074686520746f6b656e206973206275726e65640a2f2f2f20696e207468697320636f6e747261637420616e6420746865204552433230206973207472616e7366657272656420746f2074686520646566696e656420726563697069656e742e20496e2074686973207761792c2074686520436164656e6365205661756c74206163747320617320610a2f2f2f20726570726573656e746174696f6e206f6620626f7468207468652045564d20746f6b656e7320616e642074687573206f776e6572736869702072696768747320746f2069742075706f6e206272696467696e67206261636b20746f20466c6f772045564d2e0a2f2f2f0a2f2f2f20546f20627269646765206265747765656e20564d732c20612063616c6c65722063616e20656974686572207573652074686520696e74657266616365206578706f736564206f6e20436164656e63654f776e65644163636f756e74206f722075736520466c6f7745564d4272696467650a2f2f2f207075626c696320636f6e7472616374206d6574686f64732e0a2f2f2f0a61636365737328616c6c2920636f6e747261637420", + "203a204943726f7373564d2c204943726f7373564d41737365742c204945564d427269646765546f6b656e4d696e7465722c2046756e6769626c65546f6b656e207b0a0a202020202f2f2f20506f696e74657220746f2074686520466163746f7279206465706c6f79656420536f6c696469747920636f6e7472616374206164647265737320646566696e696e672074686520627269646765642061737365740a2020202061636365737328616c6c29206c65742065766d546f6b656e436f6e7472616374416464726573733a2045564d2e45564d416464726573730a202020202f2f2f204e616d65206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c6574206e616d653a20537472696e670a202020202f2f2f2053796d626f6c206f66207468652066756e6769626c6520746f6b656e20646566696e656420696e2074686520636f72726573706f6e64696e6720455243323020636f6e74726163740a2020202061636365737328616c6c29206c65742073796d626f6c3a20537472696e670a202020202f2f2f20446563696d616c20706c6163652076616c756520646566696e656420696e2074686520736f7572636520455243323020636f6e74726163740a2020202061636365737328616c6c29206c657420646563696d616c733a2055496e74380a202020202f2f2f20555249206f662074686520636f6e74726163742c20696620617661696c61626c6520617320612076617220696e2063617365207468652062726964676520656e61626c65732063726f73732d564d204d657461646174612073796e63696e6720696e20746865206675747572650a2020202061636365737328616c6c292076617220636f6e74726163745552493a20537472696e673f0a202020202f2f2f20546f74616c20737570706c79206f66207468697320436164656e636520746f6b656e20696e2063697263756c6174696f6e0a202020202f2f2f204e4f54453a205468697320646f6573206e6f74207265666c6563742074686520746f74616c20737570706c79206f662074686520736f7572636520455243323020696e2063697263756c6174696f6e2077697468696e2045564d0a2020202061636365737328616c6c292076617220746f74616c537570706c793a205546697836340a202020202f2f2f2052657461696e2061205661756c7420746f207265666572656e6365207768656e207265736f6c76696e67205661756c74204d657461646174610a202020206163636573732873656c6629206c6574207661756c743a20405661756c740a0a202020202f2f2f20546865205661756c74207265736f7572636520726570726573656e74696e6720746865206272696467656420455243323020746f6b656e0a202020202f2f2f0a2020202061636365737328616c6c29207265736f75726365205661756c74203a204943726f7373564d41737365742e4173736574496e666f2c2043726f7373564d546f6b656e2e45564d546f6b656e496e666f2c2046756e6769626c65546f6b656e2e5661756c74207b0a20202020202020202f2f2f2042616c616e6365206f662074686520746f6b656e7320696e206120676976656e205661756c740a202020202020202061636365737328616c6c29207661722062616c616e63653a205546697836340a0a2020202020202020696e69742862616c616e63653a2055466978363429207b0a20202020202020202020202073656c662e62616c616e6365203d2062616c616e63650a20202020202020207d0a0a20202020202020202f2a202d2d2d2043726f7373564d546f6b656e2e45564d46545661756c7420636f6e666f726d616e6365202d2d2d202a2f0a20202020202020202f2f0a20202020202020202f2f2f204765747320746865204552433230206e616d652076616c75650a202020202020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a20202020202020202020202072657475726e20", + "2e6e616d650a20202020202020207d0a20202020202020202f2f2f2047657473207468652045524332302073796d626f6c2076616c75650a202020202020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a20202020202020202020202072657475726e20", + "2e73796d626f6c0a20202020202020207d0a20202020202020202f2f2f20476574732074686520455243323020646563696d616c732076616c75650a202020202020202061636365737328616c6c2920766965772066756e20676574446563696d616c7328293a2055496e7438207b0a20202020202020202020202072657475726e20", + "2e646563696d616c730a20202020202020207d0a20202020202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e0a202020202020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a20202020202020202020202072657475726e20", + "2e67657445564d436f6e74726163744164647265737328290a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e20676574566965777328293a205b547970655d207b0a20202020202020202020202072657475726e20", + "2e676574436f6e74726163745669657773287265736f75726365547970653a206e696c290a20202020202020207d0a0a202020202020202061636365737328616c6c292066756e207265736f6c766556696577285f20766965773a2054797065293a20416e795374727563743f207b0a20202020202020202020202072657475726e20", + "2e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a2076696577290a20202020202020207d0a0a20202020202020202f2f2f20676574537570706f727465645661756c745479706573206f7074696f6e616c6c792072657475726e732061206c697374206f66207661756c742074797065732074686174207468697320726563656976657220616363657074730a202020202020202061636365737328616c6c2920766965772066756e20676574537570706f727465645661756c74547970657328293a207b547970653a20426f6f6c7d207b0a20202020202020202020202072657475726e207b2073656c662e6765745479706528293a2074727565207d0a20202020202020207d0a0a202020202020202061636365737328616c6c2920766965772066756e206973537570706f727465645661756c745479706528747970653a2054797065293a20426f6f6c207b0a20202020202020202020202072657475726e2073656c662e676574537570706f727465645661756c74547970657328295b747970655d203f3f2066616c73650a20202020202020207d0a0a20202020202020202f2f2f2041736b732069662074686520616d6f756e742063616e2062652077697468647261776e2066726f6d2074686973207661756c740a202020202020202061636365737328616c6c2920766965772066756e206973417661696c61626c65546f576974686472617728616d6f756e743a20554669783634293a20426f6f6c207b0a20202020202020202020202072657475726e20616d6f756e74203c3d2073656c662e62616c616e63650a20202020202020207d0a0a20202020202020202f2f2f206465706f7369740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b65732061205661756c74206f626a65637420617320616e20617267756d656e7420616e6420616464730a20202020202020202f2f2f206974732062616c616e636520746f207468652062616c616e6365206f6620746865206f776e657273205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420697320616c6c6f77656420746f2064657374726f79207468652073656e74205661756c74206265636175736520746865205661756c740a20202020202020202f2f2f2077617320612074656d706f7261727920686f6c646572206f662074686520746f6b656e732e20546865205661756c7427732062616c616e6365206861730a20202020202020202f2f2f206265656e20636f6e73756d656420616e64207468657265666f72652063616e2062652064657374726f7965642e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e206465706f7369742866726f6d3a20407b46756e6769626c65546f6b656e2e5661756c747d29207b0a2020202020202020202020206c6574207661756c74203c2d2066726f6d2061732120405661756c740a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202b207661756c742e62616c616e63650a2020202020202020202020207661756c742e62616c616e6365203d20302e300a20202020202020202020202064657374726f79207661756c740a20202020202020207d0a0a20202020202020202f2f2f20637265617465456d7074795661756c740a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f0a20202020202020202f2f2f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c20746869732066756e6374696f6e0a20202020202020202f2f2f20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f772074686569720a20202020202020202f2f2f206163636f756e7420746f2062652061626c6520746f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a20202020202020202f2f2f0a202020202020202061636365737328616c6c292066756e20637265617465456d7074795661756c7428293a20405661756c74207b0a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20302e30290a20202020202020207d0a0a20202020202020202f2f2f2077697468647261770a20202020202020202f2f2f0a20202020202020202f2f2f2046756e6374696f6e20746861742074616b657320616e20616d6f756e7420617320616e20617267756d656e740a20202020202020202f2f2f20616e6420776974686472617773207468617420616d6f756e742066726f6d20746865205661756c742e0a20202020202020202f2f2f0a20202020202020202f2f2f20497420637265617465732061206e65772074656d706f72617279205661756c742074686174206973207573656420746f20686f6c640a20202020202020202f2f2f2074686520746f6b656e73207468617420617265206265696e67207472616e736665727265642e2049742072657475726e7320746865206e65776c790a20202020202020202f2f2f2063726561746564205661756c7420746f2074686520636f6e7465787420746861742063616c6c656420736f2069742063616e206265206465706f73697465640a20202020202020202f2f2f20656c736577686572652e0a20202020202020202f2f2f0a20202020202020206163636573732846756e6769626c65546f6b656e2e5769746864726177292066756e20776974686472617728616d6f756e743a20554669783634293a20405661756c74207b0a20202020202020202020202073656c662e62616c616e6365203d2073656c662e62616c616e6365202d20616d6f756e740a20202020202020202020202072657475726e203c2d637265617465205661756c742862616c616e63653a20616d6f756e74290a20202020202020207d0a0a20202020202020202f2f2f2043616c6c6564207768656e20612066756e6769626c6520746f6b656e206973206275726e6564207669612074686520604275726e65722e6275726e282960206d6574686f640a202020202020202061636365737328636f6e7472616374292066756e206275726e43616c6c6261636b2829207b0a20202020202020202020202069662073656c662e62616c616e6365203e20302e30207b0a20202020202020202020202020202020", + "2e746f74616c537570706c79203d20", + "2e746f74616c537570706c79202d2073656c662e62616c616e63650a2020202020202020202020207d0a20202020202020202020202073656c662e62616c616e6365203d20302e300a20202020202020207d0a202020207d0a0a202020202f2f2f20637265617465456d7074795661756c740a202020202f2f2f0a202020202f2f2f2046756e6374696f6e207468617420637265617465732061206e6577205661756c74207769746820612062616c616e6365206f66207a65726f20616e642072657475726e7320697420746f207468652063616c6c696e6720636f6e746578742e20412075736572206d7573742063616c6c0a202020202f2f2f20746869732066756e6374696f6e20616e642073746f7265207468652072657475726e6564205661756c7420696e2074686569722073746f7261676520696e206f7264657220746f20616c6c6f77207468656972206163636f756e7420746f2062652061626c6520746f0a202020202f2f2f2072656365697665206465706f73697473206f66207468697320746f6b656e20747970652e0a202020202f2f2f0a2020202061636365737328616c6c292066756e20637265617465456d7074795661756c74287661756c74547970653a2054797065293a2040", + "2e5661756c74207b0a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20302e30290a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a202020202020202020202020476574746572730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f2052657475726e7320746865206e616d65206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e206765744e616d6528293a20537472696e67207b0a202020202020202072657475726e2073656c662e6e616d650a202020207d0a0a202020202f2f2f2052657475726e73207468652073796d626f6c206f66207468652061737365740a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657453796d626f6c28293a20537472696e67207b0a202020202020202072657475726e2073656c662e73796d626f6c0a202020207d0a0a202020202f2f2f2052657475726e73207468652045564d20636f6e74726163742061646472657373206f66207468652066756e6769626c6520746f6b656e207468697320636f6e747261637420726570726573656e74730a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e2067657445564d436f6e74726163744164647265737328293a2045564d2e45564d41646472657373207b0a202020202020202072657475726e2073656c662e65766d546f6b656e436f6e7472616374416464726573730a202020207d0a0a202020202f2f2f2046756e6374696f6e20746861742072657475726e7320616c6c20746865204d6574616461746120566965777320696d706c656d656e74656420627920746869732066756e6769626c6520746f6b656e20636f6e74726163742e0a202020202f2f2f0a202020202f2f2f204072657475726e20416e206172726179206f6620547970657320646566696e696e672074686520696d706c656d656e7465642076696577732e20546869732076616c75652077696c6c206265207573656420627920646576656c6f7065727320746f206b6e6f772077686963680a202020202f2f2f202020202020202020706172616d6574657220746f207061737320746f20746865207265736f6c7665436f6e7472616374566965772829206d6574686f642e0a202020202f2f2f0a2020202061636365737328616c6c2920766965772066756e20676574436f6e74726163745669657773287265736f75726365547970653a20547970653f293a205b547970655d207b0a202020202020202072657475726e205b0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28292c0a202020202020202020202020547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28292c0a202020202020202020202020547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28290a20202020202020205d0a202020207d0a0a202020202f2f2f2046756e6374696f6e2074686174207265736f6c7665732061206d65746164617461207669657720666f72207468697320636f6e74726163742e0a202020202f2f2f0a202020202f2f2f2040706172616d20766965773a205468652054797065206f6620746865206465736972656420766965772e0a202020202f2f2f0a202020202f2f2f204072657475726e20412073747275637475726520726570726573656e74696e67207468652072657175657374656420766965772e0a202020202f2f2f0a2020202061636365737328616c6c292066756e207265736f6c7665436f6e747261637456696577287265736f75726365547970653a20547970653f2c2076696577547970653a2054797065293a20416e795374727563743f207b0a2020202020202020737769746368207669657754797065207b0a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654566965773e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e465456696577280a20202020202020202020202020202020202020206674446973706c61793a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793f2c0a202020202020202020202020202020202020202066745661756c74446174613a2073656c662e7265736f6c7665436f6e747261637456696577287265736f75726365547970653a206e696c2c2076696577547970653a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e282929206173212046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613f0a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e28293a0a202020202020202020202020202020206c657420636f6e7472616374526566203d2073656c662e626f72726f7754686973436f6e747261637428290a2020202020202020202020202020202072657475726e20466c6f7745564d4272696467655265736f6c7665722e7265736f6c766542726964676564566965772862726964676564436f6e74726163743a20636f6e74726163745265662c20766965773a20547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e4654446973706c61793e2829290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c74446174613e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e46545661756c7444617461280a202020202020202020202020202020202020202073746f72616765506174683a202f73746f726167652f", + "5661756c742c0a20202020202020202020202020202020202020207265636569766572506174683a202f7075626c69632f", + "52656365697665722c0a20202020202020202020202020202020202020206d65746164617461506174683a202f7075626c69632f", + "5661756c742c0a202020202020202020202020202020202020202072656365697665724c696e6b6564547970653a20547970653c26", + "2e5661756c743e28292c0a20202020202020202020202020202020202020206d657461646174614c696e6b6564547970653a20547970653c26", + "2e5661756c743e28292c0a2020202020202020202020202020202020202020637265617465456d7074795661756c7446756e6374696f6e3a202866756e28293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a20202020202020202020202020202020202020202020202072657475726e203c2d73656c662e637265617465456d7074795661756c74287661756c74547970653a20547970653c40", + "2e5661756c743e2829290a20202020202020202020202020202020202020207d290a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c46756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c793e28293a0a2020202020202020202020202020202072657475726e2046756e6769626c65546f6b656e4d6574616461746156696577732e546f74616c537570706c79280a2020202020202020202020202020202020202020746f74616c537570706c793a2073656c662e746f74616c537570706c790a20202020202020202020202020202020290a2020202020202020202020206361736520547970653c4d6574616461746156696577732e45564d427269646765644d657461646174613e28293a0a2020202020202020202020202020202072657475726e204d6574616461746156696577732e45564d427269646765644d65746164617461280a20202020202020202020202020202020202020206e616d653a2073656c662e6e616d652c0a202020202020202020202020202020202020202073796d626f6c3a2073656c662e73796d626f6c2c0a20202020202020202020202020202020202020207572693a2073656c662e636f6e747261637455524920213d206e696c203f204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a2073656c662e636f6e74726163745552492129203a204d6574616461746156696577732e55524928626173655552493a206e696c2c2076616c75653a202222290a20202020202020202020202020202020290a20202020202020207d0a202020202020202072657475726e206e696c0a202020207d0a0a202020202f2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a0a2020202020202020496e7465726e616c204d6574686f64730a202020202a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2f0a0a202020202f2f2f20416c6c6f7773207468652062726964676520746f206d696e7420746f6b656e732066726f6d206272696467652d646566696e65642066756e6769626c6520746f6b656e20636f6e7472616374730a202020202f2f2f0a20202020616363657373286163636f756e74292066756e206d696e74546f6b656e7328616d6f756e743a20554669783634293a20407b46756e6769626c65546f6b656e2e5661756c747d207b0a202020202020202073656c662e746f74616c537570706c79203d2073656c662e746f74616c537570706c79202b20616d6f756e740a202020202020202072657475726e203c2d20637265617465205661756c742862616c616e63653a20616d6f756e74290a202020207d0a0a202020202f2f2f2052657475726e732061207265666572656e636520746f207468697320636f6e747261637420617320616e204943726f7373564d417373657420636f6e74726163740a202020202f2f2f0a202020206163636573732873656c66290a2020202066756e20626f72726f7754686973436f6e747261637428293a20267b4943726f7373564d41737365747d207b0a20202020202020206c657420636f6e747261637441646472657373203d2073656c662e6163636f756e742e616464726573730a202020202020202072657475726e206765744163636f756e7428636f6e747261637441646472657373292e636f6e7472616374732e626f72726f773c267b4943726f7373564d41737365747d3e286e616d653a2022", + "2229210a202020207d0a0a20202020696e6974286e616d653a20537472696e672c2073796d626f6c3a20537472696e672c20646563696d616c733a2055496e74382c2065766d436f6e7472616374416464726573733a2045564d2e45564d416464726573732c20636f6e74726163745552493a20537472696e673f29207b0a202020202020202073656c662e65766d546f6b656e436f6e747261637441646472657373203d2065766d436f6e7472616374416464726573730a202020202020202073656c662e6e616d65203d206e616d650a202020202020202073656c662e73796d626f6c203d2073796d626f6c0a202020202020202073656c662e646563696d616c73203d20646563696d616c730a202020202020202073656c662e636f6e7472616374555249203d20636f6e74726163745552490a202020202020202073656c662e746f74616c537570706c79203d20302e300a202020202020202073656c662e7661756c74203c2d20637265617465205661756c742862616c616e63653a20302e30290a0a2020202020202020466c6f7745564d427269646765436f6e6669672e6173736f63696174655479706528547970653c40", + "2e5661756c743e28292c20776974683a2073656c662e65766d546f6b656e436f6e747261637441646472657373290a2020202020202020466c6f7745564d427269646765546f6b656e457363726f772e696e697469616c697a65457363726f77280a202020202020202020202020776974683a203c2d637265617465205661756c742862616c616e63653a20302e30292c0a2020202020202020202020206e616d653a206e616d652c0a20202020202020202020202073796d626f6c3a2073796d626f6c2c0a202020202020202020202020646563696d616c733a20646563696d616c732c0a20202020202020202020202065766d546f6b656e416464726573733a2073656c662e65766d546f6b656e436f6e7472616374416464726573730a2020202020202020290a202020207d0a7d0a" ] @@ -588,46 +588,46 @@ access(all) let wflowBytecode = "60806040526040518060400160405280600c81526020017 access(all) let usdc6Bytecode = "610160604052348015610010575f5ffd5b5060405161299138038061299183398181016040528101906100329190610495565b6040518060400160405280600881526020017f55534420436f696e000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250836040518060400160405280600881526020017f55534420436f696e0000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5553444300000000000000000000000000000000000000000000000000000000815250816003908161011b91906106fd565b50806004908161012b91906106fd565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361019e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161019591906107db565b60405180910390fd5b6101ad8161025f60201b60201c565b506101c260068361032260201b90919060201c565b61012081815250506101de60078261032260201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a0818152505061021b61036f60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff168152505050505050610985565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6020835110156103435761033c836103c960201b60201c565b9050610369565b826103538361042e60201b60201c565b5f01908161036191906106fd565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016103ae95949392919061081b565b60405160208183030381529060405280519060200120905090565b5f5f829050601f8151111561041557826040517f305a27a900000000000000000000000000000000000000000000000000000000815260040161040c91906108d2565b60405180910390fd5b8051816104219061091f565b5f1c175f1b915050919050565b5f819050919050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6104648261043b565b9050919050565b6104748161045a565b811461047e575f5ffd5b50565b5f8151905061048f8161046b565b92915050565b5f602082840312156104aa576104a9610437565b5b5f6104b784828501610481565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061053b57607f821691505b60208210810361054e5761054d6104f7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105b07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610575565b6105ba8683610575565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6105fe6105f96105f4846105d2565b6105db565b6105d2565b9050919050565b5f819050919050565b610617836105e4565b61062b61062382610605565b848454610581565b825550505050565b5f5f905090565b610642610633565b61064d81848461060e565b505050565b5b81811015610670576106655f8261063a565b600181019050610653565b5050565b601f8211156106b55761068681610554565b61068f84610566565b8101602085101561069e578190505b6106b26106aa85610566565b830182610652565b50505b505050565b5f82821c905092915050565b5f6106d55f19846008026106ba565b1980831691505092915050565b5f6106ed83836106c6565b9150826002028217905092915050565b610706826104c0565b67ffffffffffffffff81111561071f5761071e6104ca565b5b6107298254610524565b610734828285610674565b5f60209050601f831160018114610765575f8415610753578287015190505b61075d85826106e2565b8655506107c4565b601f19841661077386610554565b5f5b8281101561079a57848901518255600182019150602085019450602081019050610775565b868310156107b757848901516107b3601f8916826106c6565b8355505b6001600288020188555050505b505050505050565b6107d58161045a565b82525050565b5f6020820190506107ee5f8301846107cc565b92915050565b5f819050919050565b610806816107f4565b82525050565b610815816105d2565b82525050565b5f60a08201905061082e5f8301886107fd565b61083b60208301876107fd565b61084860408301866107fd565b610855606083018561080c565b61086260808301846107cc565b9695505050505050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6108a4826104c0565b6108ae818561086c565b93506108be81856020860161087c565b6108c78161088a565b840191505092915050565b5f6020820190508181035f8301526108ea818461089a565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f61091682516107f4565b80915050919050565b5f610929826108f2565b82610933846108fc565b905061093e8161090b565b9250602082101561097e576109797fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610575565b831692505b5050919050565b60805160a05160c05160e051610100516101205161014051611fbb6109d65f395f610e5101525f610e1601525f61134a01525f61132901525f610acc01525f610b2201525f610b4b0152611fbb5ff3fe608060405234801561000f575f5ffd5b506004361061011f575f3560e01c8063715018a6116100ab57806395d89b411161006f57806395d89b41146102fb578063a9059cbb14610319578063d505accf14610349578063dd62ed3e14610365578063f2fde38b146103955761011f565b8063715018a61461026357806379cc67901461026d5780637ecebe001461028957806384b0196e146102b95780638da5cb5b146102dd5761011f565b8063313ce567116100f2578063313ce567146101bf5780633644e515146101dd57806340c10f19146101fb57806342966c681461021757806370a08231146102335761011f565b806306fdde0314610123578063095ea7b31461014157806318160ddd1461017157806323b872dd1461018f575b5f5ffd5b61012b6103b1565b6040516101389190611800565b60405180910390f35b61015b600480360381019061015691906118b1565b610441565b6040516101689190611909565b60405180910390f35b610179610463565b6040516101869190611931565b60405180910390f35b6101a960048036038101906101a4919061194a565b61046c565b6040516101b69190611909565b60405180910390f35b6101c761049a565b6040516101d491906119b5565b60405180910390f35b6101e56104a2565b6040516101f291906119e6565b60405180910390f35b610215600480360381019061021091906118b1565b6104b0565b005b610231600480360381019061022c91906119ff565b6104c6565b005b61024d60048036038101906102489190611a2a565b6104da565b60405161025a9190611931565b60405180910390f35b61026b61051f565b005b610287600480360381019061028291906118b1565b610532565b005b6102a3600480360381019061029e9190611a2a565b610552565b6040516102b09190611931565b60405180910390f35b6102c1610563565b6040516102d49796959493929190611b55565b60405180910390f35b6102e5610608565b6040516102f29190611bd7565b60405180910390f35b610303610630565b6040516103109190611800565b60405180910390f35b610333600480360381019061032e91906118b1565b6106c0565b6040516103409190611909565b60405180910390f35b610363600480360381019061035e9190611c44565b6106e2565b005b61037f600480360381019061037a9190611ce1565b610827565b60405161038c9190611931565b60405180910390f35b6103af60048036038101906103aa9190611a2a565b6108a9565b005b6060600380546103c090611d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546103ec90611d4c565b80156104375780601f1061040e57610100808354040283529160200191610437565b820191905f5260205f20905b81548152906001019060200180831161041a57829003601f168201915b5050505050905090565b5f5f61044b61092d565b9050610458818585610934565b600191505092915050565b5f600254905090565b5f5f61047661092d565b9050610483858285610946565b61048e8585856109d9565b60019150509392505050565b5f6006905090565b5f6104ab610ac9565b905090565b6104b8610b7f565b6104c28282610c06565b5050565b6104d76104d161092d565b82610c85565b50565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610527610b7f565b6105305f610d04565b565b6105448261053e61092d565b83610946565b61054e8282610c85565b5050565b5f61055c82610dc7565b9050919050565b5f6060805f5f5f6060610574610e0d565b61057c610e48565b46305f5f1b5f67ffffffffffffffff81111561059b5761059a611d7c565b5b6040519080825280602002602001820160405280156105c95781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461063f90611d4c565b80601f016020809104026020016040519081016040528092919081815260200182805461066b90611d4c565b80156106b65780601f1061068d576101008083540402835291602001916106b6565b820191905f5260205f20905b81548152906001019060200180831161069957829003601f168201915b5050505050905090565b5f5f6106ca61092d565b90506106d78185856109d9565b600191505092915050565b8342111561072757836040517f6279130200000000000000000000000000000000000000000000000000000000815260040161071e9190611931565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886107558c610e83565b8960405160200161076b96959493929190611da9565b6040516020818303038152906040528051906020012090505f61078d82610ed6565b90505f61079c82878787610eef565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461081057808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610807929190611e08565b60405180910390fd5b61081b8a8a8a610934565b50505050505050505050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6108b1610b7f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610921575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016109189190611bd7565b60405180910390fd5b61092a81610d04565b50565b5f33905090565b6109418383836001610f1d565b505050565b5f6109518484610827565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156109d357818110156109c4578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016109bb93929190611e2f565b60405180910390fd5b6109d284848484035f610f1d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a49575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610a409190611bd7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ab9575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610ab09190611bd7565b60405180910390fd5b610ac48383836110ec565b505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16148015610b4457507f000000000000000000000000000000000000000000000000000000000000000046145b15610b71577f00000000000000000000000000000000000000000000000000000000000000009050610b7c565b610b79611305565b90505b90565b610b8761092d565b73ffffffffffffffffffffffffffffffffffffffff16610ba5610608565b73ffffffffffffffffffffffffffffffffffffffff1614610c0457610bc861092d565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610bfb9190611bd7565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c76575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610c6d9190611bd7565b60405180910390fd5b610c815f83836110ec565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cf5575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610cec9190611bd7565b60405180910390fd5b610d00825f836110ec565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060610e4360067f000000000000000000000000000000000000000000000000000000000000000061139a90919063ffffffff16565b905090565b6060610e7e60077f000000000000000000000000000000000000000000000000000000000000000061139a90919063ffffffff16565b905090565b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f610ee8610ee2610ac9565b83611447565b9050919050565b5f5f5f5f610eff88888888611487565b925092509250610f0f828261156e565b829350505050949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610f8d575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610f849190611bd7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610ffd575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610ff49190611bd7565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156110e6578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110dd9190611931565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361113c578060025f8282546111309190611e91565b9250508190555061120a565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156111c5578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016111bc93929190611e2f565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611251578060025f828254039250508190555061129b565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112f89190611931565b60405180910390a3505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000463060405160200161137f959493929190611ec4565b60405160208183030381529060405280519060200120905090565b606060ff5f1b83146113b6576113af836116d0565b9050611441565b8180546113c290611d4c565b80601f01602080910402602001604051908101604052809291908181526020018280546113ee90611d4c565b80156114395780601f1061141057610100808354040283529160200191611439565b820191905f5260205f20905b81548152906001019060200180831161141c57829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f5f5f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c11156114c3575f600385925092509250611564565b5f6001888888886040515f81526020016040526040516114e69493929190611f15565b6020604051602081039080840390855afa158015611506573d5f5f3e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611557575f60015f5f1b93509350935050611564565b805f5f5f1b935093509350505b9450945094915050565b5f600381111561158157611580611f58565b5b82600381111561159457611593611f58565b5b03156116cc57600160038111156115ae576115ad611f58565b5b8260038111156115c1576115c0611f58565b5b036115f8576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561160c5761160b611f58565b5b82600381111561161f5761161e611f58565b5b0361166357805f1c6040517ffce698f700000000000000000000000000000000000000000000000000000000815260040161165a9190611931565b60405180910390fd5b60038081111561167657611675611f58565b5b82600381111561168957611688611f58565b5b036116cb57806040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004016116c291906119e6565b60405180910390fd5b5b5050565b60605f6116dc83611742565b90505f602067ffffffffffffffff8111156116fa576116f9611d7c565b5b6040519080825280601f01601f19166020018201604052801561172c5781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f5f60ff835f1c169050601f811115611787576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6117d282611790565b6117dc818561179a565b93506117ec8185602086016117aa565b6117f5816117b8565b840191505092915050565b5f6020820190508181035f83015261181881846117c8565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61184d82611824565b9050919050565b61185d81611843565b8114611867575f5ffd5b50565b5f8135905061187881611854565b92915050565b5f819050919050565b6118908161187e565b811461189a575f5ffd5b50565b5f813590506118ab81611887565b92915050565b5f5f604083850312156118c7576118c6611820565b5b5f6118d48582860161186a565b92505060206118e58582860161189d565b9150509250929050565b5f8115159050919050565b611903816118ef565b82525050565b5f60208201905061191c5f8301846118fa565b92915050565b61192b8161187e565b82525050565b5f6020820190506119445f830184611922565b92915050565b5f5f5f6060848603121561196157611960611820565b5b5f61196e8682870161186a565b935050602061197f8682870161186a565b92505060406119908682870161189d565b9150509250925092565b5f60ff82169050919050565b6119af8161199a565b82525050565b5f6020820190506119c85f8301846119a6565b92915050565b5f819050919050565b6119e0816119ce565b82525050565b5f6020820190506119f95f8301846119d7565b92915050565b5f60208284031215611a1457611a13611820565b5b5f611a218482850161189d565b91505092915050565b5f60208284031215611a3f57611a3e611820565b5b5f611a4c8482850161186a565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611a8981611a55565b82525050565b611a9881611843565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b611ad08161187e565b82525050565b5f611ae18383611ac7565b60208301905092915050565b5f602082019050919050565b5f611b0382611a9e565b611b0d8185611aa8565b9350611b1883611ab8565b805f5b83811015611b48578151611b2f8882611ad6565b9750611b3a83611aed565b925050600181019050611b1b565b5085935050505092915050565b5f60e082019050611b685f83018a611a80565b8181036020830152611b7a81896117c8565b90508181036040830152611b8e81886117c8565b9050611b9d6060830187611922565b611baa6080830186611a8f565b611bb760a08301856119d7565b81810360c0830152611bc98184611af9565b905098975050505050505050565b5f602082019050611bea5f830184611a8f565b92915050565b611bf98161199a565b8114611c03575f5ffd5b50565b5f81359050611c1481611bf0565b92915050565b611c23816119ce565b8114611c2d575f5ffd5b50565b5f81359050611c3e81611c1a565b92915050565b5f5f5f5f5f5f5f60e0888a031215611c5f57611c5e611820565b5b5f611c6c8a828b0161186a565b9750506020611c7d8a828b0161186a565b9650506040611c8e8a828b0161189d565b9550506060611c9f8a828b0161189d565b9450506080611cb08a828b01611c06565b93505060a0611cc18a828b01611c30565b92505060c0611cd28a828b01611c30565b91505092959891949750929550565b5f5f60408385031215611cf757611cf6611820565b5b5f611d048582860161186a565b9250506020611d158582860161186a565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611d6357607f821691505b602082108103611d7657611d75611d1f565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60c082019050611dbc5f8301896119d7565b611dc96020830188611a8f565b611dd66040830187611a8f565b611de36060830186611922565b611df06080830185611922565b611dfd60a0830184611922565b979650505050505050565b5f604082019050611e1b5f830185611a8f565b611e286020830184611a8f565b9392505050565b5f606082019050611e425f830186611a8f565b611e4f6020830185611922565b611e5c6040830184611922565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611e9b8261187e565b9150611ea68361187e565b9250828201905080821115611ebe57611ebd611e64565b5b92915050565b5f60a082019050611ed75f8301886119d7565b611ee460208301876119d7565b611ef160408301866119d7565b611efe6060830185611922565b611f0b6080830184611a8f565b9695505050505050565b5f608082019050611f285f8301876119d7565b611f3560208301866119a6565b611f4260408301856119d7565b611f4f60608301846119d7565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea264697066735822122022147f2aa0b554972f1a5a5dad3ea8c6eaa9e7a615d0f741dae6fd59deb6e8f664736f6c634300081e0033" /* -* cd ./solidity/lib/punch-swap-v3-contracts -* forge inspect src/core/PunchSwapV3Factory.sol bytecode -*/ + * cd ./solidity/lib/punch-swap-v3-contracts + * forge inspect src/core/PunchSwapV3Factory.sol bytecode + */ access(all) let punchswapV3FactoryBytecode = "60a060405234801561001057600080fd5b506040516160db3803806160db8339818101604052602081101561003357600080fd5b50513060601b6080526001600160a01b038116610097576040805162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e6e6f74206265207a65726f206164647265737300000000604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040516000907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908290a36101f4600081815260046020527ffb8cf1d12598d1a039dd1d106665851a96aadf67d0d9ed76fceea282119208b7805462ffffff1916600a9081179091556040519092916000805160206160bb83398151915291a3610bb8600081815260046020527f72dffa9b822156d9cf4b0090fa0b656bcb9cc2b2c60eb6acfc20a34f54b31743805462ffffff1916603c9081179091556040519092916000805160206160bb83398151915291a3612710600081815260046020527f8cc740d51daa94ff54f33bd779c2d20149f524c340519b49181be5a08615f829805462ffffff191660c89081179091556040519092916000805160206160bb83398151915291a35060805160601c615ebe6101fd600039806106365250615ebe6000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c806313af4035146100725780631698ee821461009a57806322afcccb146100f2578063890357301461012b5780638a7c195f146101755780638da5cb5b146101a0578063a1671295146101a8575b600080fd5b6100986004803603602081101561008857600080fd5b50356001600160a01b03166101e4565b005b6100d6600480360360608110156100b057600080fd5b5080356001600160a01b03908116916020810135909116906040013562ffffff16610257565b604080516001600160a01b039092168252519081900360200190f35b6101146004803603602081101561010857600080fd5b503562ffffff16610283565b6040805160029290920b8252519081900360200190f35b610133610298565b604080516001600160a01b0396871681529486166020860152929094168383015262ffffff16606083015260029290920b608082015290519081900360a00190f35b6100986004803603604081101561018b57600080fd5b5062ffffff813516906020013560020b6102ce565b6100d6610486565b6100d6600480360360608110156101be57600080fd5b5080356001600160a01b03908116916020810135909116906040013562ffffff16610495565b6003546001600160a01b031633146101fb57600080fd5b6003546040516001600160a01b038084169216907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b60056020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b60046020526000908152604090205460020b81565b600054600154600280546001600160a01b03938416939283169281169162ffffff600160a01b83041691600160b81b9004900b85565b6003546001600160a01b0316331461031a576040805162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b604482015290519081900360640190fd5b620f42408262ffffff1610610368576040805162461bcd60e51b815260206004820152600f60248201526e08ccaca40caf0c6cacac8e640dac2f608b1b604482015290519081900360640190fd5b60008160020b13801561037f57506140008160020b125b6103d0576040805162461bcd60e51b815260206004820181905260248201527f5469636b2073706163696e67207a65726f206f722065786365656473206d6178604482015290519081900360640190fd5b62ffffff8216600090815260046020526040902054600290810b900b15610434576040805162461bcd60e51b815260206004820152601360248201527211995948185b1c9958591e48195b98589b1959606a1b604482015290519081900360640190fd5b62ffffff828116600081815260046020526040808220805462ffffff1916600287900b958616179055517fc66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc9190a35050565b6003546001600160a01b031681565b600061049f61062b565b826001600160a01b0316846001600160a01b031614156104be57600080fd5b600080846001600160a01b0316866001600160a01b0316106104e15784866104e4565b85855b90925090506001600160a01b0382166104fc57600080fd5b62ffffff8416600090815260046020526040902054600290810b9081900b61052357600080fd5b6001600160a01b0383811660009081526005602090815260408083208685168452825280832062ffffff8a168452909152902054161561056257600080fd5b61056f3084848885610662565b6001600160a01b03808516600081815260056020818152604080842089871680865290835281852062ffffff8e168087529084528286208054988a166001600160a01b0319998a1681179091558287529484528286208787528452828620818752845294829020805490971684179096558051600289900b815291820192909252815195995091947f783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b71189281900390910190a45050509392505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461066057600080fd5b565b6040805160a0810182526001600160a01b03878116808352878216602080850182905292881684860181905262ffffff888116606080880182905260028a810b6080998a01819052600080546001600160a01b03199081169099178155600180548a16891790558254909816861762ffffff60a01b1916600160a01b85021762ffffff60b81b1916600160b81b91830b909516029390931790925587518087019490945283880192909252828101919091528551808303909101815293019384905282519290910191909120909161073990610790565b8190604051809103906000f5905080158015610759573d6000803e3d6000fd5b50600080546001600160a01b0319908116909155600180549091169055600280546001600160d01b03191690559695505050505050565b6156eb8061079e8339019056fe6101606040523480156200001257600080fd5b503060601b60805260408051630890357360e41b81529051600091339163890357309160048082019260a092909190829003018186803b1580156200005657600080fd5b505afa1580156200006b573d6000803e3d6000fd5b505050506040513d60a08110156200008257600080fd5b508051602080830151604084015160608086015160809096015160e896871b6001600160e81b0319166101005291811b6001600160601b031990811660e05292811b831660c0529390931b1660a052600282810b900b90921b610120529150620000f79082906200010f811b62002a8b17901c565b60801b6001600160801b03191661014052506200017d565b60008082600281900b620d89e719816200012557fe5b05029050600083600281900b620d89e8816200013d57fe5b0502905060008460020b83830360020b816200015557fe5b0560010190508062ffffff166001600160801b038016816200017357fe5b0495945050505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005160e81c6101205160e81c6101405160801c6154a16200024a60003980611f5b52806149a052806149d7525080610b8852806128475280614a0b5280614a3d525080610c775280611938528061196f528061288f52508061113552806119f25280611e615280612396528061286b5280613cdc52508061085a528061126352806119c15280611dfb52806123105280613b93525080611fe852806121cf5280612823525080612b0252506154a16000f3fe608060405234801561001057600080fd5b506004361061013e5760003560e01c80630dfe168114610143578063128acb08146101675780631a686502146102145780631ad8b03b14610238578063252c09d71461026f57806332148f67146102c65780633850c7bd146102e95780633c8a7d8d1461034257806346141319146103e2578063490e6cbc146103fc5780634f1eb3d814610486578063514ea4bf146104d75780635339c2961461053057806370cf754a146105505780638206a4d11461055857806385b6672914610580578063883bdbfd146105bd578063a34123a7146106c4578063a38807f2146106fe578063c45a015514610759578063d0c93a7c14610761578063d21220a714610780578063ddca3f4314610788578063f3058399146107a8578063f30dba93146107b0578063f637731d14610832575b600080fd5b61014b610858565b604080516001600160a01b039092168252519081900360200190f35b6101fb600480360360a081101561017d57600080fd5b6001600160a01b0382358116926020810135151592604082013592606083013516919081019060a081016080820135600160201b8111156101bd57600080fd5b8201836020820111156101cf57600080fd5b803590602001918460018302840111600160201b831117156101f057600080fd5b50909250905061087c565b6040805192835260208301919091528051918290030190f35b61021c61141b565b604080516001600160801b039092168252519081900360200190f35b61024061142a565b60405180836001600160801b03168152602001826001600160801b031681526020019250505060405180910390f35b61028c6004803603602081101561028557600080fd5b5035611444565b6040805163ffffffff909516855260069390930b60208501526001600160a01b039091168383015215156060830152519081900360800190f35b6102e7600480360360208110156102dc57600080fd5b503561ffff16611489565b005b6102f1611583565b604080516001600160a01b03909816885260029690960b602088015261ffff9485168787015292841660608701529216608085015260ff90911660a0840152151560c0830152519081900360e00190f35b6101fb600480360360a081101561035857600080fd5b6001600160a01b03823516916020810135600290810b92604083013590910b916001600160801b036060820135169181019060a081016080820135600160201b8111156103a457600080fd5b8201836020820111156103b657600080fd5b803590602001918460018302840111600160201b831117156103d757600080fd5b5090925090506115d3565b6103ea61188f565b60408051918252519081900360200190f35b6102e76004803603608081101561041257600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135600160201b81111561044857600080fd5b82018360208201111561045a57600080fd5b803590602001918460018302840111600160201b8311171561047b57600080fd5b509092509050611895565b610240600480360360a081101561049c57600080fd5b506001600160a01b03813516906020810135600290810b91604081013590910b906001600160801b0360608201358116916080013516611cf0565b6104f4600480360360208110156104ed57600080fd5b5035611f0a565b604080516001600160801b0396871681526020810195909552848101939093529084166060840152909216608082015290519081900360a00190f35b6103ea6004803603602081101561054657600080fd5b503560010b611f47565b61021c611f59565b6102e76004803603604081101561056e57600080fd5b5060ff81358116916020013516611f7d565b6102406004803603606081101561059657600080fd5b506001600160a01b03813516906001600160801b0360208201358116916040013516612161565b61062b600480360360208110156105d357600080fd5b810190602081018135600160201b8111156105ed57600080fd5b8201836020820111156105ff57600080fd5b803590602001918460208302840111600160201b8311171561062057600080fd5b50909250905061242e565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561066f578181015183820152602001610657565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156106ae578181015183820152602001610696565b5050505090500194505050505060405180910390f35b6101fb600480360360608110156106da57600080fd5b508035600290810b91602081013590910b90604001356001600160801b03166124bb565b6107286004803603604081101561071457600080fd5b508035600290810b9160200135900b612632565b6040805160069490940b84526001600160a01b03909216602084015263ffffffff1682820152519081900360600190f35b61014b612821565b610769612845565b6040805160029290920b8252519081900360200190f35b61014b612869565b61079061288d565b6040805162ffffff9092168252519081900360200190f35b6103ea6128b1565b6107d0600480360360208110156107c657600080fd5b503560020b6128b7565b604080516001600160801b039099168952600f9790970b602089015287870195909552606087019390935260069190910b60808601526001600160a01b031660a085015263ffffffff1660c0840152151560e083015251908190036101000190f35b6102e76004803603602081101561084857600080fd5b50356001600160a01b0316612921565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610887612af7565b856108be576040805162461bcd60e51b8152602060048201526002602482015261415360f01b604482015290519081900360640190fd5b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602083015261ffff600160b81b8204811693830193909352600160c81b810483166060830152600160d81b8104909216608082015260ff600160e81b8304811660a0830152600160f01b909204909116151560c08201819052610977576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b876109c25780600001516001600160a01b0316866001600160a01b03161180156109bd575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038716105b6109f4565b80600001516001600160a01b0316866001600160a01b03161080156109f457506401000276a36001600160a01b038716115b610a2b576040805162461bcd60e51b815260206004820152600360248201526214d41360ea1b604482015290519081900360640190fd5b6000805460ff60f01b191681556040805160c08101909152808a610a5a5760048460a0015160ff16901c610a6d565b60108460a0015160ff1681610a6b57fe5b065b60ff1681526004546001600160801b03166020820152604001610a8e612b2e565b63ffffffff168152602001600060060b815260200160006001600160a01b031681526020016000151581525090506000808913905060006040518060e001604052808b81526020016000815260200185600001516001600160a01b03168152602001856020015160020b81526020018c610b0a57600254610b0e565b6001545b815260200160006001600160801b0316815260200184602001516001600160801b031681525090505b805115801590610b5d5750886001600160a01b031681604001516001600160a01b031614155b15610f2757610b6a615408565b60408201516001600160a01b031681526060820151610bad906006907f00000000000000000000000000000000000000000000000000000000000000008f612b32565b15156040830152600290810b810b60208301819052620d89e719910b1215610bde57620d89e7196020820152610bfd565b6020810151620d89e860029190910b1315610bfd57620d89e860208201525b610c0a8160200151612c74565b6001600160a01b031660608201526040820151610c9b908d610c44578b6001600160a01b031683606001516001600160a01b031611610c5e565b8b6001600160a01b031683606001516001600160a01b0316105b610c6c578260600151610c6e565b8b5b60c085015185517f0000000000000000000000000000000000000000000000000000000000000000612f9b565b60c085015260a084015260808301526001600160a01b031660408301528215610cfd57610cd18160c0015182608001510161318d565b825103825260a0810151610cf390610ce89061318d565b6020840151906131a3565b6020830152610d38565b610d0a8160a0015161318d565b825101825260c08101516080820151610d3291610d27910161318d565b6020840151906131bf565b60208301525b835160ff1615610d7e576000846000015160ff168260c0015181610d5857fe5b60c0840180519290910491829003905260a0840180519091016001600160801b03169052505b60c08201516001600160801b031615610dbd57610db18160c00151600160801b8460c001516001600160801b03166131d5565b60808301805190910190525b80606001516001600160a01b031682604001516001600160a01b03161415610ee657806040015115610ebd578360a00151610e4757610e25846040015160008760200151886040015188602001518a606001516008613285909695949392919063ffffffff16565b6001600160a01b03166080860152600690810b900b6060850152600160a08501525b6000610e9382602001518e610e5e57600154610e64565b84608001515b8f610e73578560800151610e77565b6002545b608089015160608a015160408b01516005959493929190613417565b90508c15610e9f576000035b610ead8360c00151826134d1565b6001600160801b031660c0840152505b8b610ecc578060200151610ed5565b60018160200151035b600290810b900b6060830152610f21565b80600001516001600160a01b031682604001516001600160a01b031614610f2157610f148260400151613587565b600290810b900b60608301525b50610b37565b836020015160020b816060015160020b14610ff557600080610f7586604001518660400151886020015188602001518a606001518b608001516008613872909695949392919063ffffffff16565b604085015160608601516000805461ffff60c81b1916600160c81b61ffff958616021761ffff60b81b1916600160b81b95909416949094029290921762ffffff60a01b1916600160a01b62ffffff60029490940b9390931692909202919091176001600160a01b0319166001600160a01b039091161790555061101a9050565b6040810151600080546001600160a01b0319166001600160a01b039092169190911790555b8060c001516001600160801b031683602001516001600160801b0316146110605760c0810151600480546001600160801b0319166001600160801b039092169190911790555b8a156110b057608081015160015560a08101516001600160801b0316156110ab5760a0810151600380546001600160801b031981166001600160801b03918216909301169190911790555b6110f6565b608081015160025560a08101516001600160801b0316156110f65760a0810151600380546001600160801b03808216600160801b92839004821690940116029190911790555b8115158b15151461110f57602081015181518b0361111c565b80600001518a0381602001515b90965094508a1561125557600085121561115e5761115e7f00000000000000000000000000000000000000000000000000000000000000008d876000036139f7565b6000611168613b45565b9050336001600160a01b0316637ee355e688888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b5050505061120c613b45565b6112168289613c7e565b111561124f576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b5061137f565b600086121561128c5761128c7f00000000000000000000000000000000000000000000000000000000000000008d886000036139f7565b6000611296613c8e565b9050336001600160a01b0316637ee355e688888c8c6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561131a57600080fd5b505af115801561132e573d6000803e3d6000fd5b5050505061133a613c8e565b6113448288613c7e565b111561137d576040805162461bcd60e51b815260206004820152600360248201526249494160e81b604482015290519081900360640190fd5b505b60408082015160c083015160608085015184518b8152602081018b90526001600160a01b03948516818701526001600160801b039093169183019190915260020b60808201529151908e169133917fc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca679181900360a00190a350506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b6004546001600160801b031681565b6003546001600160801b0380821691600160801b90041682565b60088161ffff811061145557600080fd5b015463ffffffff81169150600160201b810460060b90600160581b81046001600160a01b031690600160f81b900460ff1684565b600054600160f01b900460ff166114cd576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556114e2612af7565b60008054600160d81b900461ffff16906114fe60088385613d26565b6000805461ffff808416600160d81b810261ffff60d81b199093169290921790925591925083161461156b576040805161ffff80851682528316602082015281517fac49e518f90a358f652e4400164f05a5d8f7e35e7747279bc3a93dbf584e125a929181900390910190a15b50506000805460ff60f01b1916600160f01b17905550565b6000546001600160a01b03811690600160a01b810460020b9061ffff600160b81b8204811691600160c81b8104821691600160d81b8204169060ff600160e81b8204811691600160f01b90041687565b600080548190600160f01b900460ff1661161a576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556001600160801b03851661163a57600080fd5b60008061168860405180608001604052808c6001600160a01b031681526020018b60020b81526020018a60020b815260200161167e8a6001600160801b0316613dc9565b600f0b9052613dda565b925092505081935080925060008060008611156116aa576116a7613b45565b91505b84156116bb576116b8613c8e565b90505b336001600160a01b031663ffc2b15687878b8b6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b15801561173d57600080fd5b505af1158015611751573d6000803e3d6000fd5b5050505060008611156117a857611766613b45565b6117708388613c7e565b11156117a8576040805162461bcd60e51b815260206004820152600260248201526104d360f41b604482015290519081900360640190fd5b84156117f8576117b6613c8e565b6117c08287613c7e565b11156117f8576040805162461bcd60e51b81526020600482015260026024820152614d3160f01b604482015290519081900360640190fd5b8960020b8b60020b8d6001600160a01b03167f7a53080ba414158be7ec69b987b5fb7d07dee101fe85488f0853ae16239d0bde338d8b8b60405180856001600160a01b03168152602001846001600160801b0316815260200183815260200182815260200194505050505060405180910390a450506000805460ff60f01b1916600160f01b17905550919890975095505050505050565b60025481565b600054600160f01b900460ff166118d9576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b191690556118ee612af7565b6004546001600160801b031680611930576040805162461bcd60e51b81526020600482015260016024820152601360fa1b604482015290519081900360640190fd5b6000611965867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f424061401a565b9050600061199c867f000000000000000000000000000000000000000000000000000000000000000062ffffff16620f424061401a565b905060006119a8613b45565b905060006119b4613c8e565b905088156119e7576119e77f00000000000000000000000000000000000000000000000000000000000000008b8b6139f7565b8715611a1857611a187f00000000000000000000000000000000000000000000000000000000000000008b8a6139f7565b336001600160a01b031663855d527885858a8a6040518563ffffffff1660e01b815260040180858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f82011690508083019250505095505050505050600060405180830381600087803b158015611a9a57600080fd5b505af1158015611aae573d6000803e3d6000fd5b505050506000611abc613b45565b90506000611ac8613c8e565b905081611ad58588613c7e565b1115611b0d576040805162461bcd60e51b8152602060048201526002602482015261046360f41b604482015290519081900360640190fd5b80611b188487613c7e565b1115611b50576040805162461bcd60e51b8152602060048201526002602482015261463160f01b604482015290519081900360640190fd5b8382038382038115611bdf5760008054600160e81b9004600f16908115611b83578160ff168481611b7d57fe5b04611b86565b60005b90506001600160801b03811615611bb957600380546001600160801b038082168401166001600160801b03199091161790555b611bd3818503600160801b8d6001600160801b03166131d5565b60018054909101905550505b8015611c6a5760008054600160e81b900460041c600f16908115611c0f578160ff168381611c0957fe5b04611c12565b60005b90506001600160801b03811615611c4457600380546001600160801b03600160801b8083048216850182160291161790555b611c5e818403600160801b8d6001600160801b03166131d5565b60028054909101905550505b8d6001600160a01b0316336001600160a01b03167fbdbdb71d7860376ba52b25a5028beea23581364a40522f6bcfb86bb1f2dca6338f8f86866040518085815260200184815260200183815260200182815260200194505050505060405180910390a350506000805460ff60f01b1916600160f01b179055505050505050505050505050565b600080548190600160f01b900460ff16611d37576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b19168155611d516007338989614054565b60038101549091506001600160801b0390811690861611611d725784611d81565b60038101546001600160801b03165b60038201549093506001600160801b03600160801b909104811690851611611da95783611dbf565b6003810154600160801b90046001600160801b03165b91506001600160801b03831615611e24576003810180546001600160801b031981166001600160801b03918216869003821617909155611e24907f0000000000000000000000000000000000000000000000000000000000000000908a9086166139f7565b6001600160801b03821615611e8a576003810180546001600160801b03600160801b808304821686900382160291811691909117909155611e8a907f0000000000000000000000000000000000000000000000000000000000000000908a9085166139f7565b604080516001600160a01b038a1681526001600160801b0380861660208301528416818301529051600288810b92908a900b9133917f70935338e69775456a85ddef226c395fb668b63fa0115f5f20610b388e6ca9c0919081900360600190a4506000805460ff60f01b1916600160f01b17905590969095509350505050565b60076020526000908152604090208054600182015460028301546003909301546001600160801b0392831693919281811691600160801b90041685565b60066020526000908152604090205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600054600160f01b900460ff16611fc1576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b916004808301926020929190829003018186803b15801561202e57600080fd5b505afa158015612042573d6000803e3d6000fd5b505050506040513d602081101561205857600080fd5b50516001600160a01b0316331461206e57600080fd5b60ff82161580612091575060048260ff16101580156120915750600a8260ff1611155b80156120bb575060ff811615806120bb575060048160ff16101580156120bb5750600a8160ff1611155b6120c457600080fd5b60008054610ff0600484901b16840160ff908116600160e81b90810260ff60e81b19841617909355919004167f973d8d92bb299f4af6ce49b52a8adb85ae46b9f214c4c4fc06ac77401237b1336010826040805160ff9390920683168252600f600486901c16602083015286831682820152918516606082015290519081900360800190a150506000805460ff60f01b1916600160f01b17905550565b600080548190600160f01b900460ff166121a8576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916905560408051638da5cb5b60e01b815290516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691638da5cb5b916004808301926020929190829003018186803b15801561221557600080fd5b505afa158015612229573d6000803e3d6000fd5b505050506040513d602081101561223f57600080fd5b50516001600160a01b0316331461225557600080fd5b6003546001600160801b0390811690851611612271578361227e565b6003546001600160801b03165b6003549092506001600160801b03600160801b9091048116908416116122a457826122b8565b600354600160801b90046001600160801b03165b90506001600160801b03821615612339576003546001600160801b03838116911614156122e757600019909101905b600380546001600160801b031981166001600160801b03918216859003821617909155612339907f000000000000000000000000000000000000000000000000000000000000000090879085166139f7565b6001600160801b038116156123bf576003546001600160801b03828116600160801b90920416141561236a57600019015b600380546001600160801b03600160801b8083048216859003821602918116919091179091556123bf907f000000000000000000000000000000000000000000000000000000000000000090879084166139f7565b604080516001600160801b0380851682528316602082015281516001600160a01b0388169233927f596b573906218d3411850b26a6b437d6c4522fdb43d2d2386263f86d50b8b151929081900390910190a36000805460ff60f01b1916600160f01b1790559094909350915050565b606080612439612af7565b6124b0612444612b2e565b858580806020026020016040519081016040528093929190818152602001838360200280828437600092018290525054600454600896959450600160a01b820460020b935061ffff600160b81b8304811693506001600160801b0390911691600160c81b9004166140b3565b915091509250929050565b600080548190600160f01b900460ff16612502576040805162461bcd60e51b81526020600482015260036024820152624c4f4b60e81b604482015290519081900360640190fd5b6000805460ff60f01b1916815560408051608081018252338152600288810b602083015287900b918101919091528190819061255b906060810161254e6001600160801b038a16613dc9565b600003600f0b9052613dda565b925092509250816000039450806000039350600085118061257c5750600084115b156125bb576003830180546001600160801b038082168089018216600160801b93849004831689019092169092029091176001600160801b0319161790555b604080516001600160801b0388168152602081018790528082018690529051600289810b92908b900b9133917f0c396cd989a39f4459b5fa1aed6a9a8dcdbc45908acfd67e028cd568da98982c919081900360600190a450506000805460ff60f01b1916600160f01b179055509094909350915050565b600080600061263f612af7565b612649858561420b565b600285810b810b60009081526005602052604080822087840b90930b825281206003830154600681900b93600160381b82046001600160a01b0316928492600160d81b810463ffffffff169284929091600160f81b900460ff16806126ad57600080fd5b6003820154600681900b9850600160381b81046001600160a01b03169650600160d81b810463ffffffff169450600160f81b900460ff16806126ee57600080fd5b50506040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b810b6020840181905261ffff600160b81b8404811695850195909552600160c81b830485166060850152600160d81b8304909416608084015260ff600160e81b8304811660a0850152600160f01b909204909116151560c08301529093508e810b91900b121590506127975750939094039650900393509003905061281a565b8a60020b816020015160020b121561280b5760006127b3612b2e565b60208301516040840151600454606086015193945060009384936127e9936008938893879392916001600160801b031690613285565b9a9003989098039b50509490960392909203965090910303925061281a915050565b50949093039650039350900390505b9250925092565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015481565b60056020526000908152604090208054600182015460028301546003909301546001600160801b03831693600160801b909304600f0b9290600681900b90600160381b81046001600160a01b031690600160d81b810463ffffffff1690600160f81b900460ff1688565b6000546001600160a01b031615612964576040805162461bcd60e51b8152602060048201526002602482015261414960f01b604482015290519081900360640190fd5b600061296f82613587565b905060008061298761297f612b2e565b6008906142d4565b6040805160e0810182526001600160a01b038816808252600288810b6020808501829052600085870181905261ffff898116606088018190529089166080880181905260a08801839052600160c0909801979097528154600160f01b6001600160a01b0319909116871762ffffff60a01b1916600160a01b62ffffff9787900b97909716969096029590951763ffffffff60b81b1916600160c81b9091021761ffff60d81b1916600160d81b9096029590951761ffff60e81b191692909217909355835191825281019190915281519395509193507f98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c9592918290030190a150505050565b60008082600281900b620d89e71981612aa057fe5b05029050600083600281900b620d89e881612ab757fe5b0502905060008460020b83830360020b81612ace57fe5b0560010190508062ffffff166001600160801b03801681612aeb57fe5b0493505050505b919050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612b2c57600080fd5b565b4290565b60008060008460020b8660020b81612b4657fe5b05905060008660020b128015612b6d57508460020b8660020b81612b6657fe5b0760020b15155b15612b7757600019015b8315612bec57600080612b8983614320565b600182810b810b600090815260208d9052604090205460ff83169190911b80016000190190811680151597509294509092509085612bce57888360ff16860302612be1565b88612bd882614332565b840360ff168603025b965050505050612c6a565b600080612bfb83600101614320565b91509150600060018260ff166001901b031990506000818b60008660010b60010b8152602001908152602001600020541690508060001415955085612c4d57888360ff0360ff16866001010102612c63565b8883612c58836143cc565b0360ff168660010101025b9650505050505b5094509492505050565b60008060008360020b12612c8b578260020b612c93565b8260020b6000035b9050620d89e8811115612cd1576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216612ce557600160801b612cf7565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b031690506002821615612d21576ffff97272373d413259a46990580e213a0260801c5b6004821615612d40576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612d5f576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612d7e576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612d9d576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612dbc576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612ddb576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612dfb576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612e1b576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612e3b576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612e5b576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612e7b576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612e9b576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612ebb576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612edb576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612efc576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612f1c576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612f3b576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612f58576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612f73578060001981612f6f57fe5b0490505b600160201b810615612f86576001612f89565b60005b60ff16602082901c0192505050919050565b60008080806001600160a01b03808916908a161015818712801590613020576000612fd48989620f42400362ffffff16620f42406131d5565b905082612fed57612fe88c8c8c60016144b5565b612ffa565b612ffa8b8d8c6001614530565b955085811061300b578a965061301a565b6130178c8b83866145db565b96505b5061306a565b81613037576130328b8b8b6000614530565b613044565b6130448a8c8b60006144b5565b93508388600003106130585789955061306a565b6130678b8a8a60000385614627565b95505b6001600160a01b038a81169087161482156130cd578080156130895750815b61309f5761309a878d8c6001614530565b6130a1565b855b95508080156130ae575081155b6130c4576130bf878d8c60006144b5565b6130c6565b845b9450613117565b8080156130d75750815b6130ed576130e88c888c60016144b5565b6130ef565b855b95508080156130fc575081155b6131125761310d8c888c6000614530565b613114565b845b94505b8115801561312757508860000385115b15613133578860000394505b81801561315257508a6001600160a01b0316876001600160a01b031614155b1561316157858903935061317e565b61317b868962ffffff168a620f42400362ffffff1661401a565b93505b50505095509550955095915050565b6000600160ff1b821061319f57600080fd5b5090565b808203828113156000831215146131b957600080fd5b92915050565b818101828112156000831215146131b957600080fd5b600080806000198587098686029250828110908390030390508061320b576000841161320057600080fd5b50829004905061327e565b80841161321757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b60008063ffffffff871661332b576000898661ffff1661ffff81106132a657fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff16151560608301529092508a161461331757613314818a8988614673565b90505b80602001518160400151925092505061340b565b8688036000806133408c8c858c8c8c8c614716565b91509150816000015163ffffffff168363ffffffff16141561337257816020015182604001519450945050505061340b565b805163ffffffff8481169116141561339a57806020015181604001519450945050505061340b565b8151815160208085015190840151918390039286039163ffffffff80841692908516910360060b816133c857fe5b05028460200151018263ffffffff168263ffffffff1686604001518660400151036001600160a01b031602816133fa57fe5b048560400151019650965050505050505b97509795505050505050565b600295860b860b60009081526020979097526040909620600181018054909503909455938301805490920390915560038201805463ffffffff600160d81b6001600160a01b03600160381b808504821690960316909402600160381b600160d81b031990921691909117600681810b90960390950b66ffffffffffffff1666ffffffffffffff199095169490941782810485169095039093160263ffffffff60d81b1990931692909217905554600160801b9004600f0b90565b60008082600f0b121561353657826001600160801b03168260000384039150816001600160801b031610613531576040805162461bcd60e51b81526020600482015260026024820152614c5360f01b604482015290519081900360640190fd5b6131b9565b826001600160801b03168284019150816001600160801b031610156131b9576040805162461bcd60e51b81526020600482015260026024820152614c4160f01b604482015290519081900360640190fd5b60006401000276a36001600160a01b038316108015906135c3575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b6135f8576040805162461bcd60e51b81526020600482015260016024820152602960f91b604482015290519081900360640190fd5b600160201b600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061368a57607f810383901c9150613694565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c6001603f1b161760c19b909b1c6001603e1b169a909a1760c29990991c6001603d1b169890981760c39790971c6001603c1b169690961760c49590951c6001603b1b169490941760c59390931c6001603a1b169290921760c69190911c600160391b161760c79190911c600160381b161760c89190911c600160371b161760c99190911c600160361b161760ca9190911c600160351b161760cb9190911c600160341b161760cc9190911c600160331b161760cd9190911c600160321b1617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1461386357886001600160a01b031661384782612c74565b6001600160a01b0316111561385c578161385e565b805b613865565b815b9998505050505050505050565b6000806000898961ffff1661ffff811061388857fe5b60408051608081018252919092015463ffffffff808216808452600160201b8304600690810b810b900b6020850152600160581b83046001600160a01b031694840194909452600160f81b90910460ff1615156060830152909250891614156138f7578885925092505061340b565b8461ffff168461ffff1611801561391857506001850361ffff168961ffff16145b1561392557839150613929565b8491505b8161ffff168960010161ffff168161393d57fe5b06925061394c81898989614673565b8a8461ffff1661ffff811061395d57fe5b825191018054602084015160408501516060909501511515600160f81b026001600160f81b036001600160a01b03909616600160581b02600160581b600160f81b031960069390930b66ffffffffffffff16600160201b0266ffffffffffffff60201b1963ffffffff90971663ffffffff199095169490941795909516929092171692909217929092161790555097509795505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310613a735780518252601f199092019160209182019101613a54565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613ad5576040519150601f19603f3d011682016040523d82523d6000602084013e613ada565b606091505b5091509150818015613b08575080511580613b085750808060200190516020811015613b0557600080fd5b50515b613b3e576040805162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015290519081900360640190fd5b5050505050565b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001693919290918291908083835b60208310613bde5780518252601f199092019160209182019101613bbf565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114613c3e576040519150601f19603f3d011682016040523d82523d6000602084013e613c43565b606091505b5091509150818015613c5757506020815110155b613c6057600080fd5b808060200190516020811015613c7557600080fd5b50519250505090565b808201828110156131b957600080fd5b604080513060248083019190915282518083039091018152604490910182526020810180516001600160e01b03166370a0823160e01b17815291518151600093849384936001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016939192909182919080838360208310613bde5780518252601f199092019160209182019101613bbf565b6000808361ffff1611613d64576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b8261ffff168261ffff1611613d7a57508161327e565b825b8261ffff168161ffff161015613dc0576001858261ffff1661ffff8110613d9f57fe5b01805463ffffffff191663ffffffff92909216919091179055600101613d7c565b50909392505050565b80600f81900b8114612af257600080fd5b6000806000613de7612af7565b613df98460200151856040015161420b565b6040805160e0810182526000546001600160a01b0381168252600160a01b8104600290810b810b900b602080840182905261ffff600160b81b8404811685870152600160c81b84048116606080870191909152600160d81b8504909116608086015260ff600160e81b8504811660a0870152600160f01b909404909316151560c085015288519089015194890151928901519394613e9d9491939092909190614910565b93508460600151600f0b60001461401257846020015160020b816020015160020b1215613ef257613eeb613ed48660200151612c74565b613ee18760400151612c74565b8760600151614ac5565b9250614012565b846040015160020b816020015160020b1215613fe85760045460408201516001600160801b0390911690613f4490613f28612b2e565b6020850151606086015160808701516008949392918791613872565b6000805461ffff60c81b1916600160c81b61ffff938416021761ffff60b81b1916600160b81b939092169290920217905581516040870151613f949190613f8a90612c74565b8860600151614ac5565b9350613fb2613fa68760200151612c74565b83516060890151614b09565b9250613fc28187606001516134d1565b600480546001600160801b0319166001600160801b039290921691909117905550614012565b61400f613ff88660200151612c74565b6140058760400151612c74565b8760600151614b09565b91505b509193909250565b60006140278484846131d5565b90506000828061403357fe5b848609111561327e57600019811061404a57600080fd5b6001019392505050565b6040805160609490941b6001600160601b031916602080860191909152600293840b60e890811b60348701529290930b90911b60378401528051808403601a018152603a90930181528251928201929092206000908152929052902090565b60608060008361ffff16116140f3576040805162461bcd60e51b81526020600482015260016024820152604960f81b604482015290519081900360640190fd5b86516001600160401b038111801561410a57600080fd5b50604051908082528060200260200182016040528015614134578160200160208202803683370190505b50915086516001600160401b038111801561414e57600080fd5b50604051908082528060200260200182016040528015614178578160200160208202803683370190505b50905060005b87518110156141fe576141a98a8a8a848151811061419857fe5b60200260200101518a8a8a8a613285565b8483815181106141b557fe5b602002602001018484815181106141c857fe5b60200260200101826001600160a01b03166001600160a01b03168152508260060b60060b8152505050808060010191505061417e565b5097509795505050505050565b8060020b8260020b1261424b576040805162461bcd60e51b8152602060048201526003602482015262544c5560e81b604482015290519081900360640190fd5b620d89e719600283900b121561428e576040805162461bcd60e51b8152602060048201526003602482015262544c4d60e81b604482015290519081900360640190fd5b620d89e8600282900b13156142d0576040805162461bcd60e51b815260206004820152600360248201526254554d60e81b604482015290519081900360640190fd5b5050565b6040805160808101825263ffffffff9283168082526000602083018190529282019290925260016060909101819052835463ffffffff1916909117909116600160f81b17909155908190565b60020b600881901d9161010090910790565b600080821161434057600080fd5b600160801b821061435357608091821c91015b600160401b821061436657604091821c91015b600160201b821061437957602091821c91015b62010000821061438b57601091821c91015b610100821061439c57600891821c91015b601082106143ac57600491821c91015b600482106143bc57600291821c91015b60028210612af257600101919050565b60008082116143da57600080fd5b5060ff6001600160801b038216156143f557607f19016143fd565b608082901c91505b6001600160401b0382161561441557603f190161441d565b604082901c91505b63ffffffff82161561443257601f190161443a565b602082901c91505b61ffff82161561444d57600f1901614455565b601082901c91505b60ff821615614467576007190161446f565b600882901c91505b600f8216156144815760031901614489565b600482901c91505b600382161561449b57600119016144a3565b600282901c91505b6001821615612af25760001901919050565b6000836001600160a01b0316856001600160a01b031611156144d5579293925b81614502576144fd836001600160801b03168686036001600160a01b0316600160601b6131d5565b614525565b614525836001600160801b03168686036001600160a01b0316600160601b61401a565b90505b949350505050565b6000836001600160a01b0316856001600160a01b03161115614550579293925b600160601b600160e01b03606084901b166001600160a01b03868603811690871661457a57600080fd5b836145aa57866001600160a01b031661459d8383896001600160a01b03166131d5565b816145a457fe5b046145d0565b6145d06145c18383896001600160a01b031661401a565b886001600160a01b0316614b38565b979650505050505050565b600080856001600160a01b0316116145f257600080fd5b6000846001600160801b03161161460857600080fd5b8161461a576144fd8585856001614b43565b6145258585856001614c24565b600080856001600160a01b03161161463e57600080fd5b6000846001600160801b03161161465457600080fd5b81614666576144fd8585856000614c24565b6145258585856000614b43565b61467b615444565b600085600001518503905060405180608001604052808663ffffffff1681526020018263ffffffff168660020b0288602001510160060b81526020016000856001600160801b0316116146cf5760016146d1565b845b6001600160801b031663ffffffff60801b608085901b16816146ef57fe5b048860400151016001600160a01b0316815260200160011515815250915050949350505050565b61471e615444565b614726615444565b888561ffff1661ffff811061473757fe5b60408051608081018252919092015463ffffffff8116808352600160201b8204600690810b810b900b6020840152600160581b82046001600160a01b031693830193909352600160f81b900460ff1615156060820152925061479b90899089614d07565b156147d3578663ffffffff16826000015163ffffffff1614156147bd5761340b565b816147ca83898988614673565b9150915061340b565b888361ffff168660010161ffff16816147e857fe5b0661ffff1661ffff81106147f857fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b909104161515606082018190529092506148ad57604080516080810182528a5463ffffffff81168252600160201b8104600690810b810b900b6020830152600160581b81046001600160a01b031692820192909252600160f81b90910460ff161515606082015291505b6148bc88836000015189614d07565b6148f3576040805162461bcd60e51b815260206004820152600360248201526213d31160ea1b604482015290519081900360640190fd5b6149008989898887614dc8565b9150915097509795505050505050565b600061491f6007878787614054565b60015460025491925090600080600f87900b15614a65576000614940612b2e565b600080546004549293509091829161498a9160089186918591600160a01b810460020b9161ffff600160b81b83048116926001600160801b0390921691600160c81b900416613285565b90925090506149c460058d8b8d8b8b87898b60007f0000000000000000000000000000000000000000000000000000000000000000614f66565b94506149fb60058c8b8d8b8b87898b60017f0000000000000000000000000000000000000000000000000000000000000000614f66565b93508415614a2f57614a2f60068d7f000000000000000000000000000000000000000000000000000000000000000061511f565b8315614a6157614a6160068c7f000000000000000000000000000000000000000000000000000000000000000061511f565b5050505b600080614a7760058c8c8b8a8a615185565b9092509050614a88878a8484615231565b600089600f0b1215614ab6578315614aa557614aa560058c6153c6565b8215614ab657614ab660058b6153c6565b50505050505095945050505050565b60008082600f0b12614aeb57614ae6614ae18585856001614530565b61318d565b614528565b614afe614ae18585856000036000614530565b600003949350505050565b60008082600f0b12614b2557614ae6614ae185858560016144b5565b614afe614ae185858560000360006144b5565b808204910615150190565b60008115614bb65760006001600160a01b03841115614b7957614b7484600160601b876001600160801b03166131d5565b614b91565b6001600160801b038516606085901b81614b8f57fe5b045b9050614bae614ba96001600160a01b03881683613c7e565b6153f2565b915050614528565b60006001600160a01b03841115614be457614bdf84600160601b876001600160801b031661401a565b614bfb565b614bfb606085901b6001600160801b038716614b38565b905080866001600160a01b031611614c1257600080fd5b6001600160a01b038616039050614528565b600082614c32575083614528565b600160601b600160e01b03606085901b168215614cc0576001600160a01b03861684810290858281614c6057fe5b041415614c9157818101828110614c8f57614c8583896001600160a01b03168361401a565b9350505050614528565b505b614cb782614cb2878a6001600160a01b03168681614cab57fe5b0490613c7e565b614b38565b92505050614528565b6001600160a01b03861684810290858281614cd757fe5b04148015614ce457508082115b614ced57600080fd5b808203614c85614ba9846001600160a01b038b168461401a565b60008363ffffffff168363ffffffff1611158015614d3157508363ffffffff168263ffffffff1611155b15614d4d578163ffffffff168363ffffffff161115905061327e565b60008463ffffffff168463ffffffff1611614d74578363ffffffff16600160201b01614d7c565b8363ffffffff165b64ffffffffff16905060008563ffffffff168463ffffffff1611614dac578363ffffffff16600160201b01614db4565b8363ffffffff165b64ffffffffff169091111595945050505050565b614dd0615444565b614dd8615444565b60008361ffff168560010161ffff1681614dee57fe5b0661ffff169050600060018561ffff16830103905060005b506002818301048961ffff87168281614e1b57fe5b0661ffff8110614e2757fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201819052909550614e9157806001019250614e06565b898661ffff168260010181614ea257fe5b0661ffff8110614eae57fe5b60408051608081018252929091015463ffffffff81168352600160201b8104600690810b810b900b60208401526001600160a01b03600160581b8204169183019190915260ff600160f81b90910416151560608201528551909450600090614f18908b908b614d07565b9050808015614f315750614f318a8a8760000151614d07565b15614f3c5750614f59565b80614f4c57600182039250614f53565b8160010193505b50614e06565b5050509550959350505050565b60028a810b900b600090815260208c90526040812080546001600160801b031682614f91828d6134d1565b9050846001600160801b0316816001600160801b03161115614fdf576040805162461bcd60e51b81526020600482015260026024820152614c4f60f01b604482015290519081900360640190fd5b6001600160801b038281161590821615811415945015615084578c60020b8e60020b1361506c57600183018b9055600283018a9055600383018054600160381b600160d81b031916600160381b6001600160a01b038c16021766ffffffffffffff191666ffffffffffffff60068b900b161763ffffffff60d81b1916600160d81b63ffffffff8a16021790555b6003830180546001600160f81b0316600160f81b1790555b82546001600160801b0319166001600160801b038216178355856150cd5782546150c8906150c390600160801b9004600f90810b810b908f900b6131bf565b613dc9565b6150ee565b82546150ee906150c390600160801b9004600f90810b810b908f900b6131a3565b8354600f9190910b6001600160801b03908116600160801b0291161790925550909c9b505050505050505050505050565b8060020b8260020b8161512e57fe5b0760020b1561513c57600080fd5b6000806151578360020b8560020b8161515157fe5b05614320565b600191820b820b60009081526020979097526040909620805460ff9097169190911b90951890945550505050565b600285810b80820b60009081526020899052604080822088850b850b83529082209193849391929184918291908a900b126151cb575050600182015460028301546151de565b8360010154880391508360020154870390505b6000808b60020b8b60020b121561520057505060018301546002840154615213565b84600101548a0391508460020154890390505b92909803979097039b96909503949094039850939650505050505050565b6040805160a08101825285546001600160801b0390811682526001870154602083015260028701549282019290925260038601548083166060830152600160801b900490911660808201526000600f85900b6152d05781516001600160801b03166152c8576040805162461bcd60e51b815260206004820152600260248201526104e560f41b604482015290519081900360640190fd5b5080516152df565b81516152dc90866134d1565b90505b60006153038360200151860384600001516001600160801b0316600160801b6131d5565b905060006153298460400151860385600001516001600160801b0316600160801b6131d5565b905086600f0b6000146153505787546001600160801b0319166001600160801b0384161788555b60018801869055600288018590556001600160801b03821615158061537e57506000816001600160801b0316115b156153bc576003880180546001600160801b031981166001600160801b039182168501821617808216600160801b9182900483168501909216021790555b5050505050505050565b600290810b810b6000908152602092909252604082208281556001810183905590810182905560030155565b806001600160a01b0381168114612af257600080fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b6040805160808101825260008082526020820181905291810182905260608101919091529056fea264697066735822122052f61fe72d906667606fc031ae2cb8ea2697540307903341488b08a09a9964f364736f6c63430007060033a26469706673582212209400a00e1165b67441801d6daf6b7cf3a3ca71cedec06719335608611678e21e64736f6c63430007060033c66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" /* -* cd ./solidity/lib/punch-swap-v3-contracts -* forge inspect src/swap-router/SwapRouter02.sol bytecode -*/ + * cd ./solidity/lib/punch-swap-v3-contracts + * forge inspect src/swap-router/SwapRouter02.sol bytecode + */ access(all) let swapRouter02Bytecode = "6101006040526000196000553480156200001857600080fd5b5060405162005016380380620050168339810160408190526200003b9162000087565b6001600160601b0319606094851b811660805291841b821660a05291831b811660c052911b1660e052620000e3565b80516001600160a01b03811681146200008257600080fd5b919050565b600080600080608085870312156200009d578384fd5b620000a8856200006a565b9350620000b8602086016200006a565b9250620000c8604086016200006a565b9150620000d8606086016200006a565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c614e9262000184600039806101d452806108f35280610f38528061102352806110bd5280611395528061148052806124ec528061253252806125a65250806112ac52806119e9528061310952508061124552806117375280611a2c52806129265250806109de5280610a985280610cf7528061122152806126d152806128385250614e926000f3fe6080604052600436106101c45760003560e01c806304e45aaf1461023957806309b813461461026257806311ed56c91461027557806312210e8a146102955780631c58db4f1461029d5780631f0464d1146102b05780633068c554146102d057806342712a67146102e35780634659a494146102f6578063472b43f31461030957806349404b7c1461031c578063496169971461032f5780634aa4a4fc146103425780635023b4df14610364578063571ac8b0146103775780635ae401dc1461038a578063639d71a91461039d57806368e0d4e1146103b0578063791b98bc146103c55780637ee355e6146103da5780639b2c0a37146103fa578063a4a78f0c1461040d578063ab3fdd5014610420578063ac9650d814610433578063b3a2af1314610446578063b858183f14610459578063c2e3140a1461046c578063c45a01551461047f578063cab372ce14610494578063d4ef38de146104a7578063dee00f35146104ba578063df2ab5bb146104e7578063e0e189a0146104fa578063e90a182f1461050d578063efdeed8e14610520578063f100b20514610540578063f25801a714610553578063f2d5d56b14610573578063f3995c671461058657610234565b3661023457336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610232576040805162461bcd60e51b81526020600482015260096024820152684e6f7420574554483960b81b604482015290519081900360640190fd5b005b600080fd5b61024c610247366004614575565b610599565b6040516102599190614d10565b60405180910390f35b61024c61027036600461460f565b6106d4565b610288610283366004614668565b61077c565b6040516102599190614afc565b6102326108df565b6102326102ab3660046147ea565b6108f1565b6102c36102be3660046142df565b610968565b6040516102599190614a9c565b6102326102de366004614112565b6109c4565b61024c6102f13660046148b4565b6109d7565b61023261030436600461415b565b610b7d565b61024c6103173660046148b4565b610c17565b61023261032a36600461481a565b610f34565b61023261033d3660046147ea565b6110ae565b34801561034e57600080fd5b506103576110bb565b6040516102599190614a0f565b61024c610372366004614646565b6110df565b610232610385366004614025565b6111a1565b6102c36103983660046142df565b6111b6565b6102326103ab366004614025565b61120b565b3480156103bc57600080fd5b5061035761121f565b3480156103d157600080fd5b50610357611243565b3480156103e657600080fd5b506102326103f53660046143ed565b611267565b610232610408366004614849565b611377565b61023261041b36600461415b565b611541565b61023261042e366004614025565b6115d2565b6102c36104413660046141b6565b6115f2565b610288610454366004614328565b611731565b61024c6104673660046144d0565b6117e2565b61023261047a36600461415b565b611958565b34801561048b57600080fd5b506103576119e7565b6102326104a2366004614025565b6115e6565b6102326104b5366004614887565b611a0b565b3480156104c657600080fd5b506104da6104d5366004614048565b611a17565b6040516102599190614b0f565b6102326104f5366004614073565b611b3f565b6102326105083660046140b4565b611c17565b61023261051b366004614048565b611d3e565b34801561052c57600080fd5b5061023261053b3660046141f5565b611d4d565b61028861054e366004614657565b611d85565b34801561055f57600080fd5b5061023261056e36600461435a565b611e07565b610232610581366004614048565b611e3e565b61023261059436600461415b565b611e4a565b600080600083608001511415610630575081516040516370a0823160e01b81526001916001600160a01b0316906370a08231906105da903090600401614a0f565b60206040518083038186803b1580156105f257600080fd5b505afa158015610606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062a9190614802565b60808401525b61069f836080015184606001518560c001516040518060400160405280886000015189604001518a6020015160405160200161066e939291906149ad565b60405160208183030381529060405281526020018661068d573361068f565b305b6001600160a01b03169052611ebc565b91508260a001518210156106ce5760405162461bcd60e51b81526004016106c590614ba5565b60405180910390fd5b50919050565b6000610748604083018035906106ed9060208601614025565b60408051808201909152600090806107058880614d46565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360209091015261202c565b505060005460608201358111156107715760405162461bcd60e51b81526004016106c590614b5d565b600019600055919050565b6040805161016081019091526060906108d790634418b22b60e11b90806107a66020870187614025565b6001600160a01b031681526020018560200160208101906107c79190614025565b6001600160a01b031681526020016107e560608701604088016147d0565b62ffffff1681526020016107ff60808701606088016143ae565b60020b815260200161081760a08701608088016143ae565b60020b81526020908101906108379061083290880188614025565b6121c5565b81526020016108528660200160208101906108329190614025565b815260a0860135602082015260c0860135604082015260600161087c610100870160e08801614025565b6001600160a01b031681526020016000198152506040516024016108a09190614c16565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611731565b90505b919050565b47156108ef576108ef3347612244565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561094c57600080fd5b505af1158015610960573d6000803e3d6000fd5b505050505050565b606083806001430340146109af576040805162461bcd60e51b8152602060048201526009602482015268084d8dec6d6d0c2e6d60bb1b604482015290519081900360640190fd5b6109b984846115f2565b91505b509392505050565b6109d18484338585611c17565b50505050565b6000610a377f00000000000000000000000000000000000000000000000000000000000000008786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061233392505050565b600081518110610a4357fe5b6020026020010151905084811115610a6d5760405162461bcd60e51b81526004016106c590614b5d565b610b0684846000818110610a7d57fe5b9050602002016020810190610a929190614025565b33610b007f000000000000000000000000000000000000000000000000000000000000000088886000818110610ac457fe5b9050602002016020810190610ad99190614025565b89896001818110610ae657fe5b9050602002016020810190610afb9190614025565b61242f565b846124ea565b6001600160a01b03821660011415610b2057339150610b36565b6001600160a01b03821660021415610b36573091505b610b7484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525086925061267a915050565b95945050505050565b604080516323f2ebc360e21b815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e4810183905290516001600160a01b03881691638fcbaf0c9161010480830192600092919082900301818387803b158015610bf757600080fd5b505af1158015610c0b573d6000803e3d6000fd5b50505050505050505050565b60008086610cc0575060018484600081610c2d57fe5b9050602002016020810190610c429190614025565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610c6d9190614a0f565b60206040518083038186803b158015610c8557600080fd5b505afa158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbd9190614802565b96505b610d4b85856000818110610cd057fe5b9050602002016020810190610ce59190614025565b82610cf05733610cf2565b305b610d457f000000000000000000000000000000000000000000000000000000000000000089896000818110610d2357fe5b9050602002016020810190610d389190614025565b8a8a6001818110610ae657fe5b8a6124ea565b6001600160a01b03831660011415610d6557339250610d7b565b6001600160a01b03831660021415610d7b573092505b600085856000198101818110610d8d57fe5b9050602002016020810190610da29190614025565b6001600160a01b03166370a08231856040518263ffffffff1660e01b8152600401610dcd9190614a0f565b60206040518083038186803b158015610de557600080fd5b505afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190614802565b9050610e5d86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061267a915050565b610f078187876000198101818110610e7157fe5b9050602002016020810190610e869190614025565b6001600160a01b03166370a08231876040518263ffffffff1660e01b8152600401610eb19190614a0f565b60206040518083038186803b158015610ec957600080fd5b505afa158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f019190614802565b906128fd565b925086831015610f295760405162461bcd60e51b81526004016106c590614ba5565b505095945050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d6020811015610fcd57600080fd5b505190508281101561101b576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b604482015290519081900360640190fd5b80156110a9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561108757600080fd5b505af115801561109b573d6000803e3d6000fd5b505050506110a98282612244565b505050565b6110b88133610f34565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061117b608083018035906110f89060608601614025565b61110860e0860160c08701614025565b60405180604001604052808760200160208101906111269190614025565b61113660608a0160408b016147d0565b61114360208b018b614025565b604051602001611155939291906149ad565b6040516020818303038152906040528152602001336001600160a01b031681525061202c565b90508160a001358111156107715760405162461bcd60e51b81526004016106c590614b5d565b6111ad8160001961290d565b6110b857600080fd5b606083806111c2612a01565b11156109af576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b61121681600061290d565b6111a157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008413806112765750600083135b61127f57600080fd5b600061128d8284018461467a565b905060008060006112a18460000151612a05565b9250925092506112d37f0000000000000000000000000000000000000000000000000000000000000000848484612a36565b5060008060008a136112fa57846001600160a01b0316846001600160a01b03161089611311565b836001600160a01b0316856001600160a01b0316108a5b9150915081156113305761132b85876020015133846124ea565b610c0b565b855161133b90612a4c565b1561136057855161134b90612a54565b865261135a813360008961202c565b50610c0b565b80600081905550610c0b84876020015133846124ea565b600082118015611388575060648211155b61139157600080fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561140057600080fd5b505afa158015611414573d6000803e3d6000fd5b505050506040513d602081101561142a57600080fd5b5051905084811015611478576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b604482015290519081900360640190fd5b801561153a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114e457600080fd5b505af11580156114f8573d6000803e3d6000fd5b5050505060006127106115148584612a6b90919063ffffffff16565b8161151b57fe5b049050801561152e5761152e8382612244565b61096085828403612244565b5050505050565b60408051636eb1769f60e11b81523360048201523060248201529051600019916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561159257600080fd5b505afa1580156115a6573d6000803e3d6000fd5b505050506040513d60208110156115bc57600080fd5b5051101561096057610960868686868686610b7d565b6115dd81600061290d565b6115e657600080fd5b6111ad8160011961290d565b6060816001600160401b038111801561160a57600080fd5b5060405190808252806020026020018201604052801561163e57816020015b60608152602001906001900390816116295790505b50905060005b8281101561172a576000803086868581811061165c57fe5b905060200281019061166e9190614d46565b60405161167c9291906149e3565b600060405180830381855af49150503d80600081146116b7576040519150601f19603f3d011682016040523d82523d6000602084013e6116bc565b606091505b509150915081611708576044815110156116d557600080fd5b600481019050808060200190518101906116ef9190614467565b60405162461bcd60e51b81526004016106c59190614afc565b8084848151811061171557fe5b60209081029190910101525050600101611644565b5092915050565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168360405161176d91906149f3565b6000604051808303816000865af19150503d80600081146117aa576040519150601f19603f3d011682016040523d82523d6000602084013e6117af565b606091505b5092509050806106ce576044825110156117c857600080fd5b600482019150818060200190518101906116ef9190614467565b60008060008360400151141561188d576001905060006118058460000151612a05565b50506040516370a0823160e01b81529091506001600160a01b038216906370a0823190611836903090600401614a0f565b60206040518083038186803b15801561184e57600080fd5b505afa158015611862573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118869190614802565b6040850152505b60008161189a573361189c565b305b90505b60006118ae8560000151612a4c565b90506118fa8560400151826118c75786602001516118c9565b305b600060405180604001604052806118e38b60000151612a8f565b8152602001876001600160a01b0316815250611ebc565b6040860152801561191a57845130925061191390612a54565b8552611927565b846040015193505061192d565b5061189f565b83606001518310156119515760405162461bcd60e51b81526004016106c590614ba5565b5050919050565b60408051636eb1769f60e11b8152336004820152306024820152905186916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b1580156119a757600080fd5b505afa1580156119bb573d6000803e3d6000fd5b505050506040513d60208110156119d157600080fd5b5051101561096057610960868686868686611e4a565b7f000000000000000000000000000000000000000000000000000000000000000081565b6110a983338484611377565b600081836001600160a01b031663dd62ed3e307f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611a68929190614a23565b60206040518083038186803b158015611a8057600080fd5b505afa158015611a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab89190614802565b10611ac557506000611b39565b611ad18360001961290d565b15611ade57506001611b39565b611aea8360011961290d565b15611af757506002611b39565b611b0283600061290d565b611b0b57600080fd5b611b178360001961290d565b15611b2457506003611b39565b611b308360011961290d565b15610234575060045b92915050565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611b8e57600080fd5b505afa158015611ba2573d6000803e3d6000fd5b505050506040513d6020811015611bb857600080fd5b5051905082811015611c06576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b80156109d1576109d1848383612a9e565b600082118015611c28575060648211155b611c3157600080fd5b6000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611c8057600080fd5b505afa158015611c94573d6000803e3d6000fd5b505050506040513d6020811015611caa57600080fd5b5051905084811015611cf8576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b8015610960576000612710611d0d8386612a6b565b81611d1457fe5b0490508015611d2857611d28878483612a9e565b611d358786838503612a9e565b50505050505050565b611d49828233611b3f565b5050565b600080611d5b868685612be5565b915091508362ffffff16818303126109605760405162461bcd60e51b81526004016106c590614b89565b60606108d763219f5d1760e01b6040518060c0016040528085604001358152602001611dbd8660000160208101906108329190614025565b8152602001611dd88660200160208101906108329190614025565b815260200185606001358152602001856080013581526020016000198152506040516024016108a09190614bd2565b600080611e148584612ddb565b915091508362ffffff168183031261153a5760405162461bcd60e51b81526004016106c590614b89565b611d4982333084612fb2565b6040805163d505accf60e01b8152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c4810183905290516001600160a01b0388169163d505accf9160e480830192600092919082900301818387803b158015610bf757600080fd5b60006001600160a01b03841660011415611ed857339350611eee565b6001600160a01b03841660021415611eee573093505b6000806000611f008560000151612a05565b919450925090506001600160a01b0380831690841610600080611f24868686613102565b6001600160a01b031663128acb088b85611f3d8f613140565b6001600160a01b038e1615611f52578d611f78565b87611f715773fffd8963efd1fc6a506488495d951d5263988d25611f78565b6401000276a45b8d604051602001611f899190614cc4565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611fb8959493929190614a3d565b6040805180830381600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200991906143ca565b9150915082612018578161201a565b805b6000039b9a5050505050505050505050565b60006001600160a01b038416600114156120485733935061205e565b6001600160a01b0384166002141561205e573093505b60008060006120708560000151612a05565b919450925090506001600160a01b0380841690831610600080612094858786613102565b6001600160a01b031663128acb088b856120ad8f613140565b6000036001600160a01b038e16156120c5578d6120eb565b876120e45773fffd8963efd1fc6a506488495d951d5263988d256120eb565b6401000276a45b8d6040516020016120fc9190614cc4565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161212b959493929190614a3d565b6040805180830381600087803b15801561214457600080fd5b505af1158015612158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217c91906143ca565b91509150600083612191578183600003612197565b82826000035b90985090506001600160a01b038a166121b6578b81146121b657600080fd5b50505050505050949350505050565b6040516370a0823160e01b81526000906001600160a01b038316906370a08231906121f4903090600401614a0f565b60206040518083038186803b15801561220c57600080fd5b505afa158015612220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d79190614802565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106122905780518252601f199092019160209182019101612271565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146122f2576040519150601f19603f3d011682016040523d82523d6000602084013e6122f7565b606091505b50509050806110a9576040805162461bcd60e51b815260206004820152600360248201526253544560e81b604482015290519081900360640190fd5b606060028251101561234457600080fd5b81516001600160401b038111801561235b57600080fd5b50604051908082528060200260200182016040528015612385578160200160208202803683370190505b509050828160018351038151811061239957fe5b60209081029190910101528151600019015b80156109bc576000806123e8878660018603815181106123c757fe5b60200260200101518786815181106123db57fe5b6020026020010151613156565b9150915061240a8484815181106123fb57fe5b6020026020010151838361321d565b84600185038151811061241957fe5b60209081029190910101525050600019016123ab565b600080600061243e85856132d6565b604080516001600160601b0319606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8459dfd5a1a23cec2bad3db1e04934bdd164b3846fdc504ed60810c73994b02f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614801561252b5750804710155b1561264d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b505050506040513d602081101561264557600080fd5b506109d19050565b6001600160a01b03831630141561266e57612669848383612a9e565b6109d1565b6109d184848484612fb2565b60005b60018351038110156110a95760008084838151811061269857fe5b60200260200101518584600101815181106126af57fe5b60200260200101519150915060006126c783836132d6565b50905060006126f77f0000000000000000000000000000000000000000000000000000000000000000858561242f565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561273857600080fd5b505afa15801561274c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127709190614709565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b0316146127aa5782846127ad565b83835b915091506127e1828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b8152600401610eb19190614a0f565b95506127ee86838361333a565b945050505050600080856001600160a01b0316886001600160a01b0316146128185782600061281c565b6000835b91509150600060028c51038a10612833578a612874565b6128747f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061286757fe5b602002602001015161242f565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906128b69086908690869060248101614d19565b600060405180830381600087803b1580156128d057600080fd5b505af11580156128e4573d6000803e3d6000fd5b50506001909b019a5061267d9950505050505050505050565b80820382811115611b3957600080fd5b6000806000846001600160a01b031663095ea7b360e01b7f000000000000000000000000000000000000000000000000000000000000000086604051602401612957929190614a83565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161299591906149f3565b6000604051808303816000865af19150503d80600081146129d2576040519150601f19603f3d011682016040523d82523d6000602084013e6129d7565b606091505b5091509150818015610b74575080511580610b74575080806020019051810190610b7491906142c5565b4290565b60008080612a1384826133f2565b9250612a208460146134a2565b9050612a2d8460176133f2565b91509193909250565b6000610b7485612a47868686613549565b61359f565b516042111590565b80516060906108d7908390601790601619016135c2565b6000821580612a8657505081810281838281612a8357fe5b04145b611b3957600080fd5b60606108d7826000602b6135c2565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b60208310612b1a5780518252601f199092019160209182019101612afb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b7c576040519150601f19603f3d011682016040523d82523d6000602084013e612b81565b606091505b5091509150818015612baf575080511580612baf5750808060200190516020811015612bac57600080fd5b50515b61153a576040805162461bcd60e51b815260206004820152600260248201526114d560f21b604482015290519081900360640190fd5b6000808351855114612bf657600080fd5b600085516001600160401b0381118015612c0f57600080fd5b50604051908082528060200260200182016040528015612c4957816020015b612c36613e7f565b815260200190600190039081612c2e5790505b509050600086516001600160401b0381118015612c6557600080fd5b50604051908082528060200260200182016040528015612c9f57816020015b612c8c613e7f565b815260200190600190039081612c845790505b50905060005b8751811015612db457600080612cce8a8481518110612cc057fe5b602002602001015189612ddb565b91509150612cdb82613713565b858481518110612ce757fe5b60200260200101516000019060020b908160020b81525050612d0881613713565b848481518110612d1457fe5b60200260200101516000019060020b908160020b81525050888381518110612d3857fe5b6020026020010151858481518110612d4c57fe5b6020026020010151602001906001600160801b031690816001600160801b031681525050888381518110612d7c57fe5b6020026020010151848481518110612d9057fe5b6020908102919091018101516001600160801b039092169101525050600101612ca5565b50612dbe82613724565b60020b9350612dcc81613724565b60020b92505050935093915050565b600080600080612dea866137dc565b90506000805b82811015612f93576000806000612e068b612a05565b9250925092506000612e19848484613102565b905060008063ffffffff8d16612e4257612e32836137e9565b600291820b9350900b9050612ed7565b612e4c838e613a26565b8160020b91505080925050826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015612e9057600080fd5b505afa158015612ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec89190614744565b50505060029290920b93505050505b60018903871415612efe57846001600160a01b0316866001600160a01b0316109950612f0d565b612f078e612a54565b9d508597505b6000871580612f605750866001600160a01b0316896001600160a01b031610612f4a57866001600160a01b0316866001600160a01b031610612f60565b856001600160a01b0316876001600160a01b0316105b90508015612f75579b82019b9a81019a612f80565b828d039c50818c039b505b505060019095019450612df09350505050565b5082612fa85760001985029450600019840293505b5050509250929050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b602083106130365780518252601f199092019160209182019101613017565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613098576040519150601f19603f3d011682016040523d82523d6000602084013e61309d565b606091505b50915091508180156130cb5750805115806130cb57508080602001905160208110156130c857600080fd5b50515b610960576040805162461bcd60e51b815260206004820152600360248201526229aa2360e91b604482015290519081900360640190fd5b60006131387f0000000000000000000000000000000000000000000000000000000000000000613133868686613549565b613d90565b949350505050565b6000600160ff1b821061315257600080fd5b5090565b600080600061316585856132d6565b50905060008061317688888861242f565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156131ae57600080fd5b505afa1580156131c2573d6000803e3d6000fd5b505050506040513d60608110156131d857600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461320b57808261320e565b81815b90999098509650505050505050565b6000808411613270576040805162461bcd60e51b815260206004820152601a602482015279125394d551919250d251539517d3d55514155517d05353d5539560321b604482015290519081900360640190fd5b6000831180156132805750600082115b61328957600080fd5b60006132a16103e861329b8688612a6b565b90612a6b565b905060006132b56103e561329b86896128fd565b90506132cc60018284816132c557fe5b0490613e6f565b9695505050505050565b600080826001600160a01b0316846001600160a01b031614156132f857600080fd5b826001600160a01b0316846001600160a01b03161061331857828461331b565b83835b90925090506001600160a01b03821661333357600080fd5b9250929050565b600080841161338c576040805162461bcd60e51b8152602060048201526019602482015278125394d551919250d251539517d25394155517d05353d55395603a1b604482015290519081900360640190fd5b60008311801561339c5750600082115b6133a557600080fd5b60006133b3856103e5612a6b565b905060006133c18285612a6b565b905060006133db836133d5886103e8612a6b565b90613e6f565b90508082816133e657fe5b04979650505050505050565b600081826014011015613441576040805162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b604482015290519081900360640190fd5b8160140183511015613492576040805162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b604482015290519081900360640190fd5b500160200151600160601b900490565b6000818260030110156134f0576040805162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b604482015290519081900360640190fd5b8160030183511015613540576040805162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b604482015290519081900360640190fd5b50016003015190565b613551613e96565b826001600160a01b0316846001600160a01b0316111561356f579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b60006135ab8383613d90565b9050336001600160a01b03821614611b3957600080fd5b60608182601f01101561360d576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015613655576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b818301845110156136a1576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b6060821580156136c0576040519150600082526020820160405261370a565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156136f95780518352602092830192016136e1565b5050858452601f01601f1916604052505b50949350505050565b80600281900b81146108da57600080fd5b6000806000805b84518110156137a75784818151811061374057fe5b6020026020010151602001516001600160801b031685828151811061376157fe5b60200260200101516000015160020b028301925084818151811061378157fe5b6020026020010151602001516001600160801b031682019150808060010191505061372b565b508082816137b157fe5b0592506000821280156137cc57508082816137c857fe5b0715155b1561195157505060001901919050565b5160176013199091010490565b600080600080846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561382857600080fd5b505afa15801561383c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138609190614744565b50939750919550935050600161ffff841611915061389290505760405162461bcd60e51b81526004016106c590614b40565b600080866001600160a01b031663252c09d7856040518263ffffffff1660e01b81526004016138c19190614d01565b60806040518083038186803b1580156138d957600080fd5b505afa1580156138ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613911919061490e565b50509150915061391f612a01565b63ffffffff168263ffffffff161461393957849550613a1d565b60008361ffff1660018561ffff168761ffff1601038161395557fe5b06905060008060008a6001600160a01b031663252c09d7856040518263ffffffff1660e01b81526004016139899190614d10565b60806040518083038186803b1580156139a157600080fd5b505afa1580156139b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d9919061490e565b93505092509250806139fd5760405162461bcd60e51b81526004016106c590614b23565b82860363ffffffff811683870360060b81613a1457fe5b059a5050505050505b50505050915091565b60008063ffffffff8316613a66576040805162461bcd60e51b8152602060048201526002602482015261042560f41b604482015290519081900360640190fd5b6040805160028082526060820183526000926020830190803683370190505090508381600081518110613a9557fe5b602002602001019063ffffffff16908163ffffffff1681525050600081600181518110613abe57fe5b63ffffffff90921660209283029190910182015260405163883bdbfd60e01b81526004810182815283516024830152835160009384936001600160a01b038b169363883bdbfd9388939192839260449091019185820191028083838b5b83811015613b33578181015183820152602001613b1b565b505050509050019250505060006040518083038186803b158015613b5657600080fd5b505afa158015613b6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613b9357600080fd5b8101908080516040519392919084600160201b821115613bb257600080fd5b908301906020820185811115613bc757600080fd5b82518660208202830111600160201b82111715613be357600080fd5b82525081516020918201928201910280838360005b83811015613c10578181015183820152602001613bf8565b5050505090500160405260200180516040519392919084600160201b821115613c3857600080fd5b908301906020820185811115613c4d57600080fd5b82518660208202830111600160201b82111715613c6957600080fd5b82525081516020918201928201910280838360005b83811015613c96578181015183820152602001613c7e565b5050505090500160405250505091509150600082600081518110613cb657fe5b602002602001015183600181518110613ccb57fe5b6020026020010151039050600082600081518110613ce557fe5b602002602001015183600181518110613cfa57fe5b60200260200101510390508763ffffffff168260060b81613d1757fe5b05965060008260060b128015613d4157508763ffffffff168260060b81613d3a57fe5b0760060b15155b15613d4e57600019909601955b63ffffffff88166001600160a01b0302600160201b600160c01b03602083901b166001600160c01b03821681613d8057fe5b0496505050505050509250929050565b600081602001516001600160a01b031682600001516001600160a01b031610613db857600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b80820182811015611b3957600080fd5b604080518082019091526000808252602082015290565b604080516060810182526000808252602082018190529181019190915290565b80356108da81614e17565b60008083601f840112613ed2578182fd5b5081356001600160401b03811115613ee8578182fd5b602083019150836020808302850101111561333357600080fd5b600082601f830112613f12578081fd5b81356020613f27613f2283614dad565b614d8a565b8281528181019085830183850287018401881015613f43578586fd5b855b85811015613f755781356001600160801b0381168114613f63578788fd5b84529284019290840190600101613f45565b5090979650505050505050565b805180151581146108da57600080fd5b600082601f830112613fa2578081fd5b8135613fb0613f2282614dca565b818152846020838601011115613fc4578283fd5b816020850160208301379081016020019190915292915050565b80516001600160701b03811681146108da57600080fd5b805161ffff811681146108da57600080fd5b803562ffffff811681146108da57600080fd5b80356108da81614e3b565b600060208284031215614036578081fd5b813561404181614e17565b9392505050565b6000806040838503121561405a578081fd5b823561406581614e17565b946020939093013593505050565b600080600060608486031215614087578081fd5b833561409281614e17565b92506020840135915060408401356140a981614e17565b809150509250925092565b600080600080600060a086880312156140cb578283fd5b85356140d681614e17565b94506020860135935060408601356140ed81614e17565b925060608601359150608086013561410481614e17565b809150509295509295909350565b60008060008060808587031215614127578182fd5b843561413281614e17565b93506020850135925060408501359150606085013561415081614e17565b939692955090935050565b60008060008060008060c08789031215614173578384fd5b863561417e81614e17565b95506020870135945060408701359350606087013561419c81614e4d565b9598949750929560808101359460a0909101359350915050565b600080602083850312156141c8578182fd5b82356001600160401b038111156141dd578283fd5b6141e985828601613ec1565b90969095509350505050565b6000806000806080858703121561420a578182fd5b84356001600160401b0380821115614220578384fd5b818701915087601f830112614233578384fd5b81356020614243613f2283614dad565b82815281810190858301885b85811015614278576142668e8684358b0101613f92565b8452928401929084019060010161424f565b50909950505088013592505080821115614290578384fd5b5061429d87828801613f02565b9350506142ac60408601614007565b91506142ba6060860161401a565b905092959194509250565b6000602082840312156142d6578081fd5b61404182613f82565b6000806000604084860312156142f3578081fd5b8335925060208401356001600160401b0381111561430f578182fd5b61431b86828701613ec1565b9497909650939450505050565b600060208284031215614339578081fd5b81356001600160401b0381111561434e578182fd5b61313884828501613f92565b60008060006060848603121561436e578081fd5b83356001600160401b03811115614383578182fd5b61438f86828701613f92565b93505061439e60208501614007565b915060408401356140a981614e3b565b6000602082840312156143bf578081fd5b813561404181614e2c565b600080604083850312156143dc578182fd5b505080516020909101519092909150565b60008060008060608587031215614402578182fd5b843593506020850135925060408501356001600160401b0380821115614426578384fd5b818701915087601f830112614439578384fd5b813581811115614447578485fd5b886020828501011115614458578485fd5b95989497505060200194505050565b600060208284031215614478578081fd5b81516001600160401b0381111561448d578182fd5b8201601f8101841361449d578182fd5b80516144ab613f2282614dca565b8181528560208385010111156144bf578384fd5b610b74826020830160208601614deb565b6000602082840312156144e1578081fd5b81356001600160401b03808211156144f7578283fd5b908301906080828603121561450a578283fd5b60405160808101818110838211171561451f57fe5b604052823582811115614530578485fd5b61453c87828601613f92565b8252506020830135915061454f82614e17565b816020820152604083013560408201526060830135606082015280935050505092915050565b600060e08284031215614586578081fd5b60405160e081016001600160401b03811182821017156145a257fe5b6040526145ae83613eb6565b81526145bc60208401613eb6565b60208201526145cd60408401614007565b60408201526145de60608401613eb6565b60608201526080830135608082015260a083013560a082015261460360c08401613eb6565b60c08201529392505050565b600060208284031215614620578081fd5b81356001600160401b03811115614635578182fd5b820160808185031215614041578182fd5b600060e082840312156106ce578081fd5b600060a082840312156106ce578081fd5b600061010082840312156106ce578081fd5b60006020828403121561468b578081fd5b81356001600160401b03808211156146a1578283fd5b90830190604082860312156146b4578283fd5b6040516040810181811083821117156146c957fe5b6040528235828111156146da578485fd5b6146e687828601613f92565b825250602083013592506146f983614e17565b6020810192909252509392505050565b60008060006060848603121561471d578081fd5b61472684613fde565b925061473460208501613fde565b915060408401516140a981614e3b565b600080600080600080600060e0888a03121561475e578485fd5b875161476981614e17565b602089015190975061477a81614e2c565b955061478860408901613ff5565b945061479660608901613ff5565b93506147a460808901613ff5565b925060a08801516147b481614e4d565b91506147c260c08901613f82565b905092959891949750929550565b6000602082840312156147e1578081fd5b61404182614007565b6000602082840312156147fb578081fd5b5035919050565b600060208284031215614813578081fd5b5051919050565b6000806040838503121561482c578182fd5b82359150602083013561483e81614e17565b809150509250929050565b6000806000806080858703121561485e578182fd5b84359350602085013561487081614e17565b925060408501359150606085013561415081614e17565b60008060006060848603121561489b578081fd5b833592506020840135915060408401356140a981614e17565b6000806000806000608086880312156148cb578283fd5b853594506020860135935060408601356001600160401b038111156148ee578384fd5b6148fa88828901613ec1565b909450925050606086013561410481614e17565b60008060008060808587031215614923578182fd5b845161492e81614e3b565b8094505060208501518060060b8114614945578283fd5b604086015190935061495681614e17565b91506142ba60608601613f82565b6001600160a01b03169052565b60008151808452614989816020860160208601614deb565b601f01601f19169290920160200192915050565b60020b9052565b62ffffff169052565b606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b6000828483379101908152919050565b60008251614a05818460208701614deb565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a060808201819052600090614a7890830184614971565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015614aef57603f19888603018452614add858351614971565b94509285019290850190600101614ac1565b5092979650505050505050565b6000602082526140416020830184614971565b6020810160058310614b1d57fe5b91905290565b6020808252600390820152624f4e4960e81b604082015260600190565b6020808252600390820152624e454f60e81b604082015260600190565b602080825260129082015271151bdbc81b5d58da081c995c5d595cdd195960721b604082015260600190565b602080825260029082015261151160f21b604082015260600190565b602080825260139082015272151bdbc81b1a5d1d1b19481c9958d95a5d9959606a1b604082015260600190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b600061016082019050614c2a828451614964565b6020830151614c3c6020840182614964565b506040830151614c4f60408401826149a4565b506060830151614c62606084018261499d565b506080830151614c75608084018261499d565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151614cb382850182614964565b505061014092830151919092015290565b600060208252825160406020840152614ce06060840182614971565b602094909401516001600160a01b0316604093909301929092525090919050565b61ffff91909116815260200190565b90815260200190565b600085825284602083015260018060a01b0384166040830152608060608301526132cc6080830184614971565b6000808335601e19843603018112614d5c578283fd5b8301803591506001600160401b03821115614d75578283fd5b60200191503681900382131561333357600080fd5b6040518181016001600160401b0381118282101715614da557fe5b604052919050565b60006001600160401b03821115614dc057fe5b5060209081020190565b60006001600160401b03821115614ddd57fe5b50601f01601f191660200190565b60005b83811015614e06578181015183820152602001614dee565b838111156109d15750506000910152565b6001600160a01b03811681146110b857600080fd5b8060020b81146110b857600080fd5b63ffffffff811681146110b857600080fd5b60ff811681146110b857600080fdfea2646970667358221220953eba4c9720f483abb9e5f941231ad19fa89f7b79df18b067b4ba550557f3f964736f6c63430007060033" /* -* cd ./solidity/lib/punch-swap-v3-contracts -* forge inspect src/periphery/lens/QuoterV2.sol bytecode -*/ + * cd ./solidity/lib/punch-swap-v3-contracts + * forge inspect src/periphery/lens/QuoterV2.sol bytecode + */ access(all) let quoterV2Bytecode = "60c06040523480156200001157600080fd5b5060405162001bce38038062001bce833981016040819052620000349162000070565b6001600160601b0319606092831b8116608052911b1660a052620000a7565b80516001600160a01b03811681146200006b57600080fd5b919050565b6000806040838503121562000083578182fd5b6200008e8362000053565b91506200009e6020840162000053565b90509250929050565b60805160601c60a05160601c611af3620000db600039806102ce525080610321528061064052806109fa5250611af36000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c80632f80bb1d146100725780634aa4a4fc1461009e5780637ee355e6146100b3578063bd21704a146100c8578063c45a0155146100eb578063c6a5026a146100f3578063cdca175314610106575b600080fd5b610085610080366004611662565b610119565b604051610095949392919061196c565b60405180910390f35b6100a66102cc565b60405161009591906118d5565b6100c66100c13660046116c7565b6102f0565b005b6100db6100d636600461177d565b61046b565b6040516100959493929190611a07565b6100a661063e565b6100db61010136600461177d565b610662565b610085610114366004611662565b6107d8565b600060608060006101298661096d565b6001600160401b038111801561013e57600080fd5b50604051908082528060200260200182016040528015610168578160200160208202803683370190505b5092506101748661096d565b6001600160401b038111801561018957600080fd5b506040519080825280602002602001820160405280156101b3578160200160208202803683370190505b50915060005b60008060006101c78a61097e565b9250925092506000806000806102236040518060a00160405280886001600160a01b03168152602001896001600160a01b031681526020018f81526020018762ffffff16815260200160006001600160a01b031681525061046b565b9350935093509350828b898151811061023857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818a898151811061026557fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926102928e6109af565b156102a7576102a08e6109b7565b9d506102b7565b8c9b5050505050505050506102c3565b505050505050506101b9565b92959194509250565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008313806102ff5750600082135b61030857600080fd5b60008060006103168461097e565b9250925092506103487f00000000000000000000000000000000000000000000000000000000000000008484846109d4565b50600080600080891361037457856001600160a01b0316856001600160a01b031610888a60000361038f565b846001600160a01b0316866001600160a01b03161089896000035b92509250925060006103a28787876109f3565b9050600080826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156103e057600080fd5b505afa1580156103f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610418919061179f565b505050505091509150851561043e57604051848152826020820152816040820152606081fd5b6000541561045457600054841461045457600080fd5b604051858152826020820152816040820152606081fd5b6020810151815160608301516000928392839283926001600160a01b038082169084161092849261049c92906109f3565b905086608001516001600160a01b0316600014156104bd5760408701516000555b60005a9050816001600160a01b031663128acb0830856104e08c60400151610a31565b6000038c608001516001600160a01b0316600014610502578c60800151610528565b876105215773fffd8963efd1fc6a506488495d951d5263988d25610528565b6401000276a45b8d602001518e606001518f600001516040516020016105499392919061189f565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016105789594939291906118e9565b6040805180830381600087803b15801561059157600080fd5b505af19250505080156105c1575060408051601f3d908101601f191682019092526105be918101906116a4565b60015b610631573d8080156105ef576040519150601f19603f3d011682016040523d82523d6000602084013e6105f4565b606091505b505a8203945088608001516001600160a01b03166000141561061557600080555b610620818487610a47565b975097509750975050505050610637565b50505050505b9193509193565b7f000000000000000000000000000000000000000000000000000000000000000081565b6020810151815160608301516000928392839283926001600160a01b038082169084161092849261069392906109f3565b905060005a9050816001600160a01b031663128acb0830856106b88c60400151610a31565b60808d01516001600160a01b0316156106d5578c608001516106fb565b876106f45773fffd8963efd1fc6a506488495d951d5263988d256106fb565b6401000276a45b8d600001518e606001518f6020015160405160200161071c9392919061189f565b6040516020818303038152906040526040518663ffffffff1660e01b815260040161074b9594939291906118e9565b6040805180830381600087803b15801561076457600080fd5b505af1925050508015610794575060408051601f3d908101601f19168201909252610791918101906116a4565b60015b610631573d8080156107c2576040519150601f19603f3d011682016040523d82523d6000602084013e6107c7565b606091505b505a82039450610620818487610a47565b600060608060006107e88661096d565b6001600160401b03811180156107fd57600080fd5b50604051908082528060200260200182016040528015610827578160200160208202803683370190505b5092506108338661096d565b6001600160401b038111801561084857600080fd5b50604051908082528060200260200182016040528015610872578160200160208202803683370190505b50915060005b60008060006108868a61097e565b9250925092506000806000806108e26040518060a00160405280896001600160a01b03168152602001886001600160a01b031681526020018f81526020018762ffffff16815260200160006001600160a01b0316815250610662565b9350935093509350828b89815181106108f757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050818a898151811061092457fe5b63ffffffff90921660209283029190910190910152929b50968201966001909601958b926109518e6109af565b156102a75761095f8e6109b7565b9d5050505050505050610878565b80516017601319909101045b919050565b6000808061098c8482610b01565b9250610999846014610bb1565b90506109a6846017610b01565b91509193909250565b516042111590565b80516060906109ce90839060179060161901610c58565b92915050565b60006109ea856109e5868686610da9565b610dff565b95945050505050565b6000610a297f0000000000000000000000000000000000000000000000000000000000000000610a24868686610da9565b610e22565b949350505050565b6000600160ff1b8210610a4357600080fd5b5090565b600080600080600080876001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610a8957600080fd5b505afa158015610a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac1919061179f565b50939650610ad694508d9350610f0192505050565b91975095509050610af16001600160a01b0389168383610f8e565b9350869250505093509350935093565b600081826014011015610b50576040805162461bcd60e51b8152602060048201526012602482015271746f416464726573735f6f766572666c6f7760701b604482015290519081900360640190fd5b8160140183511015610ba1576040805162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b604482015290519081900360640190fd5b500160200151600160601b900490565b600081826003011015610bff576040805162461bcd60e51b8152602060048201526011602482015270746f55696e7432345f6f766572666c6f7760781b604482015290519081900360640190fd5b8160030183511015610c4f576040805162461bcd60e51b8152602060048201526014602482015273746f55696e7432345f6f75744f66426f756e647360601b604482015290519081900360640190fd5b50016003015190565b60608182601f011015610ca3576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b828284011015610ceb576040805162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b604482015290519081900360640190fd5b81830184511015610d37576040805162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b604482015290519081900360640190fd5b606082158015610d565760405191506000825260208201604052610da0565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015610d8f578051835260209283019201610d77565b5050858452601f01601f1916604052505b50949350505050565b610db1611532565b826001600160a01b0316846001600160a01b03161115610dcf579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b6000610e0b8383610e22565b9050336001600160a01b038216146109ce57600080fd5b600081602001516001600160a01b031682600001516001600160a01b031610610e4a57600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b60008060008351606014610f6d57604484511015610f3a5760405162461bcd60e51b8152600401610f3190611942565b60405180910390fd5b60048401935083806020019051810190610f549190611714565b60405162461bcd60e51b8152600401610f31919061192f565b83806020019051810190610f819190611836565b9250925092509193909250565b60008060008060008060008060088b6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd557600080fd5b505afa158015610fe9573d6000803e3d6000fd5b505050506040513d6020811015610fff57600080fd5b5051600290810b908c900b8161101157fe5b0560020b901d905060006101008c6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d602081101561108157600080fd5b5051600290810b908d900b8161109357fe5b0560020b8161109e57fe5b079050600060088d6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110de57600080fd5b505afa1580156110f2573d6000803e3d6000fd5b505050506040513d602081101561110857600080fd5b5051600290810b908d900b8161111a57fe5b0560020b901d905060006101008e6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116057600080fd5b505afa158015611174573d6000803e3d6000fd5b505050506040513d602081101561118a57600080fd5b5051600290810b908e900b8161119c57fe5b0560020b816111a757fe5b07905060008160ff166001901b8f6001600160a01b0316635339c296856040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b1580156111fb57600080fd5b505afa15801561120f573d6000803e3d6000fd5b505050506040513d602081101561122557600080fd5b5051161180156112ab57508d6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561126957600080fd5b505afa15801561127d573d6000803e3d6000fd5b505050506040513d602081101561129357600080fd5b5051600290810b908d900b816112a557fe5b0760020b155b80156112bc57508b60020b8d60020b135b945060008360ff166001901b8f6001600160a01b0316635339c296876040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b15801561130f57600080fd5b505afa158015611323573d6000803e3d6000fd5b505050506040513d602081101561133957600080fd5b5051161180156113bf57508d6001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137d57600080fd5b505afa158015611391573d6000803e3d6000fd5b505050506040513d60208110156113a757600080fd5b5051600290810b908e900b816113b957fe5b0760020b155b80156113d057508b60020b8d60020b125b95508160010b8460010b12806113fc57508160010b8460010b1480156113fc57508060ff168360ff1611155b156114125783995082975081985080965061141f565b8199508097508398508296505b505060001960ff87161b9150505b8560010b8760010b136114ef578560010b8760010b14156114545760001960ff858103161c165b6000818c6001600160a01b0316635339c2968a6040518263ffffffff1660e01b8152600401808260010b815260200191505060206040518083038186803b15801561149e57600080fd5b505afa1580156114b2573d6000803e3d6000fd5b505050506040513d60208110156114c857600080fd5b50511690506114d681611517565b61ffff169890980197505060019095019460001961142d565b81156114fc576001880397505b8215611509576001880397505b505050505050509392505050565b6000805b82156109ce5760001983019092169160010161151b565b604080516060810182526000808252602082018190529181019190915290565b600082601f830112611562578081fd5b813561157561157082611a54565b611a31565b818152846020838601011115611589578283fd5b816020850160208301379081016020019190915292915050565b8051600281900b811461097957600080fd5b600060a082840312156115c6578081fd5b60405160a081016001600160401b03811182821017156115e257fe5b60405290508082356115f381611aa5565b8152602083013561160381611aa5565b602082015260408381013590820152606083013562ffffff8116811461162857600080fd5b606082015261163960808401611645565b60808201525092915050565b803561097981611aa5565b805161ffff8116811461097957600080fd5b60008060408385031215611674578182fd5b82356001600160401b03811115611689578283fd5b61169585828601611552565b95602094909401359450505050565b600080604083850312156116b6578182fd5b505080516020909101519092909150565b6000806000606084860312156116db578081fd5b833592506020840135915060408401356001600160401b038111156116fe578182fd5b61170a86828701611552565b9150509250925092565b600060208284031215611725578081fd5b81516001600160401b0381111561173a578182fd5b8201601f8101841361174a578182fd5b805161175861157082611a54565b81815285602083850101111561176c578384fd5b6109ea826020830160208601611a75565b600060a0828403121561178e578081fd5b61179883836115b5565b9392505050565b600080600080600080600060e0888a0312156117b9578283fd5b87516117c481611aa5565b96506117d2602089016115a3565b95506117e060408901611650565b94506117ee60608901611650565b93506117fc60808901611650565b925060a088015160ff81168114611811578283fd5b60c08901519092508015158114611826578182fd5b8091505092959891949750929550565b60008060006060848603121561184a578081fd5b83519250602084015161185c81611aa5565b915061186a604085016115a3565b90509250925092565b6000815180845261188b816020860160208601611a75565b601f01601f19169290920160200192915050565b606093841b6001600160601b0319908116825260e89390931b6001600160e81b0319166014820152921b166017820152602b0190565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528515156020830152604082018590528316606082015260a06080820181905260009061192490830184611873565b979650505050505050565b6000602082526117986020830184611873565b60208082526010908201526f2ab732bc3832b1ba32b21032b93937b960811b604082015260600190565b600060808201868352602060808185015281875180845260a0860191508289019350845b818110156119b55784516001600160a01b031683529383019391830191600101611990565b505084810360408601528651808252908201925081870190845b818110156119f157825163ffffffff16855293830193918301916001016119cf565b5050505060609290920192909252949350505050565b9384526001600160a01b0392909216602084015263ffffffff166040830152606082015260800190565b6040518181016001600160401b0381118282101715611a4c57fe5b604052919050565b60006001600160401b03821115611a6757fe5b50601f01601f191660200190565b60005b83811015611a90578181015183820152602001611a78565b83811115611a9f576000848401525b50505050565b6001600160a01b0381168114611aba57600080fd5b5056fea2646970667358221220de415bfbfc31369201d2bfb524f30a2722ef5c86a907298fe640af636147875f64736f6c63430007060033" /* -* cd ./solidity/lib/punch-swap-v3-contracts -* forge inspect src/periphery/NonfingiblePositionManager.sol bytecode -*/ + * cd ./solidity/lib/punch-swap-v3-contracts + * forge inspect src/periphery/NonfingiblePositionManager.sol bytecode + */ access(all) let npmBytecode = "610120604052600d80546001600160b01b0319166001176001600160b01b0316600160b01b1790553480156200003457600080fd5b5060405162005cb638038062005cb68339810160408190526200005791620002da565b82826040518060400160405280601d81526020017f50756e63685377617020563320506f736974696f6e73204e46542d56310000008152506040518060400160405280600981526020016850532d56332d504f5360b81b815250604051806040016040528060018152602001603160f81b8152508282620000e56301ffc9a760e01b6200018c60201b60201c565b8151620000fa90600690602085019062000211565b5080516200011090600790602084019062000211565b50620001236380ac58cd60e01b6200018c565b62000135635b5e139f60e01b6200018c565b6200014763780e9d6360e01b6200018c565b50508251602093840120608052805192019190912060a052506001600160601b0319606092831b811660c05290821b811660e05291901b166101005250620003239050565b6001600160e01b03198082161415620001ec576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000249576000855562000294565b82601f106200026457805160ff191683800117855562000294565b8280016001018555821562000294579182015b828111156200029457825182559160200191906001019062000277565b50620002a2929150620002a6565b5090565b5b80821115620002a25760008155600101620002a7565b80516001600160a01b0381168114620002d557600080fd5b919050565b600080600060608486031215620002ef578283fd5b620002fa84620002bd565b92506200030a60208501620002bd565b91506200031a60408501620002bd565b90509250925092565b60805160a05160c05160601c60e05160601c6101005160601c61590e620003a8600039806127225250806101c95280611575528061166052806116e85280613ad05280613b165280613b8a5250806109955280610cb55280610d7c52806126d55280612a3e5280612e0552806132bf525080611375525080611354525061590e6000f3fe6080604052600436106101b95760003560e01c806301ffc9a71461022e57806306fdde0314610264578063081812fc14610286578063095ea7b3146102b35780630c49ccbe146102d357806312210e8a146102f457806313ead562146102fc57806318160ddd1461030f578063219f5d171461033157806323b872dd146103535780632f745c591461037357806330adf81f146103935780633644e515146103a857806342842e0e146103bd57806342966c68146103dd5780634659a494146103f057806349404b7c146104035780634aa4a4fc146104165780634f6ccce71461042b5780636352211e1461044b5780636c0360eb1461046b57806370a08231146104805780637ac2ff7b146104a057806388316456146104b357806395d89b41146104d657806399fbab88146104eb578063a22cb46514610523578063a4a78f0c14610543578063ac9650d814610556578063b88d4fde14610576578063c2e3140a14610596578063c45a0155146105a9578063c87b56dd146105be578063df2ab5bb146105de578063e985e9c5146105f1578063f3995c6714610611578063fc6f786514610624578063ffc2b1561461063757610229565b3661022957336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610227576040805162461bcd60e51b81526020600482015260096024820152684e6f7420574554483960b81b604482015290519081900360640190fd5b005b600080fd5b34801561023a57600080fd5b5061024e610249366004614d92565b610657565b60405161025b91906152d3565b60405180910390f35b34801561027057600080fd5b5061027961067a565b60405161025b9190615326565b34801561029257600080fd5b506102a66102a136600461508a565b610710565b60405161025b91906151b3565b3480156102bf57600080fd5b506102276102ce366004614c5d565b610763565b6102e66102e1366004614e56565b610839565b60405161025b9291906154ad565b610227610c81565b6102a661030a366004614af1565b610c93565b34801561031b57600080fd5b50610324610f87565b60405161025b91906152de565b61034461033f366004614e67565b610f98565b60405161025b93929190615468565b34801561035f57600080fd5b5061022761036e366004614b4a565b61129b565b34801561037f57600080fd5b5061032461038e366004614c5d565b6112f2565b34801561039f57600080fd5b5061032461131d565b3480156103b457600080fd5b5061032461132f565b3480156103c957600080fd5b506102276103d8366004614b4a565b6113ed565b6102276103eb36600461508a565b611408565b6102276103fe366004614cc9565b6114d7565b6102276104113660046150a2565b611571565b34801561042257600080fd5b506102a66116e6565b34801561043757600080fd5b5061032461044636600461508a565b61170a565b34801561045757600080fd5b506102a661046636600461508a565b611720565b34801561047757600080fd5b50610279611748565b34801561048c57600080fd5b5061032461049b366004614a9d565b61174d565b6102276104ae366004614cc9565b6117b5565b6104c66104c1366004614f22565b611b95565b60405161025b9493929190615489565b3480156104e257600080fd5b5061027961209b565b3480156104f757600080fd5b5061050b61050636600461508a565b6120fc565b60405161025b9c9b9a999897969594939291906154bb565b34801561052f57600080fd5b5061022761053e366004614c30565b61230d565b610227610551366004614cc9565b61240e565b610569610564366004614d24565b6124a7565b60405161025b9190615273565b34801561058257600080fd5b50610227610591366004614b8a565b6125e6565b6102276105a4366004614cc9565b612644565b3480156105b557600080fd5b506102a66126d3565b3480156105ca57600080fd5b506102796105d936600461508a565b6126f7565b6102276105ec366004614c88565b6127ad565b3480156105fd57600080fd5b5061024e61060c366004614ab9565b612885565b61022761061f366004614cc9565b6128b3565b6102e6610632366004614e3f565b612925565b34801561064357600080fd5b506102276106523660046150e9565b612df0565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107065780601f106106db57610100808354040283529160200191610706565b820191906000526020600020905b8154815290600101906020018083116106e957829003601f168201915b5050505050905090565b600061071b82612e6e565b6107405760405162461bcd60e51b81526004016107379061535f565b60405180910390fd5b506000908152600c6020526040902054600160601b90046001600160a01b031690565b600061076e82611720565b9050806001600160a01b0316836001600160a01b031614156107c15760405162461bcd60e51b81526004018080602001828103825260218152602001806158876021913960400191505060405180910390fd5b806001600160a01b03166107d3612e7b565b6001600160a01b031614806107ef57506107ef8161060c612e7b565b61082a5760405162461bcd60e51b81526004018080602001828103825260388152602001806157516038913960400191505060405180910390fd5b6108348383612e7f565b505050565b60008082356108483382612ef5565b6108645760405162461bcd60e51b815260040161073790615339565b836080013580610872612f91565b11156108bb576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b60006108cd6040870160208801614f34565b6001600160801b0316116108e057600080fd5b84356000908152600c602090815260409182902060018101549092600160801b9091046001600160801b03169161091b918901908901614f34565b6001600160801b0316816001600160801b0316101561093957600080fd5b6001828101546001600160501b03166000908152600b60209081526040808320815160608101835281546001600160a01b039081168252919095015490811692850192909252600160a01b90910462ffffff16908301526109ba7f000000000000000000000000000000000000000000000000000000000000000083612f95565b60018501549091506001600160a01b0382169063a34123a790600160501b8104600290810b91600160681b9004900b6109f960408e0160208f01614f34565b6040518463ffffffff1660e01b8152600401610a1793929190615300565b6040805180830381600087803b158015610a3057600080fd5b505af1158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6891906150c6565b909850965060408901358810801590610a85575088606001358710155b610aa15760405162461bcd60e51b8152600401610737906153ab565b6001840154600090610aca903090600160501b8104600290810b91600160681b9004900b613074565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401610afb91906152de565b60a06040518083038186803b158015610b1357600080fd5b505afa158015610b27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4b9190614f7e565b50509250925050610b7087600201548303876001600160801b0316600160801b6130c9565b6004880180546001600160801b03198116928e016001600160801b039182160181169290921790556003880154610bb191908303908816600160801b6130c9565b6004880180546001600160801b03808216938e01600160801b9283900482160116029190911790556002870182905560038701819055610bf760408d0160208e01614f34565b86038760010160106101000a8154816001600160801b0302191690836001600160801b031602179055508b600001357f26f6a048ee9138f2c0ce266f322cb99228e8d619ae2bff30c67f8dcf9d2377b48d6020016020810190610c5a9190614f34565b8d8d604051610c6b93929190615468565b60405180910390a2505050505050505050915091565b4715610c9157610c913347613178565b565b6000836001600160a01b0316856001600160a01b031610610cb357600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631698ee828686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff168152602001935050505060206040518083038186803b158015610d3e57600080fd5b505afa158015610d52573d6000803e3d6000fd5b505050506040513d6020811015610d6857600080fd5b505190506001600160a01b038116610e9e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a16712958686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018262ffffff1681526020019350505050602060405180830381600087803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b505050506040513d6020811015610e3157600080fd5b50516040805163f637731d60e01b81526001600160a01b03858116600483015291519293509083169163f637731d9160248082019260009290919082900301818387803b158015610e8157600080fd5b505af1158015610e95573d6000803e3d6000fd5b50505050610f7f565b6000816001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610ed957600080fd5b505afa158015610eed573d6000803e3d6000fd5b505050506040513d60e0811015610f0357600080fd5b505190506001600160a01b038116610f7d57816001600160a01b031663f637731d846040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015610f6457600080fd5b505af1158015610f78573d6000803e3d6000fd5b505050505b505b949350505050565b6000610f936002613267565b905090565b60008060008360a0013580610fab612f91565b1115610ff4576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b84356000908152600c602090815260408083206001808201546001600160501b0381168652600b855283862084516060808201875282546001600160a01b039081168352929094015480831682890190815262ffffff600160a01b9092048216838901908152885161014081018a528451861681529151909416818a0152925116828701523082850152600160501b8304600290810b810b608080850191909152600160681b909404810b900b60a0830152958c013560c0820152938b013560e0850152908a013561010084015289013561012083015292906110d690613272565b6001870154939a5091985096509150600090611109903090600160501b8104600290810b91600160681b9004900b613074565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b815260040161113a91906152de565b60a06040518083038186803b15801561115257600080fd5b505afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a9190614f7e565b505092509250506111c6866002015483038760010160109054906101000a90046001600160801b03166001600160801b0316600160801b6130c9565b6004870180546001600160801b0380821690930183166001600160801b03199091161790556003870154600188015461120d9291840391600160801b9182900416906130c9565b6004870180546001600160801b03600160801b80830482169094018116840291811691909117909155600288018490556003880183905560018801805483810483168e018316909302929091169190911790556040518b35906000805160206157fe83398151915290611285908d908d908d90615468565b60405180910390a2505050505050509193909250565b6112ac6112a6612e7b565b82612ef5565b6112e75760405162461bcd60e51b81526004018080602001828103825260318152602001806158a86031913960400191505060405180910390fd5b6108348383836134ad565b6001600160a01b038216600090815260016020526040812061131490836135e7565b90505b92915050565b60008051602061584783398151915281565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061139c6135f3565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b031681526020019550505050505060405160208183030381529060405280519060200120905090565b610834838383604051806020016040528060008152506125e6565b806114133382612ef5565b61142f5760405162461bcd60e51b815260040161073790615339565b6000828152600c602052604090206001810154600160801b90046001600160801b031615801561146a575060048101546001600160801b0316155b801561148857506004810154600160801b90046001600160801b0316155b6114a45760405162461bcd60e51b815260040161073790615403565b6000838152600c6020526040812081815560018101829055600281018290556003810182905560040155610834836135f7565b604080516323f2ebc360e21b815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e4810183905290516001600160a01b03881691638fcbaf0c9161010480830192600092919082900301818387803b15801561155157600080fd5b505af1158015611565573d6000803e3d6000fd5b50505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115e057600080fd5b505afa1580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b5051905082811015611658576040805162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b604482015290519081900360640190fd5b8015610834577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506108348282613178565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806117186002846136b2565b509392505050565b6000611317826040518060600160405280602981526020016157b360299139600291906136d0565b606090565b60006001600160a01b0382166117945760405162461bcd60e51b815260040180806020018281038252602a815260200180615789602a913960400191505060405180910390fd5b6001600160a01b038216600090815260016020526040902061131790613267565b836117be612f91565b1115611802576040805162461bcd60e51b815260206004820152600e60248201526d14195c9b5a5d08195e1c1a5c995960921b604482015290519081900360640190fd5b600061180c61132f565b6000805160206158478339815191528888611826816136dd565b604080516020808201969096526001600160a01b03909416848201526060840192909252608083015260a08083018a90528151808403909101815260c08301825280519084012061190160f01b60e084015260e2830194909452610102808301949094528051808303909401845261012290910190528151910120905060006118ae87611720565b9050806001600160a01b0316886001600160a01b031614156119015760405162461bcd60e51b81526004018080602001828103825260278152602001806156b46027913960400191505060405180910390fd5b61190a81613712565b15611a72576040805160208082018790528183018690526001600160f81b031960f889901b1660608301528251604181840301815260618301808552630b135d3f60e11b90526065830186815260858401948552815160a585015281516001600160a01b03871695631626ba7e958995919260c59091019185019080838360005b838110156119a357818101518382015260200161198b565b50505050905090810190601f1680156119d05780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6020811015611a1857600080fd5b50516001600160e01b031916630b135d3f60e11b14611a6d576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b611b81565b600060018387878760405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611ace573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611b2a576040805162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b604482015290519081900360640190fd5b816001600160a01b0316816001600160a01b031614611b7f576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b505b611b8b8888612e7f565b5050505050505050565b60008060008084610140013580611baa612f91565b1115611bf3576040805162461bcd60e51b8152602060048201526013602482015272151c985b9cd858dd1a5bdb881d1bdbc81bdb19606a1b604482015290519081900360640190fd5b604080516101408101909152600090611cbf9080611c1460208b018b614a9d565b6001600160a01b03168152602001896020016020810190611c359190614a9d565b6001600160a01b03168152602001611c5360608b0160408c01615070565b62ffffff168152306020820152604001611c7360808b0160608c01614dba565b60020b8152602001611c8b60a08b0160808c01614dba565b60020b81526020018960a0013581526020018960c0013581526020018960e001358152602001896101000135815250613272565b92975090955093509050611d0c611cde61014089016101208a01614a9d565b600d80546001600160b01b0319811660016001600160b01b0392831690810190921617909155975087613718565b6000611d3730611d2260808b0160608c01614dba565b611d3260a08c0160808d01614dba565b613074565b9050600080836001600160a01b031663514ea4bf846040518263ffffffff1660e01b8152600401611d6891906152de565b60a06040518083038186803b158015611d8057600080fd5b505afa158015611d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db89190614f7e565b505092509250506000611e318560405180606001604052808e6000016020810190611de39190614a9d565b6001600160a01b031681526020018e6020016020810190611e049190614a9d565b6001600160a01b031681526020018e6040016020810190611e259190615070565b62ffffff169052613833565b905060405180610140016040528060006001600160601b0316815260200160006001600160a01b03168152602001826001600160501b031681526020018c6060016020810190611e819190614dba565b60020b8152602001611e9960a08e0160808f01614dba565b60020b81526020018a6001600160801b0316815260200184815260200183815260200160006001600160801b0316815260200160006001600160801b0316815250600c60008c815260200190815260200160002060008201518160000160006101000a8154816001600160601b0302191690836001600160601b03160217905550602082015181600001600c6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160010160006101000a8154816001600160501b0302191690836001600160501b03160217905550606082015181600101600a6101000a81548162ffffff021916908360020b62ffffff160217905550608082015181600101600d6101000a81548162ffffff021916908360020b62ffffff16021790555060a08201518160010160106101000a8154816001600160801b0302191690836001600160801b0316021790555060c0820151816002015560e082015181600301556101008201518160040160006101000a8154816001600160801b0302191690836001600160801b031602179055506101208201518160040160106101000a8154816001600160801b0302191690836001600160801b03160217905550905050896000805160206157fe8339815191528a8a8a60405161208693929190615468565b60405180910390a25050505050509193509193565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156107065780601f106106db57610100808354040283529160200191610706565b6000818152600c6020908152604080832081516101408101835281546001600160601b03811682526001600160a01b03600160601b909104169381019390935260018101546001600160501b038116928401839052600160501b8104600290810b810b810b6060860152600160681b8204810b810b810b60808601526001600160801b03600160801b92839004811660a08701529083015460c0860152600383015460e0860152600490920154808316610100860152041661012083015282918291829182918291829182918291829182918291906121ed5760405162461bcd60e51b8152600401610737906153d9565b6000600b600083604001516001600160501b03166001600160501b031681526020019081526020016000206040518060600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905081600001518260200151826000015183602001518460400151866060015187608001518860a001518960c001518a60e001518b61010001518c61012001519d509d509d509d509d509d509d509d509d509d509d509d50505091939597999b5091939597999b565b612315612e7b565b6001600160a01b0316826001600160a01b03161415612377576040805162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015290519081900360640190fd5b8060056000612384612e7b565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556123c8612e7b565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b60408051636eb1769f60e11b81523360048201523060248201529051600019916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561245f57600080fd5b505afa158015612473573d6000803e3d6000fd5b505050506040513d602081101561248957600080fd5b5051101561249f5761249f8686868686866114d7565b505050505050565b6060816001600160401b03811180156124bf57600080fd5b506040519080825280602002602001820160405280156124f357816020015b60608152602001906001900390816124de5790505b50905060005b828110156125df576000803086868581811061251157fe5b90506020028101906125239190615555565b6040516125319291906151a3565b600060405180830381855af49150503d806000811461256c576040519150601f19603f3d011682016040523d82523d6000602084013e612571565b606091505b5091509150816125bd5760448151101561258a57600080fd5b600481019050808060200190518101906125a49190614dd6565b60405162461bcd60e51b81526004016107379190615326565b808484815181106125ca57fe5b602090810291909101015250506001016124f9565b5092915050565b6125f76125f1612e7b565b83612ef5565b6126325760405162461bcd60e51b81526004018080602001828103825260318152602001806158a86031913960400191505060405180910390fd5b61263e84848484613912565b50505050565b60408051636eb1769f60e11b8152336004820152306024820152905186916001600160a01b0389169163dd62ed3e91604480820192602092909190829003018186803b15801561269357600080fd5b505afa1580156126a7573d6000803e3d6000fd5b505050506040513d60208110156126bd57600080fd5b5051101561249f5761249f8686868686866128b3565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061270282612e6e565b61270b57600080fd5b60405163e9dc637560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e9dc63759061275990309086906004016152e7565b60006040518083038186803b15801561277157600080fd5b505afa158015612785573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113179190810190614dd6565b6000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156127fc57600080fd5b505afa158015612810573d6000803e3d6000fd5b505050506040513d602081101561282657600080fd5b5051905082811015612874576040805162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b604482015290519081900360640190fd5b801561263e5761263e848383613964565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6040805163d505accf60e01b8152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c4810183905290516001600160a01b0388169163d505accf9160e480830192600092919082900301818387803b15801561155157600080fd5b60008082356129343382612ef5565b6129505760405162461bcd60e51b815260040161073790615339565b60006129626060860160408701614f34565b6001600160801b0316118061298f575060006129846080860160608701614f34565b6001600160801b0316115b61299857600080fd5b6000806129ab6040870160208801614a9d565b6001600160a01b0316146129ce576129c96040860160208701614a9d565b6129d0565b305b85356000908152600c602090815260408083206001808201546001600160501b03168552600b8452828520835160608101855281546001600160a01b039081168252919092015490811694820194909452600160a01b90930462ffffff169183019190915292935090612a637f000000000000000000000000000000000000000000000000000000000000000083612f95565b600484015460018501549192506001600160801b0380821692600160801b9283900482169290041615612c5957600185015460405163a34123a760e01b81526001600160a01b0385169163a34123a791612ada91600160501b8104600290810b92600160681b909204900b90600090600401615300565b6040805180830381600087803b158015612af357600080fd5b505af1158015612b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2b91906150c6565b5050600185015460009081906001600160a01b0386169063514ea4bf90612b69903090600160501b8104600290810b91600160681b9004900b613074565b6040518263ffffffff1660e01b8152600401612b8591906152de565b60a06040518083038186803b158015612b9d57600080fd5b505afa158015612bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd59190614f7e565b50509250925050612c11876002015483038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6130c9565b84019350612c4a876003015482038860010160109054906101000a90046001600160801b03166001600160801b0316600160801b6130c9565b60028801929092556003870155015b6000806001600160801b038416612c7660608e0160408f01614f34565b6001600160801b031611612c9957612c9460608d0160408e01614f34565b612c9b565b835b836001600160801b03168d6060016020810190612cb89190614f34565b6001600160801b031611612cdb57612cd660808e0160608f01614f34565b612cdd565b835b60018901546040516309e3d67b60e31b81529294509092506001600160a01b03871691634f1eb3d891612d30918c91600160501b8104600290810b92600160681b909204900b908890889060040161520c565b6040805180830381600087803b158015612d4957600080fd5b505af1158015612d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d819190614f50565b6004890180546001600160801b03196001600160801b03918216600160801b878a0384160217168689038216179091556040519281169d50169a508c35907f40d0efd1a53d60ecbf40971b9daf7dc90178c3aadc7aab1765632738fa8b8f0190610c6b908b9086908690615249565b6000612dfe82840184614e78565b9050612e2e7f00000000000000000000000000000000000000000000000000000000000000008260000151613aab565b508415612e49578051516020820151612e4991903388613ace565b8315612e6757612e6781600001516020015182602001513387613ace565b5050505050565b6000611317600283613c5e565b3390565b6000818152600c6020526040902080546001600160601b0316600160601b6001600160a01b038516908102919091179091558190612ebc82611720565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612f0082612e6e565b612f3b5760405162461bcd60e51b815260040180806020018281038252602c815260200180615725602c913960400191505060405180910390fd5b6000612f4683611720565b9050806001600160a01b0316846001600160a01b03161480612f815750836001600160a01b0316612f7684610710565b6001600160a01b0316145b80610f7f5750610f7f8185612885565b4290565b600081602001516001600160a01b031682600001516001600160a01b031610612fbd57600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b604080516001600160601b0319606086901b16602080830191909152600285810b60e890811b60348501529085900b901b60378301528251601a818403018152603a90920190925280519101205b9392505050565b60008080600019858709868602925082811090839003039050806130ff57600084116130f457600080fd5b5082900490506130c2565b80841161310b57600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131c45780518252601f1990920191602091820191016131a5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613226576040519150601f19603f3d011682016040523d82523d6000602084013e61322b565b606091505b5050905080610834576040805162461bcd60e51b815260206004820152600360248201526253544560e81b604482015290519081900360640190fd5b600061131782613c6a565b6000806000806000604051806060016040528087600001516001600160a01b0316815260200187602001516001600160a01b03168152602001876040015162ffffff1681525090506132e47f000000000000000000000000000000000000000000000000000000000000000082612f95565b91506000826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561332157600080fd5b505afa158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190614fdf565b505050505050905060006133708860800151613c6e565b905060006133818960a00151613c6e565b90506133988383838c60c001518d60e00151613f95565b9750505050816001600160a01b0316633c8a7d8d876060015188608001518960a00151896040518060400160405280888152602001336001600160a01b03168152506040516020016133ea9190615428565b6040516020818303038152906040526040518663ffffffff1660e01b81526004016134199594939291906151c7565b6040805180830381600087803b15801561343257600080fd5b505af1158015613446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346a91906150c6565b6101008801519195509350841080159061348957508561012001518310155b6134a55760405162461bcd60e51b8152600401610737906153ab565b509193509193565b826001600160a01b03166134c082611720565b6001600160a01b0316146135055760405162461bcd60e51b815260040180806020018281038252602981526020018061581e6029913960400191505060405180910390fd5b6001600160a01b03821661354a5760405162461bcd60e51b81526004018080602001828103825260248152602001806156db6024913960400191505060405180910390fd5b613555838383610834565b613560600082612e7f565b6001600160a01b03831660009081526001602052604090206135829082614059565b506001600160a01b03821660009081526001602052604090206135a59082614065565b506135b260028284614071565b5080826001600160a01b0316846001600160a01b031660008051602061586783398151915260405160405180910390a4505050565b60006113148383614087565b4690565b600061360282611720565b905061361081600084610834565b61361b600083612e7f565b600082815260086020526040902054600260001961010060018416150201909116041561365957600082815260086020526040812061365991614a0d565b6001600160a01b038116600090815260016020526040902061367b9083614059565b506136876002836140eb565b5060405182906000906001600160a01b03841690600080516020615867833981519152908390a45050565b60008080806136c186866140f7565b909450925050505b9250929050565b6000610f7f848484614172565b6000908152600c6020526040902080546001600160601b0319811660016001600160601b039283169081019092161790915590565b3b151590565b6001600160a01b038216613773576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61377c81612e6e565b156137cd576040805162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b604482015290519081900360640190fd5b6137d960008383610834565b6001600160a01b03821660009081526001602052604090206137fb9082614065565b5061380860028284614071565b5060405181906001600160a01b03841690600090600080516020615867833981519152908290a45050565b6001600160a01b0382166000908152600a60205260409020546001600160501b0316806113175750600d805460016001600160501b03600160b01b8084048216838101909216026001600160b01b03909316929092179092556001600160a01b038085166000908152600a6020908152604080832080546001600160501b03191686179055848352600b825291829020865181549085166001600160a01b031991821617825591870151950180549287015162ffffff16600160a01b0262ffffff60a01b19969094169290911691909117939093161790915592915050565b61391d8484846134ad565b6139298484848461423c565b61263e5760405162461bcd60e51b81526004018080602001828103825260328152602001806156826032913960400191505060405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106139e05780518252601f1990920191602091820191016139c1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a42576040519150601f19603f3d011682016040523d82523d6000602084013e613a47565b606091505b5091509150818015613a75575080511580613a755750808060200190516020811015613a7257600080fd5b50515b612e67576040805162461bcd60e51b815260206004820152600260248201526114d560f21b604482015290519081900360640190fd5b6000613ab78383612f95565b9050336001600160a01b0382161461131757600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316148015613b0f5750804710155b15613c31577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015613b6f57600080fd5b505af1158015613b83573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015613bff57600080fd5b505af1158015613c13573d6000803e3d6000fd5b505050506040513d6020811015613c2957600080fd5b5061263e9050565b6001600160a01b038316301415613c5257613c4d848383613964565b61263e565b61263e848484846143a4565b600061131483836144f4565b5490565b60008060008360020b12613c85578260020b613c8d565b8260020b6000035b9050620d89e8811115613ccb576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216613cdf57600160801b613cf1565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b031690506002821615613d1b576ffff97272373d413259a46990580e213a0260801c5b6004821615613d3a576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615613d59576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615613d78576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615613d97576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615613db6576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615613dd5576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615613df5576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615613e15576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615613e35576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615613e55576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615613e75576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615613e95576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615613eb5576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615613ed5576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615613ef6576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615613f16576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615613f35576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615613f52576b048a170391f7dc42444e8fa20260801c5b60008460020b1315613f6d578060001981613f6957fe5b0490505b600160201b810615613f80576001613f83565b60005b60ff16602082901c0192505050919050565b6000836001600160a01b0316856001600160a01b03161115613fb5579293925b846001600160a01b0316866001600160a01b031611613fe057613fd985858561450c565b9050614050565b836001600160a01b0316866001600160a01b0316101561404257600061400787868661450c565b9050600061401687898661456f565b9050806001600160801b0316826001600160801b0316106140375780614039565b815b92505050614050565b61404d85858461456f565b90505b95945050505050565b600061131483836145ac565b60006113148383614672565b6000610f7f84846001600160a01b0385166146bc565b815460009082106140c95760405162461bcd60e51b81526004018080602001828103825260228152602001806156606022913960400191505060405180910390fd5b8260000182815481106140d857fe5b9060005260206000200154905092915050565b60006113148383614753565b81546000908190831061413b5760405162461bcd60e51b81526004018080602001828103825260228152602001806157dc6022913960400191505060405180910390fd5b600084600001848154811061414c57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161420d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141d25781810151838201526020016141ba565b50505050905090810190601f1680156141ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5084600001600182038154811061422057fe5b9060005260206000209060020201600101549150509392505050565b6000614250846001600160a01b0316613712565b61425c57506001610f7f565b600061436a630a85bd0160e11b614271612e7b565b88878760405160240180856001600160a01b03168152602001846001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156142d85781810151838201526020016142c0565b50505050905090810190601f1680156143055780820380516001836020036101000a031916815260200191505b5095505050505050604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001615682603291396001600160a01b0388169190614827565b9050600081806020019051602081101561438357600080fd5b50516001600160e01b031916630a85bd0160e11b1492505050949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b602083106144285780518252601f199092019160209182019101614409565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461448a576040519150601f19603f3d011682016040523d82523d6000602084013e61448f565b606091505b50915091508180156144bd5750805115806144bd57508080602001905160208110156144ba57600080fd5b50515b61249f576040805162461bcd60e51b815260206004820152600360248201526229aa2360e91b604482015290519081900360640190fd5b60009081526001919091016020526040902054151590565b6000826001600160a01b0316846001600160a01b0316111561452c579192915b600061454f856001600160a01b0316856001600160a01b0316600160601b6130c9565b905061405061456a84838888036001600160a01b03166130c9565b614836565b6000826001600160a01b0316846001600160a01b0316111561458f579192915b610f7f61456a83600160601b8787036001600160a01b03166130c9565b6000818152600183016020526040812054801561466857835460001980830191908101906000908790839081106145df57fe5b90600052602060002001549050808760000184815481106145fc57fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061462c57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611317565b6000915050611317565b600061467e83836144f4565b6146b457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611317565b506000611317565b6000828152600184016020526040812054806147215750506040805180820182528381526020808201848152865460018181018955600089815284812095516002909302909501918255915190820155865486845281880190925292909120556130c2565b8285600001600183038154811061473457fe5b90600052602060002090600202016001018190555060009150506130c2565b60008181526001830160205260408120548015614668578354600019808301919081019060009087908390811061478657fe5b90600052602060002090600202019050808760000184815481106147a657fe5b6000918252602080832084546002909302019182556001938401549184019190915583548252898301905260409020908401905586548790806147e557fe5b60008281526020808220600260001990940193840201828155600190810183905592909355888152898201909252604082209190915594506113179350505050565b6060610f7f848460008561484c565b806001600160801b038116811461067557600080fd5b60608247101561488d5760405162461bcd60e51b81526004018080602001828103825260268152602001806156ff6026913960400191505060405180910390fd5b61489685613712565b6148e7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600080866001600160a01b031685876040518082805190602001908083835b602083106149255780518252601f199092019160209182019101614906565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614987576040519150601f19603f3d011682016040523d82523d6000602084013e61498c565b606091505b509150915061499c8282866149a7565b979650505050505050565b606083156149b65750816130c2565b8251156149c65782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156141d25781810151838201526020016141ba565b50805460018160011615610100020316600290046000825580601f10614a335750614a51565b601f016020900490600052602060002090810190614a519190614a54565b50565b5b80821115614a695760008155600101614a55565b5090565b803561067581615609565b805161ffff8116811461067557600080fd5b803562ffffff8116811461067557600080fd5b600060208284031215614aae578081fd5b81356130c281615609565b60008060408385031215614acb578081fd5b8235614ad681615609565b91506020830135614ae681615609565b809150509250929050565b60008060008060808587031215614b06578182fd5b8435614b1181615609565b93506020850135614b2181615609565b9250614b2f60408601614a8a565b91506060850135614b3f81615609565b939692955090935050565b600080600060608486031215614b5e578081fd5b8335614b6981615609565b92506020840135614b7981615609565b929592945050506040919091013590565b60008060008060808587031215614b9f578182fd5b8435614baa81615609565b93506020850135614bba81615609565b92506040850135915060608501356001600160401b03811115614bdb578182fd5b8501601f81018713614beb578182fd5b8035614bfe614bf9826155bc565b615599565b818152886020838501011115614c12578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215614c42578182fd5b8235614c4d81615609565b91506020830135614ae68161561e565b60008060408385031215614c6f578182fd5b8235614c7a81615609565b946020939093013593505050565b600080600060608486031215614c9c578081fd5b8335614ca781615609565b9250602084013591506040840135614cbe81615609565b809150509250925092565b60008060008060008060c08789031215614ce1578384fd5b8635614cec81615609565b955060208701359450604087013593506060870135614d0a81615650565b9598949750929560808101359460a0909101359350915050565b60008060208385031215614d36578182fd5b82356001600160401b0380821115614d4c578384fd5b818501915085601f830112614d5f578384fd5b813581811115614d6d578485fd5b8660208083028501011115614d80578485fd5b60209290920196919550909350505050565b600060208284031215614da3578081fd5b81356001600160e01b0319811681146130c2578182fd5b600060208284031215614dcb578081fd5b81356130c28161562c565b600060208284031215614de7578081fd5b81516001600160401b03811115614dfc578182fd5b8201601f81018413614e0c578182fd5b8051614e1a614bf9826155bc565b818152856020838501011115614e2e578384fd5b6140508260208301602086016155dd565b600060808284031215614e50578081fd5b50919050565b600060a08284031215614e50578081fd5b600060c08284031215614e50578081fd5b60008183036080811215614e8a578182fd5b604080519081016001600160401b038082118383101715614ea757fe5b816040526060841215614eb8578485fd5b60a0830193508184108185111715614ecc57fe5b508260405284359250614ede83615609565b918252602084013591614ef083615609565b826060830152614f0260408601614a8a565b60808301528152614f1560608501614a6d565b6020820152949350505050565b60006101608284031215614e50578081fd5b600060208284031215614f45578081fd5b81356130c28161563b565b60008060408385031215614f62578182fd5b8251614f6d8161563b565b6020840151909250614ae68161563b565b600080600080600060a08688031215614f95578283fd5b8551614fa08161563b565b8095505060208601519350604086015192506060860151614fc08161563b565b6080870151909250614fd18161563b565b809150509295509295909350565b600080600080600080600060e0888a031215614ff9578485fd5b875161500481615609565b60208901519097506150158161562c565b955061502360408901614a78565b945061503160608901614a78565b935061503f60808901614a78565b925060a088015161504f81615650565b60c08901519092506150608161561e565b8091505092959891949750929550565b600060208284031215615081578081fd5b61131482614a8a565b60006020828403121561509b578081fd5b5035919050565b600080604083850312156150b4578182fd5b823591506020830135614ae681615609565b600080604083850312156150d8578182fd5b505080516020909101519092909150565b600080600080606085870312156150fe578182fd5b843593506020850135925060408501356001600160401b0380821115615122578384fd5b818701915087601f830112615135578384fd5b813581811115615143578485fd5b886020828501011115615154578485fd5b95989497505060200194505050565b6000815180845261517b8160208601602086016155dd565b601f01601f19169290920160200192915050565b60020b9052565b6001600160801b03169052565b6000828483379101908152919050565b6001600160a01b0391909116815260200190565b6001600160a01b0386168152600285810b602083015284900b60408201526001600160801b038316606082015260a06080820181905260009061499c90830184615163565b6001600160a01b03959095168552600293840b60208601529190920b60408401526001600160801b03918216606084015216608082015260a00190565b6001600160a01b039390931683526001600160801b03918216602084015216604082015260600190565b6000602080830181845280855180835260408601915060408482028701019250838701855b828110156152c657603f198886030184526152b4858351615163565b94509285019290850190600101615298565b5092979650505050505050565b901515815260200190565b90815260200190565b6001600160a01b03929092168252602082015260400190565b600293840b81529190920b60208201526001600160801b03909116604082015260600190565b6000602082526113146020830184615163565b6020808252600c908201526b139bdd08185c1c1c9bdd995960a21b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260149082015273507269636520736c69707061676520636865636b60601b604082015260600190565b60208082526010908201526f125b9d985b1a59081d1bdad95b88125160821b604082015260600190565b6020808252600b908201526a139bdd0818db19585c995960aa1b604082015260600190565b815180516001600160a01b03908116835260208083015182168185015260409283015162ffffff1692840192909252920151909116606082015260800190565b6001600160801b039390931683526020830191909152604082015260600190565b9384526001600160801b039290921660208401526040830152606082015260800190565b918252602082015260400190565b6001600160601b038d1681526001600160a01b038c811660208301528b811660408301528a16606082015262ffffff89166080820152600288900b60a0820152610180810161550d60c083018961518f565b61551a60e0830188615196565b8561010083015284610120830152615536610140830185615196565b615544610160830184615196565b9d9c50505050505050505050505050565b6000808335601e1984360301811261556b578283fd5b8301803591506001600160401b03821115615584578283fd5b6020019150368190038213156136c957600080fd5b6040518181016001600160401b03811182821017156155b457fe5b604052919050565b60006001600160401b038211156155cf57fe5b50601f01601f191660200190565b60005b838110156155f85781810151838201526020016155e0565b8381111561263e5750506000910152565b6001600160a01b0381168114614a5157600080fd5b8015158114614a5157600080fd5b8060020b8114614a5157600080fd5b6001600160801b0381168114614a5157600080fd5b60ff81168114614a5157600080fdfe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732315065726d69743a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e7366657220746f20746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e64733067048beee31b25b2f1681f88dac838c8bba36af25bfb2b7cf7473a5847e35f4552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9adddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564a2646970667358221220b5b610e7977f515fdb877da884752efa66013853561d5200beceb7024aecef3764736f6c63430007060033" /* -* cd ./solidity/lib/punch-swap-v3-contracts -* forge inspect src/periphery/libraries/NFTDescriptor.sol bytecode -* required for NonfungiblePositionDescriptor -*/ + * cd ./solidity/lib/punch-swap-v3-contracts + * forge inspect src/periphery/libraries/NFTDescriptor.sol bytecode + * required for NonfungiblePositionDescriptor + */ access(all) let nftDescriptorBytecode = "615aff610026600b82828239805160001a60731461001957fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063c49917d71461003a575b600080fd5b61004d610048366004613b0b565b610063565b60405161005a9190614144565b60405180910390f35b6060600061007e83610079856101800151610170565b6103b6565b905060006100b26100928560600151610471565b61009f8660800151610471565b6100ad876101a001516105dc565b6105f2565b905060006101006100c68660000151610624565b6100d38760800151610471565b6100e088602001516105dc565b6100ed89604001516105dc565b6100fb8a6101800151610170565b6106fe565b9050600061011561011087610734565b61096f565b9050610145848484846040516020016101319493929190613d62565b60405160208183030381529060405261096f565b60405160200161015591906140ff565b6040516020818303038152906040529450505050505b919050565b606062ffffff821661019b5750604080518082019091526002815261302560f01b602082015261016b565b816000805b62ffffff8316156101eb5760ff8116156101bc576001016101d5565b600a62ffffff84160662ffffff166000146101d5576001015b600190910190600a62ffffff84160492506101a0565b6101f3613a06565b6000600584106102e8576000600461020e8660ff8716610aba565b101561021b57600161021e565b60005b60ff90811691506102329085166001610aba565b61023d866005610aba565b106102695761026461025360ff86166001610aba565b61025e876005610aba565b90610aba565b61026c565b60005b60ff85166080850181905290925061028b9060019061025e9085610b17565b60ff90811660a085015260808401516102b29183916102ac91166001610aba565b90610b17565b60ff90811660408501526102da9082906102ac906102d39088166001610b17565b8590610b17565b60ff16602084015250610358565b6102f3600585610aba565b6002608084018190529091506103119060019061025e908490610b17565b60ff90811660a08401526103339061032c9085166002610b17565b8290610b17565b60ff1660208301819052610348906002610aba565b60ff166040830152600160c08301525b6103776103688560ff8616610aba565b62ffffff891690600a0a610b6f565b8252600160e08301526004841161038f57600061039a565b61039a846004610aba565b60ff1660608301526103ab82610bd3565b979650505050505050565b6060816103c68460600151610471565b6103d38560800151610471565b61040c8660e00151156103eb578661012001516103f2565b8661010001515b8761016001518860c001518960a001518a60e00151610de2565b6104458760e00151156104245787610100015161042b565b8761012001515b8861016001518960c001518a60a001518b60e00151610de2565b604051602001610459959493929190614044565b60405160208183030381529060405290505b92915050565b6060816000805b82518160ff1610156104bd57828160ff168151811061049357fe5b6020910101516001600160f81b031916601160f91b14156104b5576001909101905b600101610478565b5060ff8116156105d45760008160ff168351016001600160401b03811180156104e557600080fd5b506040519080825280601f01601f191660200182016040528015610510576020820181803683370190505b5090506000805b84518160ff1610156105c757848160ff168151811061053257fe5b6020910101516001600160f81b031916601160f91b141561057c57601760fa1b83838060010194508151811061056457fe5b60200101906001600160f81b031916908160001a9053505b848160ff168151811061058b57fe5b602001015160f81c60f81b8383806001019450815181106105a857fe5b60200101906001600160f81b031916908160001a905350600101610517565b508194505050505061016b565b509192915050565b606061046b6001600160a01b0383166014610ef7565b60608383838660405160200161060b9493929190613f20565b60405160208183030381529060405290505b9392505050565b60608161064957506040805180820190915260018152600360fc1b602082015261016b565b8160005b811561066157600101600a8204915061064d565b6000816001600160401b038111801561067957600080fd5b506040519080825280601f01601f1916602001820160405280156106a4576020820181803683370190505b50859350905060001982015b83156106f557600a840660300160f81b828280600190039350815181106106d357fe5b60200101906001600160f81b031916908160001a905350600a840493506106b0565b50949350505050565b60608385848489604051602001610719959493929190613e3d565b60405160208183030381529060405290505b95945050505050565b60606000604051806102a0016040528061075185602001516105dc565b815260200161076385604001516105dc565b8152602001846101a001516001600160a01b03168152602001846060015181526020018460800151815260200161079e856101800151610170565b815260200184610100015160020b815260200184610120015160020b815260200184610160015160020b81526020016107e7856101000151866101200151876101400151611055565b60000b81526020018460000151815260200161081185602001516001600160a01b0316608861108c565b815260200161082e85604001516001600160a01b0316608861108c565b815260200161084b85602001516001600160a01b0316600061108c565b815260200161086885604001516001600160a01b0316600061108c565b815260200161089b61088d86602001516001600160a01b03166010886000015161109b565b600060ff60106101126110bb565b81526020016108ce6108c086604001516001600160a01b03166010886000015161109b565b600060ff60646101e46110bb565b81526020016108f361088d86602001516001600160a01b03166020886000015161109b565b81526020016109186108c086604001516001600160a01b03166020886000015161109b565b815260200161093d61088d86602001516001600160a01b03166030886000015161109b565b81526020016109626108c086604001516001600160a01b03166030886000015161109b565b9052905061061d81611103565b6060815160001415610990575060408051602081019091526000815261016b565b6000604051806060016040528060408152602001614d64604091399050600060038451600201816109bd57fe5b0460040290506000816020016001600160401b03811180156109de57600080fd5b506040519080825280601f01601f191660200182016040528015610a09576020820181803683370190505b509050818152600183018586518101602084015b81831015610a75576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101610a1d565b600389510660018114610a8f5760028114610aa057610aac565b613d3d60f01b600119830152610aac565b603d60f81b6000198301525b509398975050505050505050565b600082821115610b11576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561061d576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b6000808211610bc2576040805162461bcd60e51b815260206004820152601a602482015279536166654d6174683a206469766973696f6e206279207a65726f60301b604482015290519081900360640190fd5b818381610bcb57fe5b049392505050565b60606000826020015160ff166001600160401b0381118015610bf457600080fd5b506040519080825280601f01601f191660200182016040528015610c1f576020820181803683370190505b5090508260e0015115610c5957602560f81b81600183510381518110610c4157fe5b60200101906001600160f81b031916908160001a9053505b8260c0015115610cb657600360fc1b81600081518110610c7557fe5b60200101906001600160f81b031916908160001a905350601760f91b81600181518110610c9e57fe5b60200101906001600160f81b031916908160001a9053505b608083015160ff165b60a0840151610cd29060ff166001610b17565b811015610d0957603060f81b828281518110610cea57fe5b60200101906001600160f81b031916908160001a905350600101610cbf565b505b82511561046b576000836060015160ff16118015610d365750826060015160ff16836040015160ff16145b15610d795760408301805160ff600019820181169092528251601760f91b92849216908110610d6157fe5b60200101906001600160f81b031916908160001a9053505b8251610d8b90603090600a9006610b17565b60f81b818460400180518091906001900360ff1660ff1681525060ff1681518110610db257fe5b60200101906001600160f81b031916908160001a905350600a8360000181815181610dd957fe5b04905250610d0b565b606084600281900b620d89e71981610df657fe5b050260020b8660020b1415610e50578115610e2c576040518060400160405280600381526020016209a82b60eb1b815250610e49565b6040518060400160405280600381526020016226a4a760e91b8152505b905061072b565b84600281900b620d89e881610e6157fe5b050260020b8660020b1415610eb7578115610e97576040518060400160405280600381526020016226a4a760e91b815250610e49565b5060408051808201909152600381526209a82b60eb1b602082015261072b565b6000610ec28761137b565b90508215610ee457610ee1600160c01b6001600160a01b038316610b6f565b90505b610eef8186866116a2565b91505061072b565b60606000826002026002016001600160401b0381118015610f1757600080fd5b506040519080825280601f01601f191660200182016040528015610f42576020820181803683370190505b509050600360fc1b81600081518110610f5757fe5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610f8057fe5b60200101906001600160f81b031916908160001a905350600160028402015b6001811115611001576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610fca57fe5b1a60f81b828281518110610fda57fe5b60200101906001600160f81b031916908160001a90535060049490941c9360001901610f9f565b50831561061d576040805162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015290519081900360640190fd5b60008360020b8260020b121561106e575060001961061d565b8260020b8260020b13156110845750600161061d565b50600061061d565b606061061d83831c600361185f565b600060ff826110aa8686611918565b02816110b257fe5b06949350505050565b60606110f96110f4846102ac6110d1888a610aba565b6110ee6110de888a610aba565b6110e88d8d610aba565b9061191f565b90610b6f565b610624565b9695505050505050565b606061110e82611978565b61112a8360000151846020015185606001518660800151611fd7565b611141846060015185608001518660a00151612302565b61115f8560c001518660e00151876101000151886101200151612452565b61117f611170876101400151610624565b8760c001518860e00151612735565b6111928761014001518860400151612b4d565b6040516020018087805190602001908083835b602083106111c45780518252601f1990920191602091820191016111a5565b51815160209384036101000a600019018019909216911617905289519190930192890191508083835b6020831061120c5780518252601f1990920191602091820191016111ed565b51815160209384036101000a600019018019909216911617905288519190930192880191508083835b602083106112545780518252601f199092019160209182019101611235565b51815160209384036101000a600019018019909216911617905287519190930192870191508083835b6020831061129c5780518252601f19909201916020918201910161127d565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b602083106112e45780518252601f1990920191602091820191016112c5565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b6020831061132c5780518252601f19909201916020918201910161130d565b5181516020939093036101000a6000190180199091169216919091179052651e17b9bb339f60d11b92019182525060408051808303601919018152600690920190529998505050505050505050565b60008060008360020b12611392578260020b61139a565b8260020b6000035b9050620d89e88111156113d8576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b6000600182166113ec57600160801b6113fe565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b031690506002821615611428576ffff97272373d413259a46990580e213a0260801c5b6004821615611447576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611466576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611485576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156114a4576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156114c3576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156114e2576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611502576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611522576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611542576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611562576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611582576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156115a2576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156115c2576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156115e2576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611603576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611623576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611642576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561165f576b048a170391f7dc42444e8fa20260801c5b60008460020b131561167a57806000198161167657fe5b0490505b600160201b81061561168d576001611690565b60005b60ff16602082901c0192505050919050565b606060006116b1858585612bc5565b905060006116c48283600160401b612cc7565b9050600160601b821080156116f9576116f2826c47bf19673df52e37f2410011d1602c1b600160801b612cc7565b915061170e565b61170b82620186a0600160801b612cc7565b91505b8160005b811561172657600101600a82049150611712565b600019016000806117378684612d76565b915091508015611748576001909201915b611750613a06565b85156117bd5761176f611767602b60ff8716610aba565b600790610b17565b60ff908116602083015260026080830152611795906001906102ac90602b908816610aba565b60ff90811660a083015260208201516117b091166001610aba565b60ff166040820152611834565b60098460ff1610611806576117d660ff85166004610aba565b60ff1660208201819052600560808301526117f2906001610aba565b60ff1660a082015260046040820152611834565b6006602082015260056040820181905261182b906001906102ac9060ff881690610aba565b60ff1660608201525b82815285151560c0820152600060e082015261184f81610bd3565b9c9b505050505050505050505050565b60606000826002026001600160401b038111801561187c57600080fd5b506040519080825280601f01601f1916602001820160405280156118a7576020820181803683370190505b5080519091505b8015611910576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106118d657fe5b1a60f81b8260018303815181106118e957fe5b60200101906001600160f81b031916908160001a90535060049490941c93600019016118ae565b509392505050565b1c60ff1690565b60008261192e5750600061046b565b8282028284828161193b57fe5b041461061d5760405162461bcd60e51b8152600401808060200182810382526021815260200180614f836021913960400191505060405180910390fd5b6060611a0d8261016001516040516020018080614b3d6081913960810182805190602001908083835b602083106119c05780518252601f1990920191602091820191016119a1565b6001836020036101000a038019825116818451168082178552505050505050905001806813979f1e17b9bb339f60b91b81525060090191505060405160208183030381529060405261096f565b611b6f836101e00151846102000151856101800151604051602001808061467a6063913960630184805190602001908083835b60208310611a5f5780518252601f199092019160209182019101611a40565b51815160209384036101000a600019018019909216911617905265272063793d2760d01b919093019081528551600690910192860191508083835b60208310611ab95780518252601f199092019160209182019101611a9a565b51815160209384036101000a6000190180199092169116179052722720723d273132307078272066696c6c3d272360681b919093019081528451601390910192850191508083835b60208310611b205780518252601f199092019160209182019101611b01565b6001836020036101000a038019825116818451168082178552505050505050905001806813979f1e17b9bb339f60b91b815250600901935050505060405160208183030381529060405261096f565b611bc0846102200151856102400151866101a00151604051602001808061467a60639139606301848051906020019080838360208310611a5f5780518252601f199092019160209182019101611a40565b611cd5856102600151866102800151876101c00151604051602001808061467a6063913960630184805190602001908083835b60208310611c125780518252601f199092019160209182019101611bf3565b51815160209384036101000a600019018019909216911617905265272063793d2760d01b919093019081528551600690910192860191508083835b60208310611c6c5780518252601f199092019160209182019101611c4d565b51815160001960209485036101000a01908116901991909116179052722720723d273130307078272066696c6c3d272360681b939091019283528451601390930192908501915080838360208310611b205780518252601f199092019160209182019101611b01565b6101608601516040516020018060566143f58239605601602c614da48239651e3232b3399f60d11b602c820152603201604b614af28239604b0186805190602001908083835b60208310611d3a5780518252601f199092019160209182019101611d1b565b6001836020036101000a0380198251168184511680821785525050505050509050018061562a603e9139603e0185805190602001908083835b60208310611d925780518252601f199092019160209182019101611d73565b6001836020036101000a03801982511681845116808217855250505050505090500180614bbe603e9139603e0184805190602001908083835b60208310611dea5780518252601f199092019160209182019101611dcb565b5181516020939093036101000a6000190180199091169216919091179052631110179f60e11b920191825250600401603b6142ed8239603b0183805190602001908083835b60208310611e4e5780518252601f199092019160209182019101611e2f565b6001836020036101000a0380198251168184511680821785525050505050509050018061473a60999139609901607f6151db8239607f0160886155a2823960880160416147d38239604101605d6157628239605d01607261528782396072016049614256823960490160be614a34823960be0160716145068239607101607561511e82396075016066614814823960660160a4614dd0823960a401608561566882397f3c6720636c69702d706174683d2275726c2823636f726e65727329223e00000060858201526b1e3932b1ba103334b6361e9160a11b60a2820152825160ae9091019060208401908083835b60208310611f5b5780518252601f199092019160209182019101611f3c565b6001836020036101000a0380198251168184511680821785525050505050509050018061487a60319139603101604e61429f8239604e01605d6146dd8239605d016041614d2382396041016052614bfc823960520160756156ed8239607501955050505050506040516020818303038152906040529050919050565b60608382858488878a89604051602001808061584560259139602501607d6149b78239607d0189805190602001908083835b602083106120285780518252601f199092019160209182019101612009565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528a516005909101928b0191508083835b602083106120815780518252601f199092019160209182019101612062565b6001836020036101000a038019825116818451168082178552505050505050905001806148ab6079913960790160866157bf823960860187805190602001908083835b602083106120e35780518252601f1990920191602091820191016120c4565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528851600590910192890191508083835b6020831061213c5780518252601f19909201916020918201910161211d565b6001836020036101000a0380198251168184511680821785525050505050509050018061448160859139608501607b6154108239607b0185805190602001908083835b6020831061219e5780518252601f19909201916020918201910161217f565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528651600590910192870191508083835b602083106121f75780518252601f1990920191602091820191016121d8565b6001836020036101000a038019825116818451168082178552505050505050905001806145cb605d9139605d0160a361507b823960a30183805190602001908083835b602083106122595780518252601f19909201916020918201910161223a565b51815160209384036101000a600019018019909216911617905264010714051160dd1b919093019081528451600590910192850191508083835b602083106122b25780518252601f199092019160209182019101612293565b6001836020036101000a038019825116818451168082178552505050505050905001806141cb608b9139608b01985050505050505050506040516020818303038152906040529050949350505050565b6060838383604051602001808061432860cd913960cd0184805190602001908083835b602083106123445780518252601f199092019160209182019101612325565b6001836020036101000a03801982511681845116808217855250505050505090500180602f60f81b81525060010183805190602001908083835b6020831061239d5780518252601f19909201916020918201910161237e565b6001836020036101000a038019825116818451168082178552505050505050905001806159ee6077913960770182805190602001908083835b602083106123f55780518252601f1990920191602091820191016123d6565b5181516020939093036101000a60001901801990911692169190911790526a1e17ba32bc3a1f1e17b39f60a91b920191825250600b01607361588e8239607301935050505060405160208183030381529060405290509392505050565b606060008260000b6001146124b9578260000b600019146124905760405180604001604052806005815260200164236e6f6e6560d81b8152506124b4565b6040518060400160405280600a81526020016911b330b23296b237bbb760b11b8152505b6124db565b60405180604001604052806008815260200167023666164652d75760c41b8152505b905060006124ea878787612de7565b9050818183836124f988613015565b60405160200180806c078ce40dac2e6d67a44eae4d85609b1b815250600d0186805190602001908083835b602083106125435780518252601f199092019160209182019101612524565b5181516020939093036101000a600019018019909116921691909117905261149160f11b9201918252506002016077614e74823960770185805190602001908083835b602083106125a55780518252601f199092019160209182019101612586565b6001836020036101000a038019825116818451168082178552505050505050905001806145776054913960540180700785ece7c78ce40dac2e6d67a44eae4d85607b1b81525060110184805190602001908083835b602083106126195780518252601f1990920191602091820191016125fa565b5181516020939093036101000a600019018019909116921691909117905261149160f11b9201918252506002016029614eeb82396029016045614f3e823960450180681e3830ba3410321e9160b91b81525060090183805190602001908083835b602083106126995780518252601f19909201916020918201910161267a565b6001836020036101000a038019825116818451168082178552505050505050905001806151936048913960480182805190602001908083835b602083106126f15780518252601f1990920191602091820191016126d2565b6001836020036101000a0380198251168184511680821785525050505050509050019550505050505060405160208183030381529060405292505050949350505050565b606060006127428461347c565b9050600061274f8461347c565b865183518251929350600490910191600a91820191016000806127728a8a613586565b9150915061278585600401600702610624565b8b61279586600401600702610624565b896127a587600401600702610624565b8a8787604051602001808061525a602d9139602d01806c1e3932b1ba103bb4b23a341e9160991b815250600d0189805190602001908083835b602083106127fd5780518252601f1990920191602091820191016127de565b6001836020036101000a03801982511681845116808217855250505050505090500180614c4e603d9139603d01608d6159018239608d0188805190602001908083835b6020831061285f5780518252601f199092019160209182019101612840565b5181516020939093036101000a60001901801990911692169190911790526a1e17ba32bc3a1f1e17b39f60a91b920191825250600b01602d615a9d8239602d01806c1e3932b1ba103bb4b23a341e9160991b815250600d0187805190602001908083835b602083106128e25780518252601f1990920191602091820191016128c3565b6001836020036101000a03801982511681845116808217855250505050505090500180614c4e603d9139603d016093614924823960930186805190602001908083835b602083106129445780518252601f199092019160209182019101612925565b5181516020939093036101000a60001901801990911692169190911790526a1e17ba32bc3a1f1e17b39f60a91b920191825250600b01602d6146288239602d01806c1e3932b1ba103bb4b23a341e9160991b815250600d0185805190602001908083835b602083106129c75780518252601f1990920191602091820191016129a8565b6001836020036101000a03801982511681845116808217855250505050505090500180614c4e603d9139603d01609361548b823960930184805190602001908083835b60208310612a295780518252601f199092019160209182019101612a0a565b6001836020036101000a03801982511681845116808217855250505050505090500180615a6560389139603801606061598e8239606001606461501782396064016025614655823960250183805190602001908083835b60208310612a9f5780518252601f199092019160209182019101612a80565b51815160209384036101000a6000190180199092169116179052630383c16160e51b919093019081528451600490910192850191508083835b60208310612af75780518252601f199092019160209182019101612ad8565b6001836020036101000a0380198251168184511680821785525050505050509050018061444b60369139603601985050505050505050506040516020818303038152906040529750505050505050509392505050565b6060612b598383613892565b15612baf5760405160200180608d6153838239608d016073614fa482396073016071614cb28239607101608a6152f98239608a01608461551e82396084019050604051602081830303815290604052905061046b565b5060408051602081019091526000815292915050565b600080612be0612bdb60ff8681169086166138f0565b613955565b9050600081118015612bf3575060128111155b15612cb4578260ff168460ff161115612c5d57612c27612c14826002610b6f565b6001600160a01b03871690600a0a61191f565b91506002810660011415612c5857612c55827003298b075b4b6a5240945790619b37fd4a600160801b612cc7565b91505b612caf565b612c7e612c6b826002610b6f565b6001600160a01b03871690600a0a610b6f565b91506002810660011415612caf57612cac82600160801b7003298b075b4b6a5240945790619b37fd4a612cc7565b91505b611910565b50506001600160a01b0390921692915050565b6000808060001985870986860292508281109083900303905080612cfd5760008411612cf257600080fd5b50829004905061061d565b808411612d0957600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600080600060058460ff161115612d9e57612d9b8560ff600419870116600a0a610b6f565b94505b60006004600a8706119050612db486600a610b6f565b95508015612dc3578560010195505b85620186a01415612dd957600a86049550600191505b5084925090505b9250929050565b606060008260020b85850360020b81612dfc57fe5b05905060048160020b13612e44576040518060400160405280601a8152602001794d3120314334312034312031303520313035203134352031343560301b8152509150611910565b60088160020b13612e8857604051806040016040528060198152602001784d31203143333320343920393720313133203134352031343560381b8152509150611910565b60108160020b13612ecc57604051806040016040528060198152602001784d31203143333320353720383920313133203134352031343560381b8152509150611910565b60208160020b13612f1057604051806040016040528060198152602001784d31203143323520363520383120313231203134352031343560381b8152509150611910565b60408160020b13612f5457604051806040016040528060198152602001784d31203143313720373320373320313239203134352031343560381b8152509150611910565b60808160020b13612f9757604051806040016040528060188152602001774d312031433920383120363520313337203134352031343560401b8152509150611910565b6101008160020b13612fdd576040518060400160405280601a8152602001794d31203143312038392035372e3520313435203134352031343560301b8152509150611910565b50506040805180820190915260188152774d312031433120393720343920313435203134352031343560401b60208201529392505050565b6040805180820182526002815261373360f01b6020808301919091528251808401845260038082526203139360ec1b82840152845180860186528181526232313760e81b818501528551808701909652908552620ccccd60ea1b928501929092526060939091906001600087900b148061309357508560000b600019145b1561328a578560000b600019146130aa57816130ac565b835b8660000b600019146130be57816130c0565b835b8760000b600019146130d257836130d4565b855b8860000b600019146130e657836130e8565b855b60405160200180806b1e31b4b931b6329031bc1e9160a11b815250600c0185805190602001908083835b602083106131315780518252601f199092019160209182019101613112565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528651600890910192870191508083835b6020831061318d5780518252601f19909201916020918201910161316e565b6001836020036101000a03801982511681845116808217855250505050505090500180614c8b6027913960270183805190602001908083835b602083106131e55780518252601f1990920191602091820191016131c6565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528451600890910192850191508083835b602083106132415780518252601f199092019160209182019101613222565b6001836020036101000a03801982511681845116808217855250505050505090500180614f14602a9139602a019450505050506040516020818303038152906040529450613473565b8383838360405160200180806b1e31b4b931b6329031bc1e9160a11b815250600c0185805190602001908083835b602083106132d75780518252601f1990920191602091820191016132b8565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528651600890910192870191508083835b602083106133335780518252601f199092019160209182019101613314565b51815160209384036101000a60001901801990921691161790527a383c1110391e911a383c11103334b6361e913bb434ba329110179f60291b919093019081526b1e31b4b931b6329031bc1e9160a11b601b8201528551602790910192860191508083835b602083106133b75780518252601f199092019160209182019101613398565b51815160209384036101000a600019018019909216911617905267383c111031bc9e9160c11b919093019081528451600890910192850191508083835b602083106134135780518252601f1990920191602091820191016133f4565b6001836020036101000a038019825116818451168082178552505050505050905001807a383c1110391e911a383c11103334b6361e913bb434ba329110179f60291b815250601b0194505050505060405160208183030381529060405294505b50505050919050565b6060600060405180602001604052806000815250905060008360020b12156134c25782600019029250604051806040016040528060018152602001602d60f81b81525090505b806134cf8460020b610624565b6040516020018083805190602001908083835b602083106135015780518252601f1990920191602091820191016134e2565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106135495780518252601f19909201916020918201910161352a565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050919050565b60608060006002858501810b0590506201e847198160020b12156135e257604051806040016040528060018152602001600760fb1b815250604051806040016040528060018152602001603760f81b8152509250925050612de0565b620124f7198160020b121561363257604051806040016040528060018152602001600760fb1b8152506040518060400160405280600481526020016331302e3560e01b8152509250925050612de0565b6161a7198160020b121561368257604051806040016040528060018152602001600760fb1b8152506040518060400160405280600581526020016431342e323560d81b8152509250925050612de0565b611387198160020b12156136d05760405180604001604052806002815260200161031360f41b81525060405180604001604052806002815260200161062760f31b8152509250925050612de0565b60008160020b121561371c5760405180604001604052806002815260200161313160f01b81525060405180604001604052806002815260200161323160f01b8152509250925050612de0565b6113888160020b12156137695760405180604001604052806002815260200161313360f01b81525060405180604001604052806002815260200161323360f01b8152509250925050612de0565b6161a88160020b12156137b65760405180604001604052806002815260200161313560f01b81525060405180604001604052806002815260200161323560f01b8152509250925050612de0565b620124f88160020b12156138045760405180604001604052806002815260200161062760f31b81525060405180604001604052806002815260200161191b60f11b8152509250925050612de0565b6201e8488160020b12156138525760405180604001604052806002815260200161323160f01b81525060405180604001604052806002815260200161323760f01b8152509250925050612de0565b604051806040016040528060028152602001610c8d60f21b81525060405180604001604052806002815260200161323760f01b8152509250925050612de0565b6040805160208082018590526001600160601b0319606085901b168284015282516034818403018152605490920190925280519101206000906138d48461396c565b60020260010160ff16600019816138e757fe5b04119392505050565b60008183038183128015906139055750838113155b8061391a575060008312801561391a57508381135b61061d5760405162461bcd60e51b815260040180806020018281038252602481526020018061586a6024913960400191505060405180910390fd5b600080821215613968578160000361046b565b5090565b600080821161397a57600080fd5b600160801b821061398d57608091821c91015b600160401b82106139a057604091821c91015b600160201b82106139b357602091821c91015b6201000082106139c557601091821c91015b61010082106139d657600891821c91015b601082106139e657600491821c91015b600482106139f657600291821c91015b6002821061016b57600101919050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b80356001600160a01b038116811461016b57600080fd5b8035801515811461016b57600080fd5b8035600281900b811461016b57600080fd5b600082601f830112613a93578081fd5b81356001600160401b03811115613aa657fe5b613ab9601f8201601f1916602001614177565b818152846020838601011115613acd578283fd5b816020850160208301379081016020019190915292915050565b803562ffffff8116811461016b57600080fd5b803560ff8116811461016b57600080fd5b600060208284031215613b1c578081fd5b81356001600160401b0380821115613b32578283fd5b81840191506101c0808387031215613b48578384fd5b613b5181614177565b905082358152613b6360208401613a4a565b6020820152613b7460408401613a4a565b6040820152606083013582811115613b8a578485fd5b613b9687828601613a83565b606083015250608083013582811115613bad578485fd5b613bb987828601613a83565b608083015250613bcb60a08401613afa565b60a0820152613bdc60c08401613afa565b60c0820152613bed60e08401613a61565b60e08201526101009150613c02828401613a71565b828201526101209150613c16828401613a71565b828201526101409150613c2a828401613a71565b828201526101609150613c3e828401613a71565b828201526101809150613c52828401613ae7565b828201526101a09150613c66828401613a4a565b91810191909152949350505050565b60008151613c8781856020860161419a565b9290920192915050565b7fe29aa0efb88f20444953434c41494d45523a204475652064696c6967656e636581527f20697320696d7065726174697665207768656e20617373657373696e6720746860208201527f6973204e46542e204d616b65207375726520746f6b656e20616464726573736560408201527f73206d617463682074686520657870656374656420746f6b656e732c2061732060608201527f746f6b656e2073796d626f6c73206d617920626520696d6974617465642e00006080820152609e0190565b632e372e3760e11b815260040190565b683d913730b6b2911d1160b91b81528451600090613d87816009850160208a0161419a565b71111610113232b9b1b934b83a34b7b7111d1160711b6009918401918201528551613db981601b840160208a0161419a565b8551910190613dcf81601b84016020890161419a565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527919185d184e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60321b60288201528351613e2081604284016020880161419a565b61227d60f01b604292909101918201526044019695505050505050565b60006901020b2323932b9b99d160b51b8083528751613e6381600a860160208c0161419a565b612e3760f11b600a918501918201528751613e8581600c840160208c0161419a565b01600c810191909152855190613ea2826016830160208a0161419a565b8181019150506b02e372332b2902a34b2b91d160a51b60168201528451613ed081602284016020890161419a565b6b02e372a37b5b2b71024a21d160a51b602292909101918201528351613efd81602e84016020880161419a565b613f13613f0e602e83850101613d52565b613c91565b9998505050505050505050565b60007f54686973204e465420726570726573656e74732061206c69717569646974792082527a03837b9b4ba34b7b71034b7103090283ab731b429bbb0b8102b199602d1b60208301528551613f7c81603b850160208a0161419a565b602d60f81b603b918401918201528551613f9d81603c840160208a0161419a565b660103837b7b617160cd1b603c92909101918201527f546865206f776e6572206f662074686973204e46542063616e206d6f646966796043820152791037b9103932b232b2b6903a3432903837b9b4ba34b7b7172e3760311b60638201526f02e372837b7b61020b2323932b9b99d160851b607d820152845161402781608d84016020890161419a565b612e3760f11b608d92909101918201526103ab608f820185613c75565b60006b0283ab731b429bbb0b81016960a51b8252865161406b81600c850160208b0161419a565b80830190506201016960ed1b80600c830152875161409081600f850160208c0161419a565b602f60f81b600f939091019283015286516140b2816010850160208b0161419a565b601092019182015284516140cd81601384016020890161419a565b611e1f60f11b6013929091019182015283516140f081601584016020880161419a565b01601501979650505050505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161413781601d85016020870161419a565b91909101601d0192915050565b600060208252825180602084015261416381604085016020870161419a565b601f01601f19169190910160400192915050565b6040518181016001600160401b038111828210171561419257fe5b604052919050565b60005b838110156141b557818101518382015260200161419d565b838111156141c4576000848401525b5050505056fe203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d223330732220726570656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506174683e3c2f746578743e3c73746f70206f66667365743d222e39222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e3c72656374207374796c653d2266696c7465723a2075726c28236631292220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22353030707822202f3e3c6665496d61676520726573756c743d2270332220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c67206d61736b3d2275726c2823666164652d73796d626f6c29223e3c726563742066696c6c3d226e6f6e652220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22323030707822202f3e203c7465787420793d22373070782220783d2233327078222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d7765696768743d223230302220666f6e742d73697a653d2233367078223e3c7376672077696474683d2232393022206865696768743d22353030222076696577426f783d2230203020323930203530302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672270782c2030707829222063783d22307078222063793d223070782220723d22347078222066696c6c3d227768697465222f3e3c2f673e203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d223330732220726570656174436f756e743d22696e646566696e69746522202f3e203c2f74657874506174683e3c6d61736b2069643d22666164652d757022206d61736b436f6e74656e74556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742077696474683d223122206865696768743d2231222066696c6c3d2275726c2823677261642d75702922202f3e3c2f6d61736b3e22207374726f6b653d227267626128302c302c302c302e332922207374726f6b652d77696474683d2233327078222066696c6c3d226e6f6e6522207374726f6b652d6c696e656361703d22726f756e6422202f3e203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d2233307322203c67207374796c653d227472616e73666f726d3a7472616e736c61746528323970782c20343434707829223e3c636972636c65207374796c653d227472616e73666f726d3a7472616e736c6174653364283c7376672077696474683d2732393027206865696768743d27353030272076696577426f783d2730203020323930203530302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e3c636972636c652063783d27203c67207374796c653d2266696c7465723a75726c2823746f702d726567696f6e2d626c7572293b207472616e73666f726d3a7363616c6528312e35293b207472616e73666f726d2d6f726967696e3a63656e74657220746f703b223e22202f3e3c6665426c656e64206d6f64653d226f7665726c61792220696e3d2270302220696e323d22703122202f3e3c6665426c656e64206d6f64653d226578636c7573696f6e2220696e323d22703222202f3e3c6665426c656e64206d6f64653d226f7665726c61792220696e323d2270332220726573756c743d22626c656e644f757422202f3e3c6665476175737369616e426c7572203c706174682069643d226d696e696d61702220643d224d3233342034343443323334203435372e393439203234322e323120343633203235332034363322202f3e3c6d61736b2069643d226e6f6e6522206d61736b436f6e74656e74556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742077696474683d223122206865696768743d2231222066696c6c3d22776869746522202f3e3c2f6d61736b3e2220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22353030707822202f3e203c616e696d6174652061646469746976653d2273756d22206174747269627574654e616d653d2273746172744f6666736574222066726f6d3d2230252220746f3d22313030252220626567696e3d22307322206475723d223330732220726570656174436f756e743d22696e646566696e69746522202f3e3c7465787420783d22313270782220793d22313770782220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747370616e2066696c6c3d2272676261283235352c3235352c3235352c302e3629223e4d696e205469636b3a203c2f747370616e3e3c74657874506174682073746172744f66667365743d222d31303025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c6c696e6561724772616469656e742069643d22677261642d646f776e222078313d2230222078323d2231222079313d2230222079323d2231223e3c73746f70206f66667365743d22302e30222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223122202f3e3c73746f70206f66667365743d22302e39222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e3c66696c7465722069643d226631223e3c6665496d61676520726573756c743d2270302220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c7376672077696474683d2732393027206865696768743d27353030272076696577426f783d2730203020323930203530302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f737667273e3c726563742077696474683d27323930707827206865696768743d273530307078272066696c6c3d2723222f3e3c6665496d61676520726573756c743d2270322220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c656c6c697073652063783d22353025222063793d22307078222072783d223138307078222072793d223132307078222066696c6c3d222330303022206f7061636974793d22302e383522202f3e3c2f673e707822206865696768743d2232367078222072783d22387078222072793d22387078222066696c6c3d227267626128302c302c302c302e362922202f3e70782220723d22347078222066696c6c3d22776869746522202f3e3c636972636c652063783d2231312e333437384c32342031324c31342e343334312031322e363532324c32322e333932332031384c31332e373831392031332e373831394c31382032322e333932334c31322e363532322031342e343334314c31322032344c31312e333437382031342e343334314c362032322e33393c726563742066696c6c3d226e6f6e652220783d223070782220793d22307078222077696474683d22323930707822206865696768743d22353030707822202f3e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f20786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273e3c6c696e6561724772616469656e742069643d22677261642d73796d626f6c223e3c73746f70206f66667365743d22302e37222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223122202f3e3c73746f70206f66667365743d222e3935222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223022202f3e3c2f6c696e6561724772616469656e743e207374796c653d227472616e73666f726d3a7472616e736c61746528373270782c313839707829223e3c7265637420783d222d313670782220793d222d31367078222077696474683d22313830707822206865696768743d223138307078222066696c6c3d226e6f6e6522202f3e3c7061746820643d22207374796c653d227472616e73666f726d3a7472616e736c61746528373270782c313839707829223e70782220723d2232347078222066696c6c3d226e6f6e6522207374726f6b653d22776869746522202f3e3c7265637420783d222d313670782220793d222d31367078222077696474683d22313830707822206865696768743d223138307078222066696c6c3d226e6f6e6522202f3e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f773c673e3c70617468207374796c653d227472616e73666f726d3a7472616e736c617465283670782c367078292220643d224d313220304c31322e3635323220392e35363538374c313820312e363037374c31332e373831392031302e323138314c32322e3339323320364c31342e34333431203c70617468207374726f6b652d6c696e656361703d22726f756e642220643d224d38203943382e30303030342032322e393439342031362e32303939203238203237203238222066696c6c3d226e6f6e6522207374726f6b653d22776869746522202f3e20726570656174436f756e743d22696e646566696e69746522202f3e3c2f74657874506174683e3c74657874506174682073746172744f66667365743d222d353025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c6d61736b2069643d22666164652d646f776e22206d61736b436f6e74656e74556e6974733d226f626a656374426f756e64696e67426f78223e3c726563742077696474683d223122206865696768743d2231222066696c6c3d2275726c2823677261642d646f776e2922202f3e3c2f6d61736b3e22207374726f6b653d2272676261283235352c3235352c3235352c3129222066696c6c3d226e6f6e6522207374726f6b652d6c696e656361703d22726f756e6422202f3e3c2f673e696e3d22626c656e644f75742220737464446576696174696f6e3d22343222202f3e3c2f66696c7465723e203c636c6970506174682069643d22636f726e657273223e3c726563742077696474683d2232393022206865696768743d22353030222072783d223432222072793d22343222202f3e3c2f636c6970506174683e203c67207374796c653d227472616e73666f726d3a7472616e736c61746528323970782c20333834707829223e3c6c696e6561724772616469656e742069643d22677261642d7570222078313d2231222078323d2230222079313d2231222079323d2230223e3c73746f70206f66667365743d22302e30222073746f702d636f6c6f723d227768697465222073746f702d6f7061636974793d223122202f3e32334c31302e323138312031332e373831394c312e363037372031384c392e35363538372031322e363532324c302031324c392e35363538372031312e333437384c312e3630373720364c31302e323138312031302e323138314c3620312e363037374c31312e3334373820392e35363538374c313220305a222066696c6c3d22776869746522202f3e3c67207374796c653d227472616e73666f726d3a7472616e736c6174652832323670782c20333932707829223e3c726563742077696474683d223336707822206865696768743d2233367078222072783d22387078222072793d22387078222066696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c74657874506174682073746172744f66667365743d22353025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c7465787420783d22313270782220793d22313770782220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747370616e2066696c6c3d2272676261283235352c3235352c3235352c302e3629223e4d6178205469636b3a203c2f747370616e3e3c616e696d6174655472616e73666f726d206174747269627574654e616d653d227472616e73666f726d2220747970653d22726f74617465222066726f6d3d22302031382031382220746f3d2233363020313820313822206475723d223130732220726570656174436f756e743d22696e646566696e697465222f3e3c2f673e3c2f673e3c706174682069643d22746578742d706174682d612220643d224d34302031322048323530204132382032382030203020312032373820343020563436302041323820323820302030203120323530203438382048343020413238203238203020302031203132203436302056343020413238203238203020302031203430203132207a22202f3e222f3e3c6665496d61676520726573756c743d2270312220786c696e6b3a687265663d22646174613a696d6167652f7376672b786d6c3b6261736536342c3c6d61736b2069643d22666164652d73796d626f6c22206d61736b436f6e74656e74556e6974733d227573657253706163654f6e557365223e3c726563742077696474683d22323930707822206865696768743d223230307078222066696c6c3d2275726c2823677261642d73796d626f6c2922202f3e3c2f6d61736b3e3c2f646566733e3c7265637420783d22302220793d2230222077696474683d2232393022206865696768743d22353030222072783d223432222072793d223432222066696c6c3d227267626128302c302c302c302922207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c2f673e3c66696c7465722069643d22746f702d726567696f6e2d626c7572223e3c6665476175737369616e426c757220696e3d22536f75726365477261706869632220737464446576696174696f6e3d22323422202f3e3c2f66696c7465723e3c2f74657874506174683e203c74657874506174682073746172744f66667365743d223025222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d22313070782220786c696e6b3a687265663d2223746578742d706174682d61223e3c7465787420746578742d72656e646572696e673d226f7074696d697a655370656564223e5369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f773c7265637420783d2231362220793d223136222077696474683d2232353822206865696768743d22343638222072783d223236222072793d223236222066696c6c3d227267626128302c302c302c302922207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c7465787420783d22313270782220793d22313770782220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d73697a653d2231327078222066696c6c3d227768697465223e3c747370616e2066696c6c3d2272676261283235352c3235352c3235352c302e3629223e49443a203c2f747370616e3e3c726563742077696474683d223336707822206865696768743d2233367078222072783d22387078222072793d22387078222066696c6c3d226e6f6e6522207374726f6b653d2272676261283235352c3235352c3235352c302e322922202f3e3c2f746578743e3c7465787420793d2231313570782220783d2233327078222066696c6c3d2277686974652220666f6e742d66616d696c793d2227436f7572696572204e6577272c206d6f6e6f73706163652220666f6e742d7765696768743d223230302220666f6e742d73697a653d2233367078223e3c2f746578743e3c2f673e3c67207374796c653d227472616e73666f726d3a7472616e736c6174652832323670782c20343333707829223e203c67207374796c653d227472616e73666f726d3a7472616e736c61746528323970782c20343134707829223ea26469706673582212204ed85b38f26d972764646f01eeda343ad75aeb3a83d256b494074e33f348d9f964736f6c63430007060033" /* -* > cd ./solidity/lib/punch-swap-v3-contracts -* > forge inspect src/periphery/EmulatorNonfungibleTokenPositionDescriptor.sol bytecode -* -* this contract contains a linkReference at position [1] -* which needs to be replaced with an address of deployed "src/periphery/libraries/NFTDescriptor.sol" -*/ + * > cd ./solidity/lib/punch-swap-v3-contracts + * > forge inspect src/periphery/EmulatorNonfungibleTokenPositionDescriptor.sol bytecode + * + * this contract contains a linkReference at position [1] + * which needs to be replaced with an address of deployed "src/periphery/libraries/NFTDescriptor.sol" + */ access(all) let nftPositionDescriptorBytecodeChunks = [ -"60c060405234801561001057600080fd5b5060405161147938038061147983398101604081905261002f9161005b565b6001600160601b0319606083901b1660805260a08190528181610050610059565b50505050610093565b565b6000806040838503121561006d578182fd5b82516001600160a01b0381168114610083578283fd5b6020939093015192949293505050565b60805160601c60a0516113a76100d2600039806101e0528061021452806102af5250806101155280610174528061055252806105a652506113a76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c80634aa4a4fc146100725780635ec0f502146100905780637e5af771146100b05780639d7b0ea8146100d0578063a18246e2146100e3578063b7af3cdc146100eb578063e9dc637514610100575b600080fd5b61007a610113565b60405161008791906111d0565b60405180910390f35b6100a361009e366004611057565b610137565b60405161008791906111ef565b6100c36100be366004610ead565b610151565b60405161008791906111e4565b6100a36100de366004610eed565b610170565b6100a36101de565b6100f3610202565b60405161008791906111f8565b6100f361010e366004610eed565b61030f565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060208181529281526040808220909352908152205481565b600061015d8383610170565b6101678584610170565b13949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156101b557506063196101d8565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b60208110801561024f57507f0000000000000000000000000000000000000000000000000000000000000000816020811061023e57fe5b1a60f81b6001600160f81b03191615155b1561025c57600101610207565b6000816001600160401b038111801561027457600080fd5b506040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b82811015610308577f000000000000000000000000000000000000000000000000000000000000000081602081106102d957fe5b1a60f81b8282815181106102e957fe5b60200101906001600160f81b031916908160001a9053506001016102a5565b5091505090565b60606000806000806000876001600160a01b03166399fbab88886040518263ffffffff1660e01b815260040161034591906111ef565b6101806040518083038186803b15801561035e57600080fd5b505afa158015610372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039691906110a0565b50505050509650965096509650965050506000610454896001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d9190610e8a565b6040518060600160405280896001600160a01b03168152602001886001600160a01b031681526020018762ffffff1681525061081f565b9050600061046587876100be6108fe565b9050600081156104755787610477565b865b9050600082156104875787610489565b885b90506000846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104c657600080fd5b505afa1580156104da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fe9190610fc8565b505050505091505073", -"__$9cd247c4105613f60afc31857a39206089$__", -"63c49917d7604051806101c001604052808f8152602001866001600160a01b03168152602001856001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146105975761059287610902565b61059f565b61059f610202565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316146105eb576105e686610902565b6105f3565b6105f3610202565b8152602001866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561063157600080fd5b505afa158015610645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106699190611086565b60ff168152602001856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190611086565b60ff16815260200187151581526020018a60020b81526020018960020b81526020018460020b8152602001886001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074657600080fd5b505afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190610f18565b60020b81526020018b62ffffff168152602001886001600160a01b03168152506040518263ffffffff1660e01b81526004016107ba919061120b565b60006040518083038186803b1580156107d257600080fd5b505af41580156107e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080e9190810190610f32565b9d9c50505050505050505050505050565b600081602001516001600160a01b031682600001516001600160a01b03161061084757600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b4690565b60606000610917836395d89b4160e01b61093c565b90508051600014156109345761092c83610b62565b915050610937565b90505b919050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b031985161781529151815160609360009384936001600160a01b03891693919290918291908083835b602083106109a85780518252601f199092019160209182019101610989565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610a08576040519150601f19603f3d011682016040523d82523d6000602084013e610a0d565b606091505b5091509150811580610a1e57508051155b15610a3c5760405180602001604052806000815250925050506101d8565b805160201415610a74576000818060200190516020811015610a5d57600080fd5b50519050610a6a81610b6f565b93505050506101d8565b604081511115610b4a57808060200190516020811015610a9357600080fd5b8101908080516040519392919084600160201b821115610ab257600080fd5b908301906020820185811115610ac757600080fd5b8251600160201b811182820188101715610ae057600080fd5b82525081516020918201929091019080838360005b83811015610b0d578181015183820152602001610af5565b50505050905090810190601f168015610b3a5780820380516001836020036101000a031916815260200191505b50604052505050925050506101d8565b50506040805160208101909152600081529392505050565b6060610934826006610c96565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015610bf9576000858260208110610baf57fe5b1a60f81b90506001600160f81b0319811615610bf05780848481518110610bd257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101610b98565b506000816001600160401b0381118015610c1257600080fd5b506040519080825280601f01601f191660200182016040528015610c3d576020820181803683370190505b50905060005b82811015610c8d57838181518110610c5757fe5b602001015160f81c60f81b828281518110610c6e57fe5b60200101906001600160f81b031916908160001a905350600101610c43565b50949350505050565b606060028206158015610ca95750600082115b8015610cb6575060288211155b610d07576040805162461bcd60e51b815260206004820152601e60248201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604482015290519081900360640190fd5b6000826001600160401b0381118015610d1f57600080fd5b506040519080825280601f01601f191660200182016040528015610d4a576020820181803683370190505b5090506001600160a01b03841660005b60028504811015610dee57600860138290030282901c600f600482901c1660f082168203610d8782610df8565b868560020281518110610d9657fe5b60200101906001600160f81b031916908160001a905350610db681610df8565b868560020260010181518110610dc857fe5b60200101906001600160f81b031916908160001a9053505060019092019150610d5a9050565b5090949350505050565b6000600a8260ff161015610e1357506030810160f81b610937565b506037810160f81b610937565b805161093781611359565b8051600281900b811461093757600080fd5b80516001600160801b038116811461093757600080fd5b805161ffff8116811461093757600080fd5b805162ffffff8116811461093757600080fd5b805160ff8116811461093757600080fd5b600060208284031215610e9b578081fd5b8151610ea681611359565b9392505050565b600080600060608486031215610ec1578182fd5b8335610ecc81611359565b92506020840135610edc81611359565b929592945050506040919091013590565b60008060408385031215610eff578182fd5b8235610f0a81611359565b946020939093013593505050565b600060208284031215610f29578081fd5b610ea682610e2b565b600060208284031215610f43578081fd5b81516001600160401b0380821115610f59578283fd5b818401915084601f830112610f6c578283fd5b815181811115610f7857fe5b604051601f8201601f191681016020018381118282101715610f9657fe5b604052818152838201602001871015610fad578485fd5b610fbe826020830160208701611329565b9695505050505050565b600080600080600080600060e0888a031215610fe2578283fd5b8751610fed81611359565b9650610ffb60208901610e2b565b955061100960408901610e54565b945061101760608901610e54565b935061102560808901610e54565b925061103360a08901610e79565b915060c08801518015158114611047578182fd5b8091505092959891949750929550565b60008060408385031215611069578182fd5b82359150602083013561107b81611359565b809150509250929050565b600060208284031215611097578081fd5b610ea682610e79565b6000806000806000806000806000806000806101808d8f0312156110c2578485fd5b8c516001600160601b03811681146110d8578586fd5b9b506110e660208e01610e20565b9a506110f460408e01610e20565b995061110260608e01610e20565b985061111060808e01610e66565b975061111e60a08e01610e2b565b965061112c60c08e01610e2b565b955061113a60e08e01610e3d565b94506101008d015193506101208d015192506111596101408e01610e3d565b91506111686101608e01610e3d565b90509295989b509295989b509295989b565b6001600160a01b03169052565b15159052565b60020b9052565b600081518084526111ac816020860160208601611329565b601f01601f19169290920160200192915050565b62ffffff169052565b60ff169052565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b600060208252610ea66020830184611194565b60006020825282516020830152602083015161122a604084018261117a565b50604083015161123d606084018261117a565b5060608301516101c080608085015261125a6101e0850183611194565b91506080850151601f198584030160a08601526112778382611194565b92505060a085015161128c60c08601826111c9565b5060c085015161129f60e08601826111c9565b5060e08501516101006112b481870183611187565b86015190506101206112c88682018361118d565b86015190506101406112dc8682018361118d565b86015190506101606112f08682018361118d565b86015190506101806113048682018361118d565b86015190506101a0611318868201836111c0565b8601519050610dee8583018261117a565b60005b8381101561134457818101518382015260200161132c565b83811115611353576000848401525b50505050565b6001600160a01b038116811461136e57600080fd5b5056fea26469706673582212206b6c14f9f0c03cfd3ce4ff104e8de3398f73b0a0b4d9ad39dfc53780fb1a655864736f6c63430007060033"] + "60c060405234801561001057600080fd5b5060405161147938038061147983398101604081905261002f9161005b565b6001600160601b0319606083901b1660805260a08190528181610050610059565b50505050610093565b565b6000806040838503121561006d578182fd5b82516001600160a01b0381168114610083578283fd5b6020939093015192949293505050565b60805160601c60a0516113a76100d2600039806101e0528061021452806102af5250806101155280610174528061055252806105a652506113a76000f3fe608060405234801561001057600080fd5b506004361061006d5760003560e01c80634aa4a4fc146100725780635ec0f502146100905780637e5af771146100b05780639d7b0ea8146100d0578063a18246e2146100e3578063b7af3cdc146100eb578063e9dc637514610100575b600080fd5b61007a610113565b60405161008791906111d0565b60405180910390f35b6100a361009e366004611057565b610137565b60405161008791906111ef565b6100c36100be366004610ead565b610151565b60405161008791906111e4565b6100a36100de366004610eed565b610170565b6100a36101de565b6100f3610202565b60405161008791906111f8565b6100f361010e366004610eed565b61030f565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060208181529281526040808220909352908152205481565b600061015d8383610170565b6101678584610170565b13949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614156101b557506063196101d8565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606060005b60208110801561024f57507f0000000000000000000000000000000000000000000000000000000000000000816020811061023e57fe5b1a60f81b6001600160f81b03191615155b1561025c57600101610207565b6000816001600160401b038111801561027457600080fd5b506040519080825280601f01601f19166020018201604052801561029f576020820181803683370190505b50905060005b82811015610308577f000000000000000000000000000000000000000000000000000000000000000081602081106102d957fe5b1a60f81b8282815181106102e957fe5b60200101906001600160f81b031916908160001a9053506001016102a5565b5091505090565b60606000806000806000876001600160a01b03166399fbab88886040518263ffffffff1660e01b815260040161034591906111ef565b6101806040518083038186803b15801561035e57600080fd5b505afa158015610372573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039691906110a0565b50505050509650965096509650965050506000610454896001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156103e557600080fd5b505afa1580156103f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041d9190610e8a565b6040518060600160405280896001600160a01b03168152602001886001600160a01b031681526020018762ffffff1681525061081f565b9050600061046587876100be6108fe565b9050600081156104755787610477565b865b9050600082156104875787610489565b885b90506000846001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104c657600080fd5b505afa1580156104da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fe9190610fc8565b505050505091505073", + "__$9cd247c4105613f60afc31857a39206089$__", + "63c49917d7604051806101c001604052808f8152602001866001600160a01b03168152602001856001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146105975761059287610902565b61059f565b61059f610202565b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316146105eb576105e686610902565b6105f3565b6105f3610202565b8152602001866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561063157600080fd5b505afa158015610645573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106699190611086565b60ff168152602001856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156106aa57600080fd5b505afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190611086565b60ff16815260200187151581526020018a60020b81526020018960020b81526020018460020b8152602001886001600160a01b031663d0c93a7c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561074657600080fd5b505afa15801561075a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077e9190610f18565b60020b81526020018b62ffffff168152602001886001600160a01b03168152506040518263ffffffff1660e01b81526004016107ba919061120b565b60006040518083038186803b1580156107d257600080fd5b505af41580156107e6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261080e9190810190610f32565b9d9c50505050505050505050505050565b600081602001516001600160a01b031682600001516001600160a01b03161061084757600080fd5b50805160208083015160409384015184516001600160a01b0394851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301206001600160f81b031960a085015294901b6001600160601b03191660a183015260b58201939093527f26660e3e1d4c57d4b15194ab223b67c9fdb3c3d98d4b50513ac38b3166f8ac0960d5808301919091528251808303909101815260f5909101909152805191012090565b4690565b60606000610917836395d89b4160e01b61093c565b90508051600014156109345761092c83610b62565b915050610937565b90505b919050565b60408051600481526024810182526020810180516001600160e01b03166001600160e01b031985161781529151815160609360009384936001600160a01b03891693919290918291908083835b602083106109a85780518252601f199092019160209182019101610989565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610a08576040519150601f19603f3d011682016040523d82523d6000602084013e610a0d565b606091505b5091509150811580610a1e57508051155b15610a3c5760405180602001604052806000815250925050506101d8565b805160201415610a74576000818060200190516020811015610a5d57600080fd5b50519050610a6a81610b6f565b93505050506101d8565b604081511115610b4a57808060200190516020811015610a9357600080fd5b8101908080516040519392919084600160201b821115610ab257600080fd5b908301906020820185811115610ac757600080fd5b8251600160201b811182820188101715610ae057600080fd5b82525081516020918201929091019080838360005b83811015610b0d578181015183820152602001610af5565b50505050905090810190601f168015610b3a5780820380516001836020036101000a031916815260200191505b50604052505050925050506101d8565b50506040805160208101909152600081529392505050565b6060610934826006610c96565b604080516020808252818301909252606091600091906020820181803683370190505090506000805b6020811015610bf9576000858260208110610baf57fe5b1a60f81b90506001600160f81b0319811615610bf05780848481518110610bd257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101610b98565b506000816001600160401b0381118015610c1257600080fd5b506040519080825280601f01601f191660200182016040528015610c3d576020820181803683370190505b50905060005b82811015610c8d57838181518110610c5757fe5b602001015160f81c60f81b828281518110610c6e57fe5b60200101906001600160f81b031916908160001a905350600101610c43565b50949350505050565b606060028206158015610ca95750600082115b8015610cb6575060288211155b610d07576040805162461bcd60e51b815260206004820152601e60248201527f41646472657373537472696e675574696c3a20494e56414c49445f4c454e0000604482015290519081900360640190fd5b6000826001600160401b0381118015610d1f57600080fd5b506040519080825280601f01601f191660200182016040528015610d4a576020820181803683370190505b5090506001600160a01b03841660005b60028504811015610dee57600860138290030282901c600f600482901c1660f082168203610d8782610df8565b868560020281518110610d9657fe5b60200101906001600160f81b031916908160001a905350610db681610df8565b868560020260010181518110610dc857fe5b60200101906001600160f81b031916908160001a9053505060019092019150610d5a9050565b5090949350505050565b6000600a8260ff161015610e1357506030810160f81b610937565b506037810160f81b610937565b805161093781611359565b8051600281900b811461093757600080fd5b80516001600160801b038116811461093757600080fd5b805161ffff8116811461093757600080fd5b805162ffffff8116811461093757600080fd5b805160ff8116811461093757600080fd5b600060208284031215610e9b578081fd5b8151610ea681611359565b9392505050565b600080600060608486031215610ec1578182fd5b8335610ecc81611359565b92506020840135610edc81611359565b929592945050506040919091013590565b60008060408385031215610eff578182fd5b8235610f0a81611359565b946020939093013593505050565b600060208284031215610f29578081fd5b610ea682610e2b565b600060208284031215610f43578081fd5b81516001600160401b0380821115610f59578283fd5b818401915084601f830112610f6c578283fd5b815181811115610f7857fe5b604051601f8201601f191681016020018381118282101715610f9657fe5b604052818152838201602001871015610fad578485fd5b610fbe826020830160208701611329565b9695505050505050565b600080600080600080600060e0888a031215610fe2578283fd5b8751610fed81611359565b9650610ffb60208901610e2b565b955061100960408901610e54565b945061101760608901610e54565b935061102560808901610e54565b925061103360a08901610e79565b915060c08801518015158114611047578182fd5b8091505092959891949750929550565b60008060408385031215611069578182fd5b82359150602083013561107b81611359565b809150509250929050565b600060208284031215611097578081fd5b610ea682610e79565b6000806000806000806000806000806000806101808d8f0312156110c2578485fd5b8c516001600160601b03811681146110d8578586fd5b9b506110e660208e01610e20565b9a506110f460408e01610e20565b995061110260608e01610e20565b985061111060808e01610e66565b975061111e60a08e01610e2b565b965061112c60c08e01610e2b565b955061113a60e08e01610e3d565b94506101008d015193506101208d015192506111596101408e01610e3d565b91506111686101608e01610e3d565b90509295989b509295989b509295989b565b6001600160a01b03169052565b15159052565b60020b9052565b600081518084526111ac816020860160208601611329565b601f01601f19169290920160200192915050565b62ffffff169052565b60ff169052565b6001600160a01b0391909116815260200190565b901515815260200190565b90815260200190565b600060208252610ea66020830184611194565b60006020825282516020830152602083015161122a604084018261117a565b50604083015161123d606084018261117a565b5060608301516101c080608085015261125a6101e0850183611194565b91506080850151601f198584030160a08601526112778382611194565b92505060a085015161128c60c08601826111c9565b5060c085015161129f60e08601826111c9565b5060e08501516101006112b481870183611187565b86015190506101206112c88682018361118d565b86015190506101406112dc8682018361118d565b86015190506101606112f08682018361118d565b86015190506101806113048682018361118d565b86015190506101a0611318868201836111c0565b8601519050610dee8583018261117a565b60005b8381101561134457818101518382015260200161132c565b83811115611353576000848401525b50505050565b6001600160a01b038116811461136e57600080fd5b5056fea26469706673582212206b6c14f9f0c03cfd3ce4ff104e8de3398f73b0a0b4d9ad39dfc53780fb1a655864736f6c63430007060033"] access(all) fun transferFlow(signer: Test.TestAccount, recipient: Address, amount: UFix64) { @@ -662,7 +662,7 @@ fun getEVMAddressHexFromEvents(_ evts: [AnyStruct], idx: Int): String { Test.assert(evts.length > idx, message: "Event index out of bounds") let evt = evts[idx] as? EVM.TransactionExecuted - ?? panic("Event at index ".concat(idx.toString()).concat(" is not a TransactionExecuted event")) + ?? panic("Event at index ".concat(idx.toString()).concat(" is not a TransactionExecuted event")) let emittedAddress = evt.contractAddress Test.assert(emittedAddress.length != 0, message: "Emitted .contractAddress value is empty") @@ -800,26 +800,24 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun Test.expect(err, Test.beNil()) // Deploy registry - let registryAddressHex = evmDeploy( + let registryAddressHex = evmDeploy( bridgeAccount, - registryBytecode, + registryBytecode, [] - ) - log(registryAddressHex) + ) + // Deploy ERC20Deployer let erc20DeployerAddressHex = evmDeploy( bridgeAccount, erc20DeployerBytecode, [] ) - log(erc20DeployerAddressHex) // Deploy ERC721Deployer let erc721DeployerAddressHex = evmDeploy( bridgeAccount, erc721DeployerBytecode, [] ) - log(erc721DeployerAddressHex) // Assign contract addresses var evts = Test.eventsOfType(Type()) Test.assertEqual(25, evts.length) @@ -830,7 +828,6 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun compiledFactoryBytecode, [] ) - log(factoryAddressHex) // Assign the factory contract address evts = Test.eventsOfType(Type()) Test.assertEqual(26, evts.length) @@ -859,8 +856,6 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun /* Integrate EVM bridge contract */ - log("registryAddressHex") - log(registryAddressHex) // Set factory as registrar in registry let setRegistrarResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/set_registrar.cdc", @@ -987,9 +982,9 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun let setBridgedNFTDisplayViewResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_nft_display_view.cdc", [ - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // thumbnailURI - Type().identifier, // thumbnailFileTypeIdentifier - nil // ipfsFilePath + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // thumbnailURI + Type().identifier, // thumbnailFileTypeIdentifier + nil // ipfsFilePath ], bridgeAccount ) @@ -999,16 +994,16 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun let setBridgedNFTCollectionDisplayResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_nft_collection_display_view.cdc", [ - "https://port.flow.com", // externalURL - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // squareImageURI - Type().identifier, // squareImageFileTypeIdentifier - nil, // squareImageIPFSFilePath - "image/svg+xml", // squareImageMediaType - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // bannerImageURI - Type().identifier, // bannerImageFileTypeIdentifier - nil, // bannerImageIPFSFilePath - "image/svg+xml", // bannerImageMediaType - socialsDict // socialsDict + "https://port.flow.com", // externalURL + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // squareImageURI + Type().identifier, // squareImageFileTypeIdentifier + nil, // squareImageIPFSFilePath + "image/svg+xml", // squareImageMediaType + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // bannerImageURI + Type().identifier, // bannerImageFileTypeIdentifier + nil, // bannerImageIPFSFilePath + "image/svg+xml", // bannerImageMediaType + socialsDict // socialsDict ], bridgeAccount ) @@ -1017,12 +1012,12 @@ fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccoun let setFTDisplayResult = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_ft_display_view.cdc", [ - "https://port.flow.com", // externalURL - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // logoURI - Type().identifier, // logoFileTypeIdentifier - nil, // logoIPFSFilePath - "image/svg+xml", // logoMediaType - socialsDict // socialsDict + "https://port.flow.com", // externalURL + "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // logoURI + Type().identifier, // logoFileTypeIdentifier + nil, // logoIPFSFilePath + "image/svg+xml", // logoMediaType + socialsDict // socialsDict ], bridgeAccount ) @@ -1057,7 +1052,7 @@ fun evmDeploy(_ signer: Test.TestAccount, _ bytecode: String, _ args: [String]): let argsBytecode = EVM.encodeABI(args) let bytecodeWithArgs = String.encodeHex(bytecode.decodeHex().concat(argsBytecode)) - return evmDeployRaw(deployerAccount, bytecode: bytecodeWithArgs, gasLimit: UInt64(15_000_000), value: 0.0) + return evmDeployRaw(signer, bytecode: bytecodeWithArgs, gasLimit: UInt64(15_000_000), value: 0.0) } access(all) From 57943d84285c6ed8f0aa6845c894eea39ed929be Mon Sep 17 00:00:00 2001 From: Alex <12097569+nialexsan@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:21:11 -0500 Subject: [PATCH 5/7] wip univ3 test --- cadence/tests/scripts/get_evm_code.cdc | 4 +- cadence/tests/test_helpers.cdc | 367 ++----------------------- cadence/tests/univ3_connector_test.cdc | 26 +- 3 files changed, 47 insertions(+), 350 deletions(-) diff --git a/cadence/tests/scripts/get_evm_code.cdc b/cadence/tests/scripts/get_evm_code.cdc index 3662e30a..b717dad8 100644 --- a/cadence/tests/scripts/get_evm_code.cdc +++ b/cadence/tests/scripts/get_evm_code.cdc @@ -39,7 +39,7 @@ access(all) fun main(evmAddressHex: String): {String: String} { return { "address": evmAddressHex, - "hasCode": runtime.length > 0 ? "true" : "false", - "runtimeCodeHex": toHex(runtime) + "hasCode": runtime.length > 0 ? "true" : "false" + // "runtimeCodeHex": toHex(runtime) } } diff --git a/cadence/tests/test_helpers.cdc b/cadence/tests/test_helpers.cdc index e908c882..b538d14a 100644 --- a/cadence/tests/test_helpers.cdc +++ b/cadence/tests/test_helpers.cdc @@ -2,6 +2,7 @@ import Test import "EVM" import "MetadataViews" +import "FlowEVMBridgeTemplates" import "FlowToken" import "MOET" import "FlowALP" @@ -735,344 +736,6 @@ access(all) struct BridgeSetupResult { } } -access(all) -fun setupBridge(bridgeAccount: Test.TestAccount, serviceAccount: Test.TestAccount, unpause: Bool): BridgeSetupResult { - // TEMPORARY: Only included until emulator auto-deploys CrossVMMetadataViews - var err = Test.deployContract( - name: "CrossVMMetadataViews", - path: "../../imports/1d7e57aa55817448/CrossVMMetadataViews.cdc", - arguments: [] - ) - // Deploy supporting util contracts - err = Test.deployContract( - name: "ArrayUtils", - path: "../../imports/1e4aa0b87d10b141/ArrayUtils.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "StringUtils", - path: "../../imports/1e4aa0b87d10b141/StringUtils.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "ScopedFTProviders", - path: "../../imports/1e4aa0b87d10b141/ScopedFTProviders.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "Serialize", - path: "../../imports/1e4aa0b87d10b141/Serialize.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "SerializeMetadata", - path: "../../imports/1e4aa0b87d10b141/SerializeMetadata.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - - // Transfer bridge account some $FLOW - transferFlow(signer: serviceAccount, recipient: bridgeAccount.address, amount: 10_000.0) - transferFlow(signer: serviceAccount, recipient: deployerAccount.address, amount: 10_000.0) - // Configure bridge account with a COA - createCOA(bridgeAccount, fundingAmount: 1_000.0) - createCOA(deployerAccount, fundingAmount: 1_000.0) - - err = Test.deployContract( - name: "IBridgePermissions", - path: "../../imports/1e4aa0b87d10b141/IBridgePermissions.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "ICrossVM", - path: "../../imports/1e4aa0b87d10b141/ICrossVM.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "ICrossVMAsset", - path: "../../imports/1e4aa0b87d10b141/ICrossVMAsset.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "CrossVMNFT", - path: "../../imports/1e4aa0b87d10b141/CrossVMNFT.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "CrossVMToken", - path: "../../imports/1e4aa0b87d10b141/CrossVMToken.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridgeHandlerInterfaces", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeHandlerInterfaces.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridgeCustomAssociationTypes", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeCustomAssociationTypes.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridgeCustomAssociations", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeCustomAssociations.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridgeConfig", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeConfig.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - - // Deploy registry - let registryAddressHex = evmDeploy( - bridgeAccount, - registryBytecode, - [] - ) - - // Deploy ERC20Deployer - let erc20DeployerAddressHex = evmDeploy( - bridgeAccount, - erc20DeployerBytecode, - [] - ) - // Deploy ERC721Deployer - let erc721DeployerAddressHex = evmDeploy( - bridgeAccount, - erc721DeployerBytecode, - [] - ) - // Assign contract addresses - var evts = Test.eventsOfType(Type()) - Test.assertEqual(25, evts.length) - - // Deploy factory - let factoryAddressHex = evmDeploy( - bridgeAccount, - compiledFactoryBytecode, - [] - ) - // Assign the factory contract address - evts = Test.eventsOfType(Type()) - Test.assertEqual(26, evts.length) - Test.assertEqual(factoryAddressHex.length, 40) - - err = Test.deployContract( - name: "FlowEVMBridgeUtils", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeUtils.cdc", - arguments: [factoryAddressHex] - ) - Test.expect(err, Test.beNil()) - - err = Test.deployContract( - name: "FlowEVMBridgeResolver", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeResolver.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - - err = Test.deployContract( - name: "FlowEVMBridgeHandlers", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeHandlers.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - - /* Integrate EVM bridge contract */ - - // Set factory as registrar in registry - let setRegistrarResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/set_registrar.cdc", - [registryAddressHex], - bridgeAccount - ) - Test.expect(setRegistrarResult, Test.beSucceeded()) - // Set registry as registry in factory - let setRegistryResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/set_deployment_registry.cdc", - [registryAddressHex], - bridgeAccount - ) - Test.expect(setRegistryResult, Test.beSucceeded()) - // Set factory as delegatedDeployer in erc20Deployer - var setDelegatedDeployerResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/set_delegated_deployer.cdc", - [erc20DeployerAddressHex], - bridgeAccount - ) - Test.expect(setDelegatedDeployerResult, Test.beSucceeded()) - // Set factory as delegatedDeployer in erc721Deployer - setDelegatedDeployerResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/set_delegated_deployer.cdc", - [erc721DeployerAddressHex], - bridgeAccount - ) - Test.expect(setDelegatedDeployerResult, Test.beSucceeded()) - // add erc20Deployer under "ERC20" tag to factory - var addDeployerResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/add_deployer.cdc", - ["ERC20", erc20DeployerAddressHex], - bridgeAccount - ) - Test.expect(addDeployerResult, Test.beSucceeded()) - // add erc721Deployer under "ERC721" tag to factory - addDeployerResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm/add_deployer.cdc", - ["ERC721", erc721DeployerAddressHex], - bridgeAccount - ) - Test.expect(addDeployerResult, Test.beSucceeded()) - - /* End EVM bridge integration txns */ - - err = Test.deployContract( - name: "FlowEVMBridgeNFTEscrow", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeNFTEscrow.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridgeTokenEscrow", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeTokenEscrow.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridgeTemplates", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeTemplates.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - // Commit bridged NFT code - let bridgedNFTChunkResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/templates/upsert_contract_code_chunks.cdc", - ["bridgedNFT", bridgedNFTCodeChunks], - bridgeAccount - ) - Test.expect(bridgedNFTChunkResult, Test.beSucceeded()) - // Commit bridged Token code - let bridgedTokenChunkResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/templates/upsert_contract_code_chunks.cdc", - ["bridgedToken", bridgedTokenCodeChunks], - bridgeAccount - ) - Test.expect(bridgedNFTChunkResult, Test.beSucceeded()) - - err = Test.deployContract( - name: "IEVMBridgeNFTMinter", - path: "../../imports/1e4aa0b87d10b141/IEVMBridgeNFTMinter.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "IEVMBridgeTokenMinter", - path: "../../imports/1e4aa0b87d10b141/IEVMBridgeTokenMinter.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "IFlowEVMNFTBridge", - path: "../../imports/1e4aa0b87d10b141/IFlowEVMNFTBridge.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "IFlowEVMTokenBridge", - path: "../../imports/1e4aa0b87d10b141/IFlowEVMTokenBridge.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridge", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridge.cdc", - arguments: [] - ) - Test.expect(err, Test.beNil()) - err = Test.deployContract( - name: "FlowEVMBridgeAccessor", - path: "../../imports/1e4aa0b87d10b141/FlowEVMBridgeAccessor.cdc", - arguments: [serviceAccount.address] - ) - Test.expect(err, Test.beNil()) - - let claimAccessorResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/evm-integration/claim_accessor_capability_and_save_router.cdc", - ["FlowEVMBridgeAccessor", bridgeAccount.address], - serviceAccount - ) - Test.expect(claimAccessorResult, Test.beSucceeded()) - - // Configure metadata views for bridged NFTS & FTs - let setBridgedNFTDisplayViewResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_nft_display_view.cdc", - [ - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // thumbnailURI - Type().identifier, // thumbnailFileTypeIdentifier - nil // ipfsFilePath - ], - bridgeAccount - ) - Test.expect(setBridgedNFTDisplayViewResult, Test.beSucceeded()) - - let socialsDict: {String: String} = {} - let setBridgedNFTCollectionDisplayResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_nft_collection_display_view.cdc", - [ - "https://port.flow.com", // externalURL - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // squareImageURI - Type().identifier, // squareImageFileTypeIdentifier - nil, // squareImageIPFSFilePath - "image/svg+xml", // squareImageMediaType - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // bannerImageURI - Type().identifier, // bannerImageFileTypeIdentifier - nil, // bannerImageIPFSFilePath - "image/svg+xml", // bannerImageMediaType - socialsDict // socialsDict - ], - bridgeAccount - ) - Test.expect(setBridgedNFTCollectionDisplayResult, Test.beSucceeded()) - - let setFTDisplayResult = _executeTransaction( - "../../lib/flow-evm-bridge/cadence/transactions/bridge/admin/metadata/set_bridged_ft_display_view.cdc", - [ - "https://port.flow.com", // externalURL - "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg", // logoURI - Type().identifier, // logoFileTypeIdentifier - nil, // logoIPFSFilePath - "image/svg+xml", // logoMediaType - socialsDict // socialsDict - ], - bridgeAccount - ) - Test.expect(setFTDisplayResult, Test.beSucceeded()) - - if unpause { - // Unpause the bridge - updateBridgePauseStatus(bridgeAccount, pause: false) - } - - return BridgeSetupResult( - registryAddressHex: registryAddressHex, - erc20DeployerAddressHex: erc20DeployerAddressHex, - erc721DeployerAddressHex: erc721DeployerAddressHex - ) -} - access(all) fun evmDeployRaw(_ signer: Test.TestAccount, bytecode: String, gasLimit: UInt64, value: UFix64): String { let res = _executeTransaction( @@ -1108,10 +771,28 @@ fun evmCallRaw(_ signer: Test.TestAccount, target: String, calldata: String, gas Test.expect(res, beFailed ? Test.beFailed() : Test.beSucceeded()) } access(all) -fun evmCall(_ target: String, _ calldata: String) { - return evmCallRaw(deployerAccount, target: target, calldata: calldata, gasLimit: UInt64(15_000_000), value: 0, beFailed: false) +fun evmCall(_ signer: Test.TestAccount, _ target: String, _ calldata: String) { + return evmCallRaw(signer, target: target, calldata: calldata, gasLimit: UInt64(15_000_000), value: 0, beFailed: false) +} + +access(all) +fun evmScriptCallRaw(fromAddress: EVM.EVMAddress, toAddress: EVM.EVMAddress, calldata: String, gasLimit: UInt64, value: UInt, typeIdentifiers: [String]): [AnyStruct] { + let res = _executeScript( + // "../../lib/FlowALP/FlowActions/cadence/tests/scripts/call_raw.cdc", + "../../lib/FlowALP/FlowActions/cadence/tests/scripts/call_raw.cdc", + // [fromAddress.toString(), toAddress.toString(), calldata, gasLimit, value, typeIdentifiers] + [fromAddress.toString(), toAddress.toString(), calldata, gasLimit, value] + ) + Test.expect(res, Test.beSucceeded()) + return res.returnValue as? [AnyStruct] ?? [] } +access(all) +fun evmScriptCall(_ toAddress: EVM.EVMAddress, _ calldata: String, _ typeIdentifiers: [String]): [AnyStruct] { + let callerCOA = getCOA(serviceAccount.address)! + let callerCOAEVMAddress = EVM.addressFromString(callerCOA) + return evmScriptCallRaw(fromAddress: callerCOAEVMAddress, toAddress: toAddress, calldata: calldata, gasLimit: UInt64(15_000_000), value: 0, typeIdentifiers: typeIdentifiers) +} access(all) let uniV2FactoryBytecode = "608060405234801561001057600080fd5b506040516136863803806136868339818101604052602081101561003357600080fd5b5051600180546001600160a01b0319166001600160a01b03909216919091179055613623806100636000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063a2e74af61161005b578063a2e74af6146100fd578063c9c6539614610132578063e6a439051461016d578063f46901ed146101a857610088565b8063017e7e581461008d578063094b7415146100be5780631e3dd18b146100c6578063574f2ba3146100e3575b600080fd5b6100956101db565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6100956101f7565b610095600480360360208110156100dc57600080fd5b5035610213565b6100eb610247565b60408051918252519081900360200190f35b6101306004803603602081101561011357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661024d565b005b6100956004803603604081101561014857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661031a565b6100956004803603604081101561018357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602001351661076d565b610130600480360360208110156101be57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166107a0565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6003818154811061022057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60035490565b60015473ffffffffffffffffffffffffffffffffffffffff1633146102d357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156103b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056323a204944454e544943414c5f4144445245535345530000604482015290519081900360640190fd5b6000808373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106103f45783856103f7565b84845b909250905073ffffffffffffffffffffffffffffffffffffffff821661047e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f556e697377617056323a205a45524f5f41444452455353000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82811660009081526002602090815260408083208585168452909152902054161561051f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f556e697377617056323a20504149525f45584953545300000000000000000000604482015290519081900360640190fd5b6060604051806020016105319061086d565b6020820181038252601f19601f82011660405250905060008383604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b81526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140192505050604051602081830303815290604052805190602001209050808251602084016000f5604080517f485cc95500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152868116602483015291519297509087169163485cc9559160448082019260009290919082900301818387803b15801561065e57600080fd5b505af1158015610672573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff84811660008181526002602081815260408084208987168086529083528185208054978d167fffffffffffffffffffffffff000000000000000000000000000000000000000098891681179091559383528185208686528352818520805488168517905560038054600181018255958190527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b90950180549097168417909655925483519283529082015281517f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9929181900390910190a35050505092915050565b600260209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16331461082657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b612d748061087b8339019056fe60806040526001600c5534801561001557600080fd5b506040514690806052612d228239604080519182900360520182208282018252600a8352692ab734b9bbb0b8102b1960b11b6020938401528151808301835260018152603160f81b908401528151808401919091527fbfcc8ef98ffbf7b6c3fec7bf5185b566b9863e35a9d83acd49ad6824b5969738818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060035550600580546001600160a01b03191633179055612c1d806101056000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a7146105da578063d505accf146105e2578063dd62ed3e14610640578063fff6cae91461067b576101b9565b8063ba9a7a5614610597578063bc25cf771461059f578063c45a0155146105d2576101b9565b80637ecebe00116100d35780637ecebe00146104d757806389afcb441461050a57806395d89b4114610556578063a9059cbb1461055e576101b9565b80636a6278421461046957806370a082311461049c5780637464fc3d146104cf576101b9565b806323b872dd116101665780633644e515116101405780633644e51514610416578063485cc9551461041e5780635909c0d5146104595780635a3d549314610461576101b9565b806323b872dd146103ad57806330adf81f146103f0578063313ce567146103f8576101b9565b8063095ea7b311610197578063095ea7b3146103155780630dfe16811461036257806318160ddd14610393576101b9565b8063022c0d9f146101be57806306fdde03146102595780630902f1ac146102d6575b600080fd5b610257600480360360808110156101d457600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff604083013516919081019060808101606082013564010000000081111561021857600080fd5b82018360208201111561022a57600080fd5b8035906020019184600183028401116401000000008311171561024c57600080fd5b509092509050610683565b005b610261610d57565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102de610d90565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b61034e6004803603604081101561032b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610de5565b604080519115158252519081900360200190f35b61036a610dfc565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b61039b610e18565b60408051918252519081900360200190f35b61034e600480360360608110156103c357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610e1e565b61039b610efd565b610400610f21565b6040805160ff9092168252519081900360200190f35b61039b610f26565b6102576004803603604081101561043457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f2c565b61039b611005565b61039b61100b565b61039b6004803603602081101561047f57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611011565b61039b600480360360208110156104b257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113cb565b61039b6113dd565b61039b600480360360208110156104ed57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113e3565b61053d6004803603602081101561052057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166113f5565b6040805192835260208301919091528051918290030190f35b610261611892565b61034e6004803603604081101561057457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356118cb565b61039b6118d8565b610257600480360360208110156105b557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166118de565b61036a611ad4565b61036a611af0565b610257600480360360e08110156105f857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611b0c565b61039b6004803603604081101561065657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611dd8565b610257611df5565b600c546001146106f457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55841515806107075750600084115b61075c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180612b2f6025913960400191505060405180910390fd5b600080610767610d90565b5091509150816dffffffffffffffffffffffffffff168710801561079a5750806dffffffffffffffffffffffffffff1686105b6107ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612b786021913960400191505060405180910390fd5b600654600754600091829173ffffffffffffffffffffffffffffffffffffffff91821691908116908916821480159061085457508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614155b6108bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f556e697377617056323a20494e56414c49445f544f0000000000000000000000604482015290519081900360640190fd5b8a156108d0576108d0828a8d611fdb565b89156108e1576108e1818a8c611fdb565b86156109c3578873ffffffffffffffffffffffffffffffffffffffff166310d1e85c338d8d8c8c6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610a2f57600080fd5b505afa158015610a43573d6000803e3d6000fd5b505050506040513d6020811015610a5957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191955073ffffffffffffffffffffffffffffffffffffffff8316916370a0823191602480820192602092909190829003018186803b158015610acb57600080fd5b505afa158015610adf573d6000803e3d6000fd5b505050506040513d6020811015610af557600080fd5b5051925060009150506dffffffffffffffffffffffffffff85168a90038311610b1f576000610b35565b89856dffffffffffffffffffffffffffff160383035b9050600089856dffffffffffffffffffffffffffff16038311610b59576000610b6f565b89856dffffffffffffffffffffffffffff160383035b90506000821180610b805750600081115b610bd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612b546024913960400191505060405180910390fd5b6000610c09610beb84600363ffffffff6121e816565b610bfd876103e863ffffffff6121e816565b9063ffffffff61226e16565b90506000610c21610beb84600363ffffffff6121e816565b9050610c59620f4240610c4d6dffffffffffffffffffffffffffff8b8116908b1663ffffffff6121e816565b9063ffffffff6121e816565b610c69838363ffffffff6121e816565b1015610cd657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e697377617056323a204b0000000000000000000000000000000000000000604482015290519081900360640190fd5b5050610ce4848488886122e0565b60408051838152602081018390528082018d9052606081018c9052905173ffffffffffffffffffffffffffffffffffffffff8b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600c55505050505050505050565b6040518060400160405280600a81526020017f556e69737761702056320000000000000000000000000000000000000000000081525081565b6008546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000008304909116917c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b6000610df233848461259c565b5060015b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610ee85773ffffffffffffffffffffffffffffffffffffffff84166000908152600260209081526040808320338452909152902054610eb6908363ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610ef384848461260b565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60055473ffffffffffffffffffffffffffffffffffffffff163314610fb257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f556e697377617056323a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b60095481565b600a5481565b6000600c5460011461108457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611094610d90565b50600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905193955091935060009273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561110e57600080fd5b505afa158015611122573d6000803e3d6000fd5b505050506040513d602081101561113857600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b1580156111b157600080fd5b505afa1580156111c5573d6000803e3d6000fd5b505050506040513d60208110156111db57600080fd5b505190506000611201836dffffffffffffffffffffffffffff871663ffffffff61226e16565b90506000611225836dffffffffffffffffffffffffffff871663ffffffff61226e16565b9050600061123387876126ec565b600054909150806112705761125c6103e8610bfd611257878763ffffffff6121e816565b612878565b985061126b60006103e86128ca565b6112cd565b6112ca6dffffffffffffffffffffffffffff8916611294868463ffffffff6121e816565b8161129b57fe5b046dffffffffffffffffffffffffffff89166112bd868563ffffffff6121e816565b816112c457fe5b0461297a565b98505b60008911611326576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612bc16028913960400191505060405180910390fd5b6113308a8a6128ca565b61133c86868a8a6122e0565b811561137e5760085461137a906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600c5550949695505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600c5460011461146957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c81905580611479610d90565b50600654600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b1580156114fb57600080fd5b505afa15801561150f573d6000803e3d6000fd5b505050506040513d602081101561152557600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b15801561159957600080fd5b505afa1580156115ad573d6000803e3d6000fd5b505050506040513d60208110156115c357600080fd5b5051306000908152600160205260408120549192506115e288886126ec565b600054909150806115f9848763ffffffff6121e816565b8161160057fe5b049a5080611614848663ffffffff6121e816565b8161161b57fe5b04995060008b11801561162e575060008a115b611683576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612b996028913960400191505060405180910390fd5b61168d3084612992565b611698878d8d611fdb565b6116a3868d8c611fdb565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8916916370a08231916024808301926020929190829003018186803b15801561170f57600080fd5b505afa158015611723573d6000803e3d6000fd5b505050506040513d602081101561173957600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191965073ffffffffffffffffffffffffffffffffffffffff8816916370a0823191602480820192602092909190829003018186803b1580156117ab57600080fd5b505afa1580156117bf573d6000803e3d6000fd5b505050506040513d60208110156117d557600080fd5b505193506117e585858b8b6122e0565b811561182757600854611823906dffffffffffffffffffffffffffff808216916e01000000000000000000000000000090041663ffffffff6121e816565b600b555b604080518c8152602081018c9052815173ffffffffffffffffffffffffffffffffffffffff8f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600c81905550915091565b6040518060400160405280600681526020017f554e492d5632000000000000000000000000000000000000000000000000000081525081565b6000610df233848461260b565b6103e881565b600c5460011461194f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654600754600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff9485169490931692611a2b9285928792611a26926dffffffffffffffffffffffffffff169185916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6020811015611a1857600080fd5b50519063ffffffff61226e16565b611fdb565b600854604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611aca9284928792611a26926e01000000000000000000000000000090046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff8616916370a0823191602480820192602092909190829003018186803b1580156119ee57600080fd5b50506001600c5550565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b42841015611b7b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f556e697377617056323a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff80891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa158015611cdc573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590611d5757508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611dc257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f556e697377617056323a20494e56414c49445f5349474e415455524500000000604482015290519081900360640190fd5b611dcd89898961259c565b505050505050505050565b600260209081526000928352604080842090915290825290205481565b600c54600114611e6657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e697377617056323a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600c55600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051611fd49273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015611edd57600080fd5b505afa158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b158015611f7a57600080fd5b505afa158015611f8e573d6000803e3d6000fd5b505050506040513d6020811015611fa457600080fd5b50516008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166122e0565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b602083106120e157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016120a4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612143576040519150601f19603f3d011682016040523d82523d6000602084013e612148565b606091505b5091509150818015612176575080511580612176575080806020019051602081101561217357600080fd5b50515b6121e157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f556e697377617056323a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b60008115806122035750508082028282828161220057fe5b04145b610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b80820382811115610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6dffffffffffffffffffffffffffff841180159061230c57506dffffffffffffffffffffffffffff8311155b61237757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f556e697377617056323a204f564552464c4f5700000000000000000000000000604482015290519081900360640190fd5b60085463ffffffff428116917c0100000000000000000000000000000000000000000000000000000000900481168203908116158015906123c757506dffffffffffffffffffffffffffff841615155b80156123e257506dffffffffffffffffffffffffffff831615155b15612492578063ffffffff16612425856123fb86612a57565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169063ffffffff612a7b16565b600980547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092169290920201905563ffffffff8116612465846123fb87612a57565b600a80547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff92909216929092020190555b600880547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff888116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008883168102919091177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff871602179283905560408051848416815291909304909116602082015281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612641908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612683908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d602081101561278157600080fd5b5051600b5473ffffffffffffffffffffffffffffffffffffffff821615801594509192509061286457801561285f5760006127d86112576dffffffffffffffffffffffffffff88811690881663ffffffff6121e816565b905060006127e583612878565b90508082111561285c576000612813612804848463ffffffff61226e16565b6000549063ffffffff6121e816565b905060006128388361282c86600563ffffffff6121e816565b9063ffffffff612abc16565b9050600081838161284557fe5b04905080156128585761285887826128ca565b5050505b50505b612870565b8015612870576000600b555b505092915050565b600060038211156128bb575080600160028204015b818110156128b5578091506002818285816128a457fe5b0401816128ad57fe5b04905061288d565b506128c5565b81156128c5575060015b919050565b6000546128dd908263ffffffff612abc16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054612915908263ffffffff612abc16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000818310612989578161298b565b825b9392505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546129c8908263ffffffff61226e16565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554612a02908263ffffffff61226e16565b600090815560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6dffffffffffffffffffffffffffff166e0100000000000000000000000000000290565b60006dffffffffffffffffffffffffffff82167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841681612ab457fe5b049392505050565b80820182811015610df657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fdfe556e697377617056323a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f494e5055545f414d4f554e54556e697377617056323a20494e53554646494349454e545f4c4951554944495459556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4255524e4544556e697377617056323a20494e53554646494349454e545f4c49515549444954595f4d494e544544a265627a7a723158207dca18479e58487606bf70c79e44d8dee62353c9ee6d01f9a9d70885b8765f2264736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429a265627a7a723158202760f92d7fa1db6f5aa16307bad65df4ebcc8550c4b1f03755ab8dfd830c178f64736f6c63430005100032" access(all) let uniV2RouterBytecode = "60c06040523480156200001157600080fd5b506040516200577338038062005773833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6155ec62000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611e1e5280611fa252806120725280612179528061232c52806123c15280612673528061271a52806127ef52806128f452806129dc5280612a5d52806130ec5280613422528061347852806134ac528061352d528061374752806138f7528061398c5250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061225f528061240052806125a95280612a9c5280612ddf5280613071528061309a52806130ca52806132a75280613456528061382d52806139cb5280614434528061447752806147d752806149b85280614f335280615014528061509452506155ec6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d97565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612105565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b5080359060208101359060400135612525565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612532565b34801561096057600080fd5b50610969612671565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612695565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356126a2565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135612882565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612d65565b348015610b3157600080fd5b5061096961306f565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550613093945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356130c0565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613218565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356133a7565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356136d3565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612d65565b9093509150610e96898685613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613ce9565b50965096945050505050565b6000610f44848484613e26565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166140b0565b8560008151811061124a57fe5b602002602001015161419b565b6112968287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061436b915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613ce9565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846145f2565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f6140b0565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612d65565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b61162a868660008181106111a257fe5b6113598287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154e76027913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006140b0565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d6126a2565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a61419b565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bc657600080fd5b505afa158015611bda573d6000803e3d6000fd5b505050506040513d6020811015611bf057600080fd5b50516040805160208881028281018201909352888252929350611c32929091899189918291850190849080828437600092019190915250889250614780915050565b86611d368288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c6557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b505afa158015611d12573d6000803e3d6000fd5b505050506040513d6020811015611d2857600080fd5b50519063ffffffff614b1316565b1015611d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b5050505050505050565b8042811015611e0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e6c57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f0b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611f1b85856000818110611a7e57fe5b611f59858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614780915050565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611fe957600080fd5b505afa158015611ffd573d6000803e3d6000fd5b505050506040513d602081101561201357600080fd5b5051905086811015612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b50505050611d8d8482613ce9565b6060814281101561217757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106121bb57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461225a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6122b87f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613f4a92505050565b915086826001845103815181106122cb57fe5b6020026020010151101561232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615534602b913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061237357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123a657600080fd5b505af11580156123ba573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61242c7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061243957fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156124aa57600080fd5b505af11580156124be573d6000803e3d6000fd5b505050506040513d60208110156124d457600080fd5b50516124dc57fe5b61251b8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b5095945050505050565b6000610f44848484614b85565b606081428110156125a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6126027f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150868260008151811061261257fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154e76027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614ca9565b6000814281101561271457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b612743887f00000000000000000000000000000000000000000000000000000000000000008989893089612d65565b604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290519194506127ed92508a91879173ffffffffffffffffffffffffffffffffffffffff8416916370a0823191602480820192602092909190829003018186803b1580156127bc57600080fd5b505afa1580156127d0573d6000803e3d6000fd5b505050506040513d60208110156127e657600080fd5b5051613b22565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b505050506113598483613ce9565b80428110156128f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061293657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146129d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4257600080fd5b505af1158015612a56573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612ac87f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3257600080fd5b505af1158015612b46573d6000803e3d6000fd5b505050506040513d6020811015612b5c57600080fd5b5051612b6457fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b9457fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612c2d57600080fd5b505afa158015612c41573d6000803e3d6000fd5b505050506040513d6020811015612c5757600080fd5b50516040805160208981028281018201909352898252929350612c999290918a918a918291850190849080828437600092019190915250899250614780915050565b87611d368289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612ccc57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b6000808242811015612dd857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b6000612e057f00000000000000000000000000000000000000000000000000000000000000008c8c6140b0565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612e8657600080fd5b505af1158015612e9a573d6000803e3d6000fd5b505050506040513d6020811015612eb057600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612f2357600080fd5b505af1158015612f37573d6000803e3d6000fd5b505050506040513d6040811015612f4d57600080fd5b50805160209091015190925090506000612f678e8e614d89565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612fa4578183612fa7565b82825b90975095508a871015613005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061550e6026913960400191505060405180910390fd5b8986101561305e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154746026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613f4a565b60008060006131107f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006140b0565b905060008761311f578c613141565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156131dd57600080fd5b505af11580156131f1573d6000803e3d6000fd5b505050506132038e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b6000806000834281101561328d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61329b8c8c8c8c8c8c614edc565b909450925060006132cd7f00000000000000000000000000000000000000000000000000000000000000008e8e6140b0565b90506132db8d33838861419b565b6132e78c33838761419b565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561336657600080fd5b505af115801561337a573d6000803e3d6000fd5b505050506040513d602081101561339057600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561341c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b61344a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614edc565b9094509250600061349c7f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006140b0565b90506134aa8b33838861419b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561351257600080fd5b505af1158015613526573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156135d257600080fd5b505af11580156135e6573d6000803e3d6000fd5b505050506040513d60208110156135fc57600080fd5b505161360457fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561368357600080fd5b505af1158015613697573d6000803e3d6000fd5b505050506040513d60208110156136ad57600080fd5b50519250348410156136c5576136c533853403613ce9565b505096509650969350505050565b6060814281101561374557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f556e69737761705632526f757465723a20455850495245440000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061378957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461382857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b6138867f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506145f292505050565b9150348260008151811061389657fe5b602002602001015111156138f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806154e76027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061393e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561397157600080fd5b505af1158015613985573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6139f77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b84600081518110613a0457fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613a7557600080fd5b505af1158015613a89573d6000803e3d6000fd5b505050506040513d6020811015613a9f57600080fd5b5051613aa757fe5b613ae68287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061436b915050565b81600081518110613af357fe5b602002602001015134111561251b5761251b3383600081518110613b1357fe5b60200260200101513403613ce9565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613bf857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613bbb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613c5a576040519150601f19603f3d011682016040523d82523d6000602084013e613c5f565b606091505b5091509150818015613c8d575080511580613c8d5750808060200190516020811015613c8a57600080fd5b50515b613ce2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d81526020018061555f602d913960400191505060405180910390fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613d6057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613d23565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613dc2576040519150601f19603f3d011682016040523d82523d6000602084013e613dc7565b606091505b5050905080613e21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603481526020018061541b6034913960400191505060405180910390fd5b505050565b6000808411613e80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061558c602b913960400191505060405180910390fd5b600083118015613e905750600082115b613ee5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061549a6028913960400191505060405180910390fd5b6000613ef9856103e563ffffffff6151dd16565b90506000613f0d828563ffffffff6151dd16565b90506000613f3383613f27886103e863ffffffff6151dd16565b9063ffffffff61526316565b9050808281613f3e57fe5b04979650505050505050565b6060600282511015613fbd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613fd557600080fd5b50604051908082528060200260200182016040528015613fff578160200160208202803683370190505b509050828160008151811061401057fe5b60200260200101818152505060005b60018351038110156140a8576000806140628786858151811061403e57fe5b602002602001015187866001018151811061405557fe5b60200260200101516152d5565b9150915061408484848151811061407557fe5b60200260200101518383613e26565b84846001018151811061409357fe5b6020908102919091010152505060010161401f565b509392505050565b60008060006140bf8585614d89565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061427957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161423c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142db576040519150601f19603f3d011682016040523d82523d6000602084013e6142e0565b606091505b509150915081801561430e57508051158061430e575080806020019051602081101561430b57600080fd5b50515b614363576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806153ea6031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156145ec5760008084838151811061438957fe5b60200260200101518584600101815181106143a057fe5b60200260200101519150915060006143b88383614d89565b50905060008785600101815181106143cc57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461441457826000614418565b6000835b91509150600060028a5103881061442f5788614470565b6144707f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061446357fe5b60200260200101516140b0565b905061449d7f000000000000000000000000000000000000000000000000000000000000000088886140b0565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156144e7576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561457257818101518382015260200161455a565b50505050905090810190601f16801561459f5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156145c157600080fd5b505af11580156145d5573d6000803e3d6000fd5b50506001909901985061436e975050505050505050565b50505050565b606060028251101561466557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561467d57600080fd5b506040519080825280602002602001820160405280156146a7578160200160208202803683370190505b50905082816001835103815181106146bb57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156140a85760008061471b8786600186038151811061470757fe5b602002602001015187868151811061405557fe5b9150915061473d84848151811061472e57fe5b60200260200101518383614b85565b84600185038151811061474c57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016146eb565b60005b6001835103811015613e215760008084838151811061479e57fe5b60200260200101518584600101815181106147b557fe5b60200260200101519150915060006147cd8383614d89565b50905060006147fd7f000000000000000000000000000000000000000000000000000000000000000085856140b0565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561484b57600080fd5b505afa15801561485f573d6000803e3d6000fd5b505050506040513d606081101561487557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146148bf5782846148c2565b83835b91509150614947828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cfe57600080fd5b9550614954868383613e26565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146149985782600061499c565b6000835b91509150600060028c51038a106149b3578a6149e7565b6149e77f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061446357fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614a97578181015183820152602001614a7f565b50505050905090810190601f168015614ac45780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614ae657600080fd5b505af1158015614afa573d6000803e3d6000fd5b50506001909b019a506147839950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806153be602c913960400191505060405180910390fd5b600083118015614bef5750600082115b614c44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061549a6028913960400191505060405180910390fd5b6000614c686103e8614c5c868863ffffffff6151dd16565b9063ffffffff6151dd16565b90506000614c826103e5614c5c868963ffffffff614b1316565b9050614c9f6001828481614c9257fe5b049063ffffffff61526316565b9695505050505050565b6000808411614d03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806154c26025913960400191505060405180910390fd5b600083118015614d135750600082115b614d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061549a6028913960400191505060405180910390fd5b82614d79858463ffffffff6151dd16565b81614d8057fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614e11576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061544f6025913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614e4b578284614e4e565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614ed557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b604080517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b158015614f7c57600080fd5b505afa158015614f90573d6000803e3d6000fd5b505050506040513d6020811015614fa657600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16141561508c57604080517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561505f57600080fd5b505af1158015615073573d6000803e3d6000fd5b505050506040513d602081101561508957600080fd5b50505b6000806150ba7f00000000000000000000000000000000000000000000000000000000000000008b8b6152d5565b915091508160001480156150cc575080155b156150dc578793508692506151d0565b60006150e9898484614ca9565b9050878111615156578581101561514b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806154746026913960400191505060405180910390fd5b8894509250826151ce565b6000615163898486614ca9565b90508981111561516f57fe5b878110156151c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061550e6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806151f8575050808202828282816151f557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006152e48585614d89565b5090506000806152f58888886140b0565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561533a57600080fd5b505afa15801561534e573d6000803e3d6000fd5b505050506040513d606081101561536457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146153ab5780826153ae565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54a2646970667358221220cd8090fbf0eabe8cf2d2e7c9b3a7f79b408338f37b24017b6f6495c82b19cbde64736f6c63430006060033" @@ -1159,8 +840,8 @@ fun setupPunchswap(deployer: Test.TestAccount, wflowAddress: String): {String: S let nftPositionDescriptorAddress = evmDeploy( deployer, nftPositionDescriptorBytecodeChunks[0] - .concat(nftDescriptorAddress) - .concat(nftPositionDescriptorBytecodeChunks[2]), + .concat(nftDescriptorAddress) + .concat(nftPositionDescriptorBytecodeChunks[2]), [wflowAddress,"WFLOW"] ) log("NFTPositionDescriptor address \(nftPositionDescriptorAddress)") @@ -1170,7 +851,7 @@ fun setupPunchswap(deployer: Test.TestAccount, wflowAddress: String): {String: S let univ2FactoryAddress = evmDeploy( deployer, uniV2FactoryBytecode, - [ownerCOA] + [bridgeCOA] ) log("UniswapV2Factory address \(univ2FactoryAddress)") diff --git a/cadence/tests/univ3_connector_test.cdc b/cadence/tests/univ3_connector_test.cdc index 906556c6..fede366e 100644 --- a/cadence/tests/univ3_connector_test.cdc +++ b/cadence/tests/univ3_connector_test.cdc @@ -7,13 +7,12 @@ import "test_helpers.cdc" access(all) fun setup() { deployContracts() - let punchswapConfig = setupPunchswap() - log(punchswapConfig) } access(self) fun mint(_ target: String, _ recepient: String, _ amount: UInt256) { evmCall( + serviceAccount, target, String.encodeHex(EVM.encodeABIWithSignature("mint(address,uint256)", [recepient, amount])), ) @@ -22,6 +21,7 @@ fun mint(_ target: String, _ recepient: String, _ amount: UInt256) { access(self) fun approve(_ target: EVM.EVMAddress, _ approvee: EVM.EVMAddress, _ amount: UInt256) { evmCall( + serviceAccount, target.toString(), String.encodeHex(EVM.encodeABIWithSignature("approve(address,uint256)", [approvee.toString(), amount])), ) @@ -30,18 +30,34 @@ fun approve(_ target: EVM.EVMAddress, _ approvee: EVM.EVMAddress, _ amount: UInt access(all) fun test_Univ3Connector() { log("deploy USDC6") - let bridgeCOA = getCOA(bridgeAccount.address)! + let bridgeCOA = getCOA(serviceAccount.address)! let usdc6Address = evmDeploy( - deployerAccount, + serviceAccount, usdc6Bytecode, [bridgeCOA] ) log("USDC6 address \(usdc6Address)") + let args = String.encodeHex(EVM.encodeABIWithSignature("owner()(address)",[])) + let checkOwner = evmScriptCall( + EVM.addressFromString(usdc6Address), + args, + [Type().identifier] + ) + log("checkOwner") + log(checkOwner) + + log("checkCode") + let checkCode = _executeScript( + "./scripts/get_evm_code.cdc", + [usdc6Address] + ) + log(checkCode) + let onboardUSDC6 = _executeTransaction( "../../lib/flow-evm-bridge/cadence/transactions/bridge/onboarding/onboard_by_evm_address.cdc", [usdc6Address], - bridgeAccount + serviceAccount ) Test.expect(onboardUSDC6, Test.beSucceeded()) log("USDC6 onboarded") From 7aae00d50c61bc1b1122eb88288e5bb5f9fcdb42 Mon Sep 17 00:00:00 2001 From: Alex <12097569+nialexsan@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:41:31 -0500 Subject: [PATCH 6/7] approve --- cadence/tests/test_helpers.cdc | 20 -------------------- cadence/tests/univ3_connector_test.cdc | 18 +++++++++++++----- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/cadence/tests/test_helpers.cdc b/cadence/tests/test_helpers.cdc index b538d14a..69e960c2 100644 --- a/cadence/tests/test_helpers.cdc +++ b/cadence/tests/test_helpers.cdc @@ -2,7 +2,6 @@ import Test import "EVM" import "MetadataViews" -import "FlowEVMBridgeTemplates" import "FlowToken" import "MOET" import "FlowALP" @@ -317,11 +316,7 @@ access(all) fun deployContracts() { ) Test.expect(err, Test.beNil()) - let wflowAddress = getEVMAddressAssociated(withType: Type<@FlowToken.Vault>().identifier) - ?? panic("Failed to get WFLOW address via VM Bridge association with FlowToken.Vault") - setupBetaAccess() - setupPunchswap(deployer: serviceAccount, wflowAddress: wflowAddress) } access(all) @@ -721,21 +716,6 @@ fun updateBridgePauseStatus(_ signer: Test.TestAccount, pause: Bool) { Test.expect(pauseResult, Test.beSucceeded()) } -access(all) struct BridgeSetupResult { - access(all) let registryAddressHex: String - access(all) let erc20DeployerAddressHex: String - access(all) let erc721DeployerAddressHex: String - init( - registryAddressHex: String, - erc20DeployerAddressHex: String, - erc721DeployerAddressHex: String - ) { - self.registryAddressHex = registryAddressHex - self.erc20DeployerAddressHex = erc20DeployerAddressHex - self.erc721DeployerAddressHex = erc721DeployerAddressHex - } -} - access(all) fun evmDeployRaw(_ signer: Test.TestAccount, bytecode: String, gasLimit: UInt64, value: UFix64): String { let res = _executeTransaction( diff --git a/cadence/tests/univ3_connector_test.cdc b/cadence/tests/univ3_connector_test.cdc index fede366e..756db2bf 100644 --- a/cadence/tests/univ3_connector_test.cdc +++ b/cadence/tests/univ3_connector_test.cdc @@ -1,6 +1,7 @@ import Test import BlockchainHelpers import "EVM" +import "FlowToken" import "test_helpers.cdc" @@ -19,16 +20,21 @@ fun mint(_ target: String, _ recepient: String, _ amount: UInt256) { } access(self) -fun approve(_ target: EVM.EVMAddress, _ approvee: EVM.EVMAddress, _ amount: UInt256) { +fun approve(_ target: String, _ approvee: String, _ amount: UInt256) { evmCall( serviceAccount, - target.toString(), - String.encodeHex(EVM.encodeABIWithSignature("approve(address,uint256)", [approvee.toString(), amount])), + target, + String.encodeHex(EVM.encodeABIWithSignature("approve(address,uint256)", [approvee, amount])), ) } access(all) fun test_Univ3Connector() { + let wflowAddress = getEVMAddressAssociated(withType: Type<@FlowToken.Vault>().identifier) + ?? panic("Failed to get WFLOW address via VM Bridge association with FlowToken.Vault") + + let punchswapResult = setupPunchswap(deployer: serviceAccount, wflowAddress: wflowAddress) + log(punchswapResult) log("deploy USDC6") let bridgeCOA = getCOA(serviceAccount.address)! let usdc6Address = evmDeploy( @@ -38,7 +44,7 @@ fun test_Univ3Connector() { ) log("USDC6 address \(usdc6Address)") - let args = String.encodeHex(EVM.encodeABIWithSignature("owner()(address)",[])) + let args = String.encodeHex(EVM.encodeABIWithSignature("owner()",[])) let checkOwner = evmScriptCall( EVM.addressFromString(usdc6Address), args, @@ -68,6 +74,8 @@ fun test_Univ3Connector() { ) log(usdc6Type) - mint(usdc6Address, "0x".concat(bridgeCOA), 1_000_000_000_000) + mint(usdc6Address, "0x".concat(bridgeCOA), 1_000_000_000_000) + + approve(usdc6Address, punchswapResult["swapRouter02Address"]!, 1_000_000_000_000) } From a4fee855307d1d840780448dba2bd193d7853048 Mon Sep 17 00:00:00 2001 From: Alex <12097569+nialexsan@users.noreply.github.com> Date: Tue, 25 Nov 2025 15:47:00 -0500 Subject: [PATCH 7/7] revert mint changes --- cadence/transactions/moet/mint_moet.cdc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cadence/transactions/moet/mint_moet.cdc b/cadence/transactions/moet/mint_moet.cdc index c7aac4ab..1a0ddd43 100644 --- a/cadence/transactions/moet/mint_moet.cdc +++ b/cadence/transactions/moet/mint_moet.cdc @@ -17,7 +17,7 @@ transaction(to: Address, amount: UFix64) { prepare(signer: auth(BorrowValue) &Account) { self.minter = signer.storage.borrow<&MOET.Minter>(from: MOET.AdminStoragePath) ?? panic("Could not borrow reference to MOET Minter from signer's account at path \(MOET.AdminStoragePath)") - self.receiver = getAccount(to).capabilities.borrow<&{FungibleToken.Vault}>(/public/moetTokenReceiver_0xd27920b6384e2a78) + self.receiver = getAccount(to).capabilities.borrow<&{FungibleToken.Vault}>(MOET.VaultPublicPath) ?? panic("Could not borrow reference to MOET Vault from recipient's account at path \(MOET.VaultPublicPath)") }