diff --git a/crates/bindings/abis/RaindexV6.json b/crates/bindings/abis/RaindexV6.json index 6972bfecb9..4be3cfe2a3 100644 --- a/crates/bindings/abis/RaindexV6.json +++ b/crates/bindings/abis/RaindexV6.json @@ -1593,6 +1593,31 @@ ], "anonymous": false }, + { + "type": "event", + "name": "OrderCalculateReverted", + "inputs": [ + { + "name": "sender", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "owner", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "orderHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, { "type": "event", "name": "OrderExceedsMaxRatio", diff --git a/crates/test_fixtures/abis/RaindexV6.json b/crates/test_fixtures/abis/RaindexV6.json index db6e17cf14..22f8285cde 100644 --- a/crates/test_fixtures/abis/RaindexV6.json +++ b/crates/test_fixtures/abis/RaindexV6.json @@ -1593,6 +1593,31 @@ ], "anonymous": false }, + { + "type": "event", + "name": "OrderCalculateReverted", + "inputs": [ + { + "name": "sender", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "owner", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "orderHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, { "type": "event", "name": "OrderExceedsMaxRatio", @@ -2362,7 +2387,7 @@ } ], "bytecode": { - "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615180908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056", + "object": "0x6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556158d3908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611829575080631f69cb75146115cc5780632cb77e9f146115a05780632fbc4ba01461145657806341d1514f1461141f5780635cffe9de146112c3578063607461191461113f578063613255ab146110bc57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611bbe565b6024358281116101825761010c903690600401611bbe565b60c0366043190112610182576101043583811161018257610131903690600401611d64565b90610124359384116101825761014e61015c943690600401611d64565b92610157612afa565b61228e565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a76118ad565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611a2d565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161187c565b9190610278612afa565b6040519261028584611a11565b5f84523691611e38565b90612f92565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161187c565b9190604051926102d684611a11565b5f84528284016102e582611b11565b946102f36040519687611a2d565b8286526102ff83611b11565b9361031186880195601f190186612272565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a82030186528851611939565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b87018761214e565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611a2d565b30614143565b6103ce828a612034565b526103d98189612034565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612196565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161187c565b9061048d612afa565b6104be6104b96104b46104ad6104a38880612181565b604081019061214e565b3691611a4f565b6140d9565b61412e565b801561075f576001101561074d57602483016104da8186611fa1565b90501561073b5760448401946104f08682611fa1565b9050156107295761055661051e9661054a61051561050e8580612181565b9585611fa1565b99909285611fa1565b91909261053b604051976105318961195d565b3389523690611ab3565b9a60209b8c8901523691611b29565b60408601523691611b29565b60608301526064850135608083015261056e82612b3c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861209c565b0390a10191610615838561214e565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611e38565b82808080808080610584565b6106866104ad848661214e565b61068f81614eca565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b51169361214e565b866040519586958652850152606060408501526060840191611d93565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b845260048401526024830190611939565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa612afa565b5f80806107bf60048035608481019101611eea565b9050156110aa5760246004350135926107d784612ba1565b15611098576060806040516107eb816119c5565b6107f3611f3f565b81525f60208201525f6040820152015261080b611f3f565b5061086b61086661084561083b61083561082f608460043501600435600401611eea565b90611f71565b80611f8c565b6040810190611fa1565b602061085e61082f608460043501600435600401611eea565b013591611fd7565b611d7f565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611eea565b6060810190611fa1565b604061085e61082f608460043501600435600401611eea565b81604051976108c88961198d565b16875216602086015260408501526108ea608460043501600435600401611eea565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611eea565b9050811080611085575b15610ed25761093a608460043501600435600401611eea565b821015610ebe578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f836119c5565b8181013567ffffffffffffffff81116101825761099190369084840101611bbe565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d64565b606082015280516001600160a01b036109ec6040830151602085015190612034565b5151166001600160a01b0385511614801590610e8a575b610e7857610a1b6020830151604084015190836134da565b610a2481612b3c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae84611a11565b5f845233918661354c565b5f9491610b2257505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610b1a575b5092610a82565b905088610b13565b610b3760608201516044600435013590612bc4565b15610b9157505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610b0c565b610b9e6040820151612ba1565b158015610e65575b15610bfc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b89565b9250925050600196959691610c15606460043501612048565b15610dd25796610c8597610c9560408401516040880151610c368183613bb3565b15610dca5750925b610c8f848592610c78610c7260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b614583565b9061473e565b9d8e9260408d0151613c7e565b60408c0152613ca8565b99613ca8565b98610ca08484613cd2565b610caa8482613d30565b60405192338452608060208501526060610cd0845160808088015261010087019061209c565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d6c57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d6796604084015260608301520390a180858c5101808d5260051b8c0152613e42565b610b0c565b9091929396602080610dbd600193601f198782030189528b51906001600160a01b0382511681526040610dac85840151606087850152606084019061211b565b920151906040818403910152611939565b9901950193929101610d0d565b905092610c3e565b610c8590610c956060840151610c8f610e10610c7260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b614583565b60408a0151610e1f8183613bb3565b15610e5d5750915b829c8d916060890151908116155f14610e4e575060408801515b96879460408d0151613c7e565b610e589085613bda565b610e41565b905091610e27565b50610e736060820151613b90565b610ba6565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610ea66060830151604085015190612034565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610ee4606460043501612048565b1561107f57835b6004356004013590610efd8282613bb3565b6110615750508490610f1d856001600160a01b0360208701511633613471565b505060a46004350190610f358260043560040161214e565b905015159081611059575b50610fb8575b506001600160a01b03610f5c9293511633612beb565b50505b8351811015610f845780610f7e610f7860019387612034565b5161401b565b01610f5f565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610fe26001600160a01b038551169260043560040161214e565b929091333b156101825761102a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d93565b038183335af190811561022c57859115610f4657905061104a91506119e1565b5f836001600160a01b03610f46565b905088610f40565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610eeb565b506110936040830151612ba1565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b036110e16118ad565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611112575b50604051908152f35b90508181813d8311611138575b6111298183611a2d565b81010312610182575182611109565b503d61111f565b346101825761114d366118ed565b929161115a949194612afa565b611165838333612b6d565b61116e81612ba1565b15611292578160ff91611186856112499695336131a4565b6111908183613bb3565b1561128c575080935b6111a585828533613413565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06111d4898833613471565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112755760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112849261028f913691611e38565b80808061015c565b93611199565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112f26118c3565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761137f956020921693611341868587613334565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d93565b03815f855af193841561022c575f946113eb575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113d2576113c7935030916133ad565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611417575b8161140760209383611a2d565b8101031261018257519284611393565b3d91506113fa565b3461018257606036600319011261018257602061144e61143d6118ad565b6114456118c3565b604435916131a4565b604051908152f35b3461018257611464366118ed565b92809492611470612afa565b61147b828533612b6d565b61148481612ba1565b1561157057806114986114e7928633612beb565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612c91565b939091856115155760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115649661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a082360391820112610182576024358481116101825761161c90369060040161187c565b9093611626612afa565b5f946001600160a01b03948561163b84611d7f565b1633036118075761165461164f3685611bbe565b612b3c565b805f525f60205260405f2096600188541461169b575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816116c7876118d9565b166060890152602484013590606219018112156101825783019060a06080890152806116f5600484016118d9565b16610100890152611708602483016118d9565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117d061028f9a60209f61178f906117fa9f9a606061014061064e9d0152610160880191611d93565b6117c16117b66117a26044880185611db3565b605f198a8603810160a08c01529491611de8565b926064870190611db3565b918784030160c0880152611de8565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061166a565b60248661181385611d7f565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561186b575b5015158152f35b6301ffc9a760e01b14905083611864565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576119359160040161187c565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761197957604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761197957604052565b6040810190811067ffffffffffffffff82111761197957604052565b6080810190811067ffffffffffffffff82111761197957604052565b67ffffffffffffffff811161197957604052565b60e0810190811067ffffffffffffffff82111761197957604052565b6020810190811067ffffffffffffffff82111761197957604052565b90601f8019910116810190811067ffffffffffffffff82111761197957604052565b92919267ffffffffffffffff82116119795760405191611a79601f8201601f191660200184611a2d565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611ab093359101611a4f565b90565b91906060838203126101825760405190611acc8261198d565b8193611ad7816118d9565b8352611ae5602082016118d9565b602084015260408101359167ffffffffffffffff831161018257604092611b0c9201611a95565b910152565b67ffffffffffffffff81116119795760051b60200190565b929192611b3582611b11565b604092611b456040519283611a2d565b819581835260208093019160061b84019381851161018257915b848310611b6e57505050505050565b8583830312610182578386918251611b85816119a9565b611b8e866118d9565b81528286013583820152815201920191611b5f565b9080601f8301121561018257816020611ab093359101611b29565b91909160a0818403126101825760405190611bd88261195d565b8193611be3826118d9565b835267ffffffffffffffff9160208101358381116101825782611c07918301611ab3565b602085015260408101358381116101825782611c24918301611ba3565b6040850152606081013592831161018257611c456080939284938301611ba3565b60608501520135910152565b909291611c5d84611b11565b916040611c6d6040519485611a2d565b839580855260208095019160059160051b8401948086116101825784935b868510611c9c575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611cc78161198d565b611cd0836118d9565b81528a83013584811161018257830185601f8201121561018257803590611cf682611b11565b91611d0389519384611a2d565b8083528d808401918b1b83010191888311610182578e809101915b838310611d5457509150508201528583013593841161018257611d45858c95869501611a95565b86820152815201940193611c8b565b82358152918101918f9101611d1e565b9080601f8301121561018257816020611ab093359101611c51565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611e05575050505090565b909192936001906001600160a01b03611e1d876118d9565b16815285830135838201526040908101950193920190611df7565b90929192611e4581611b11565b91604091611e566040519485611a2d565b839581855260208095019160051b8301938185116101825783925b858410611e815750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611eab816119a9565b82358481116101825786611ec0918501611ab3565b81528983013593841161018257611edb868b95869501611d64565b83820152815201930192611e71565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611f2d8261198d565b60606040835f81525f60208201520152565b60405190611f4c8261195d565b5f608083828152611f5b611f20565b6020820152606060408201526060808201520152565b9015610ebe57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610ebe5760061b0190565b805115610ebe5760200190565b805160011015610ebe5760400190565b805160021015610ebe5760600190565b805160031015610ebe5760800190565b805160041015610ebe5760a00190565b8051821015610ebe5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612074575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612066565b906080806121126121006120ee60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611939565b60408701518682036040880152612055565b60608601518582036060870152612055565b93015191015290565b9081518082526020808093019301915f5b82811061213a575050505090565b83518552938101939281019260010161212c565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121ad61164f6121a68380611f8c565b3690611bbe565b5f525f602052600160405f20540361224d57806121cd8161223993611f8c565b6122316121ec6121f16020850135938460408701359384923690611bbe565b6134da565b6122096121fe8580611f8c565b946060810190611eea565b92906122296040519661221b88611a11565b5f88525f3681373690611bbe565b933691611c51565b9233926137f8565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60808110612264575050565b606082820152602001612258565b5f5b82811061228057505050565b606082820152602001612274565b926001600160a01b038451166001600160a01b0383511614612ae8576001600160a01b036122c3606086015160643590612034565b5151166001600160a01b036122df604085015160843590612034565b51511614801590612aa8575b610e78576001600160a01b03612308604086015160443590612034565b5151166001600160a01b036123236064356060880151612034565b51511614612a965761233484612b3c565b805f525f60205260405f205415612a46575061234f82612b3c565b805f525f60205260405f2054156129f6575061240e907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e39604051806123b26123a461012033845280602085015283018a61209c565b82810360408401528761209c565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0383511690604051916123ff83611a11565b5f8352606435604435886137f8565b905061264d6001600160a01b03855116936040519461242c86611a11565b5f865261243761350f565b50604051906124458261195d565b6004825261245560208301612256565b61245e86612b3c565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261249182611fe7565b5261249b81611fe7565b506040516124a88161198d565b6002815260403660208301376124bd82611ff4565b526124c781611ff4565b506125976124ee6001600160a01b036124e660843560408a0151612034565b515116614527565b6125326001600160a01b038851166001600160a01b0361251460843560408c0151612034565b515116602061252960843560408d0151612034565b510151916131a4565b906001600160a01b0361254b60843560408b0151612034565b51511660ff602061256260843560408d0151612034565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6125a082612004565b526125aa81612004565b506126346125c96001600160a01b036124e660a43560608a0151612034565b6126046001600160a01b038851166001600160a01b036125ef60a43560608c0151612034565b515116602061252960a43560608d0151612034565b906001600160a01b0361261d60a43560608b0151612034565b51511660ff602061256260a43560608d0151612034565b61263d82612014565b5261264781612014565b506142f5565b926126e35f6001600160a01b038551169260208601908151906001600160a01b036020818451169301511692868552306020526040808620915101516040519161269683611a11565b868352604051956126a6876119f5565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936129d0575b50612702576040513d5f823e3d90fd5b908151600281106129b857506040602083015192015161272a61272488612024565b51612014565b516127358183613bb3565b156129b05750925b61275f8385919060405192600284526020840152604083015260608201604052565b61276888612004565b5261277287612004565b5060405196612780886119f5565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526127b56040840151612ba1565b1591821561299c575b508115612987575b8115612976575b5061296457604051916127df836119c5565b5f83525f60208401525f60408401525f60608401526127fe8483614eee565b845260408401526128246128128386614eee565b60208601528060608601528451613c7e565b946128386020850151604086015190613c7e565b9361284287613b90565b8015612955575b6129435761290a61293c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128ec6129419a60a09661288b8a8851613cd2565b6128998c6020890151613cd2565b6128a78a6040890151613d30565b6128b58c6060890151613d30565b6128be8a61401b565b6128c78c61401b565b6001600160a01b036128e360c435926060606435910151612034565b51511633612c91565b50506001600160a01b036128e360e43592606060a435910151612034565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e42565b613e42565b565b604051630d86822160e01b8152600490fd5b5061295f85613b90565b612849565b6040516321badf1f60e01b8152600490fd5b612981915051613b90565b5f6127cd565b90506129966060830151613b90565b906127c6565b6129a891925051612ba1565b15905f6127be565b90509261273d565b60249060405190630fbb8e5560e21b82526004820152fd5b9092506129ef91503d805f833e6129e78183611a2d565b810190612d55565b915f6126f2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612a41565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612ac2606084015160a43590612034565b5151166001600160a01b03612ade604087015160443590612034565b51511614156122eb565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b2a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b6781612b59602082019460208652604083019061209c565b03601f198101835282611a2d565b51902090565b909115612b78575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612bc0905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1290565b90612bc0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b929192612bf782614216565b93612c0181613b90565b612c7f5784816001600160e01b03612c209360e01d9116601b0b615051565b9290809315612c56575b50829081612c3a575b5050509190565b612c4e926001600160a01b033092166133ad565b5f8181612c33565b9092505f198114612c6b57600101915f612c2a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612c9e83613b90565b612d3c5784612cba57612cb2939450613471565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613ca8565b95612d0187613b90565b612d24575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612d9082611b11565b91612d9e6040519384611a2d565b808352848084019160051b830101918683116101825785809101915b838310612e2d5750505050948281015191821161018257019180601f84011215610182578251612de981611b11565b93612df76040519586611a2d565b818552838086019260051b820101928311610182578301905b828210612e1e575050505090565b81518152908301908301612e10565b8251815291810191869101612dba565b90808251908181526020809101926020808460051b8301019501935f915b848310612e6b5750505050505090565b9091929394958480612e89600193601f198682030187528a5161211b565b9801930193019194939290612e5b565b91906020928381526001600160a01b0382511684820152838201516040820152612ed3604083015160e06060840152610100830190611939565b9060608301516080820152612efa608084015192601f1993848483030160a0850152612e3d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f3d57505050611ab094955060c060e0910151928285030191015261211b565b825187529588019591880191600101612f19565b90604082019082526020606081936040838201528551809452019301915f5b828110612f7e575050505090565b835185529381019392810192600101612f70565b916040805191612fa18361195d565b60048084526020612fb3818601612256565b5f5b8751811015612fe85780612fcb6001928a612034565b51612fd68289612034565b52612fe18188612034565b5001612fb5565b5092955092939093335f52308352855f2091865190613006826119a9565b61300e611f20565b825260608581930152875161302281611a11565b5f815288519161303183611a11565b5f83525f3681375f5b81518110156131975761304d8183612034565b5190888c8b84519189818401518d8d8251613075575b5050505050505050600191500161303a565b5f6130e497948197948c97946130a28c956001600160a01b039d8e81818d51169c0151169b0151906142f5565b948651996130af8b6119f5565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612e99565b03915afa93841561318d578b915f9561316f575b50845161310d575b50908b8e89838d8d613063565b51015116803b156101825761313c925f918c8f84905180978195829463012c676d60e21b845233908401612f51565b03925af191821561316557600192613156575b8981613100565b61315f906119e1565b5f61314f565b8c513d5f823e3d90fd5b6131849195503d805f833e6129e78183611a2d565b9050935f6130f8565b8e513d5f823e3d90fd5b5050505050505050509050565b82156131d9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506131e582614527565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156132fb575f97613305575b508361323c6132358361326c9a615206565b5090614991565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156132fb575f976132ca575b5061323561329091611ab098615206565b5061329b8183613bb3565b156132c25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ca8565b9050936132a3565b96508387813d83116132f4575b6132e18183611a2d565b810103126101825795519561323561327f565b503d6132d7565b85513d5f823e3d90fd5b96508387813d831161332d575b61331c8183611a2d565b810103126101825795519583613223565b503d613312565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561338e575b836040521561337857505050565b635274afe760e01b835216600482015260249150fd5b60018115166133a457813b15153d15161661336a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156133fd575b836040525f6060521561337857505050565b60018115166133a457813b15153d1516166133eb565b9392919361342083613b90565b612d3c578461343457612cb2939450612beb565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613c7e565b9092919261347e81614216565b9361348881613b90565b6134c85784816001600160e01b036134a79360e01d9116601b0b615051565b508092816134b6575050509190565b6001600160a01b03612c4e9316613334565b604051632d1671a360e11b8152600490fd5b916135059060606134fa936001600160a01b039485916040880151612034565b515116940151612034565b51511614612a9657565b6040519061351c826119f5565b606060c083613529611f3f565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b9594919390869361355b61350f565b505f92604061368081519261356f8461195d565b60048452602093613581858201612256565b61364961358d8b612b3c565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135c486611fe7565b526135ce85611fe7565b5087516135da8161198d565b6002815288368b8301376135ed86611ff4565b526135f785611ff4565b5060ff896125628a85019361363387613615816124e6858a51612034565b97511688613624848951612034565b51511685612529858a51612034565b9661363f828751612034565b5151169451612034565b61365282612004565b5261365c81612004565b50612634878b8d60ff896125628c85019361363387613615816124e6858a51612034565b946137005f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136b883611a11565b8683528951956136c7876119f5565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936137da575b506137cd575050505f975b6002855110988915996137ba5782848701519601519061373c61272489612024565b51906137488284613bb3565b1590506137b25750925b6137748685919060405192600284526020840152604083015260608201604052565b61377d88612004565b5261378787612004565b5082519b6137948d6119f5565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613752565b5050505050505050509150611ab061350f565b919998509450939661371a565b9092506137f191503d805f833e6129e78183611a2d565b915f61370f565b9495939592919261380761350f565b506040968751906138178261195d565b60048252602093613829858401612256565b61383289612b3c565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261386484611fe7565b5261386e83611fe7565b50895161387a8161198d565b600281528a368783013761388d84611ff4565b5261389783611ff4565b508989019086818351906138aa91612034565b5151166138b690614527565b86888c511689848651906138c991612034565b51511682858751906138da91612034565b510151906138e7926131a4565b9289818651906138f691612034565b51511694519061390591612034565b5101519060ff1661393d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61394683612004565b5261395082612004565b5060608801858782519061396391612034565b51511661396f90614527565b868a5116878984519061398191612034565b515116878a85519061399291612034565b5101519061399f926131a4565b90868989818651906139b091612034565b5151169451906139bf91612034565b5101519060ff166139f7929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a0083612014565b52613a0a82612014565b50613a14916142f5565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a4583611a11565b5f83528c5196613a54886119f5565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613a939060048301612e99565b03815a935f94fa91825f915f94613b72575b50613ab45788513d5f823e3d90fd5b97949596979194825196600288109788613b5b57508183850151940151613add61272487612024565b51613ae88183613bb3565b15613b535750925b613b128585919060405192600284526020840152604083015260608201604052565b613b1b87612004565b52613b2586612004565b5082519a613b328c6119f5565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613af0565b602490835190630fbb8e5560e21b82526004820152fd5b909350613b8991503d805f833e6129e78183611a2d565b925f613aa5565b613baf905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1390565b90613baf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b613c016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614748565b90637ffffff58213613c51575b90613c1891614991565b9290921580613c49575b613c2b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c22565b613c5b8282615631565b15613c0e57604483856040519163d556b11160e01b835260048301526024820152fd5b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614b97565b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d5b565b613d2c916080810182613cee613ce88351612024565b51612024565b52613d25613d1f6001600160a01b03809451511693613d16613d108551612024565b51611fe7565b51169251612024565b51612004565b5191613413565b5050565b90608081019180613d44613ce88551612014565b526001600160a01b03809251511691613d60613d108551612014565b5116613d6f613d1f8551612014565b519081613e0a57613d7f83613b90565b612d3c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a41955f5260209060018252613dd5604094855f20835f528452855f20855f528452855f2054613ca8565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e3d565b91613e3b917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a4195612c91565b5050613def565b60c0810151908151915f92613fb6575b50613ef76020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613e9f83611a11565b8683528c5193613eae85611a11565b8785528d5196613ebd886119f5565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612e99565b03915afa948515613fac578795613f8e575b508451613f1a575b50505050505050565b81905101510151169051813b15613f8a57918491849383613f4f965180978195829463012c676d60e21b845260048401612f51565b03925af1908115613f815750613f6a575b8080808080613f11565b613f7482916119e1565b613f7e5780613f60565b80fd5b513d84823e3d90fd5b8480fd5b613fa39195503d8089833e6129e78183611a2d565b9050935f613f09565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613ff9925f928360405180968195829463012c676d60e21b845260048401612f51565b03925af1801561022c5715613e52576140139192506119e1565b5f905f613e52565b6080810161402c613d1f8251612014565b5191821561403957505050565b614053613d106001600160a01b0380935151169351612014565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661408e575b505050505050565b6140b2955f9284845260018152828420868552815282842091845252812055613471565b5f808080614086565b81156140c5570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614121576020810151908051603f198101908111612c6b5760051c821161410d5760016020920160051b010190565b505060405161411b81611a11565b5f815290565b5060405161411b81611a11565b80511561413e57602001515f1a90565b505f90565b905f8091602081519101845af480806141c1575b156141775750506040513d81523d5f602083013e60203d82010160405290565b1561419e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141af576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806141575750813b1515614157565b600411156141de57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614212836141d4565b0152565b61421e61571f565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af19283156142ec575f925f946142b7575b50614274836141d4565b6001831415806142a5575b6142895750505090565b5163ee07877f60e01b81529182916107259190600484016141f2565b506142af836141d4565b82151561427f565b908094506142db9293503d85116142e5575b6142d38183611a2d565b810190615027565b919091925f61426a565b503d6142c9565b513d5f823e3d90fd5b9080519161430283611b11565b9161431d60409461431586519586611a2d565b808552611b11565b601f19946020918601368684013783518351909590801561451c5760016143739101965b600197889101019761436a6143558a611b11565b9961436286519b8c611a2d565b808b52611b11565b01848901612272565b85805f96845160028152338782015230868201526060810186526143968b611fe7565b526143a08a611fe7565b505f925b6144d8575b50505083516143bc575b50505050505090565b858095989796929801816143d08289612034565b526143db8188612034565b505f925b6143ee575b50859697506143b3565b84518310156144d3576001600160a01b036144658161440d8689612034565b5151168661441b878a612034565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c61445c888b612034565b5101519161517d565b156144bb57868098999a92819261447c878a612034565b5151166144898787612034565b520193856144978289612034565b5101516144a4868c612034565b526144af858b612034565b500192909897966143df565b8951630a57f30960e31b815260048101859052602490fd5b6143e4565b90919681518810156145135782809101976144f38184612034565b516144fe8a8d612034565b52614509898c612034565b50019190816143a4565b968291506143a9565b506143735f96614341565b61452f61571f565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa9283156142ec575f925f946142b75750614274836141d4565b9091939284158215175f1461459d5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146d4575b50506145c0816152f6565b936145ca816152f6565b946145d58682615316565b909182156146c5575f9083986f0785ee10d5da46d900f436a0000000008086116146b7575b50670de0b6b3a7640000808b116146a8575b50633b9aca00808b11614699575b50612710808b1161468b575b5098805b61467a57508190611935989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615329565b60019290920191600a90048061462a565b60049a04998a930192614626565b600991939a049901915f61461a565b601291939a049901915f61460c565b85049950602592505f6145fa565b50929050611935949550615329565b5f8212156147285780841361471a575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145b557909250611935939491615234565b90925061193593949161529b565b808412156146e457909250611935939491615234565b613c188282614991565b9290918061476e576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461478357505050505f905f90565b61479c93614790916153e3565b929194909384926153e3565b90939192846147aa886152f6565b916147b4866152f6565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061495b575b030191600160ff1b98838a018112155f14614928575050035b5f955f82128061491f575b614901575b5f8112806148ef575b6148d15786820103966001600160ff1b03881490816148c7575b50806148be575b806148b5575b61489757509061484b929161558f565b915f811361485e575b5061193593615329565b9091604c821361488c5761487591600a0a906140bb565b908115614882575f614854565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261483b565b50828414614835565b905088145f61482e565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614814565b95508087018613156149195786818703015b9561480b565b5f614913565b505f8113614806565b89985090920390506001600160ff1b038190038701821361494c57018601946147fb565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506147e2565b81156140c5570590565b8082601b82810b8314614b86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b32575b8380820b03614b2157507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614ad2575b838060030b03614a56575b808413614a3a5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140c5576001600160e01b0391071592614a31565b92915f841315614aa6575090614a6c8383615631565b614a8857637ffffffe1901600a0a810290637fffffff92614a1c565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361488c57614ac591600a0a90614987565b9182156148825792614a1c565b5f198401808060030b14614ae65750614a11565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149c4565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b73576305f5e100600894058094819201955b9150506149c4565b620186a060059405809481920195614b6b565b5082614a1157505050505f90600190565b919291600160ff1b8401614baf57611935935061564a565b90611935935f0391614d5b565b919291600160ff1b9190801580614d49575090614bd8916153e3565b9490929091905f868585858282138015614d40575b614d23575b505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614cee575b505081019182821860ff1c1115614ce657826001600160ff1b0314614cc857905f600192135f14614c9957600a9004915b01925b81158117614c5d57509190565b80614c76575b508015614c6e579190565b505f91508190565b9192614c8c9203600160ff1b01600a0a90614987565b600160ff1b91905f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c4d565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c50565b8107614cfb575b80614c1c565b60ff1d600117015f614cf5565b505050919350614d16579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614bf2565b50835f12614bed565b15614d545750509190565b9350919050565b9392919384158115818117614eac57505090614d76916153e3565b9194908295614d87829582946153e3565b8096929491969387868482138015614ea3575b614e8a575b5050505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614e70575b505081019182821860ff1c1115614e6857826001600160ff1b0314614cc857905f600192135f14614e3957600a9004915b01925b81158117614e0c57509190565b80614e1c57508015614c6e579190565b600160ff1b93614e339291038401600a0a90614987565b5f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614dfc565b509092614dff565b8107614e7d575b80614dcb565b60ff1d600117015f614e77565b929b5098509196509450925090505f8080808080614d9f565b50858412614d9a565b9395939092919015614ec2575050614c6e579190565b945092915050565b600881511061413e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f28610c72606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614583565b94519301614f37815186612bc4565b614f3f575050565b909350611ab091925051925183613bda565b92915f9060018184145f87128715171717614fcb575f92808213614fbd575b03604c81135f821217614fb157600a0a9084614f8f8382029384614987565b14614fa457505015614fa0575f9190565b5f90565b9093509015611ab0579190565b505015614fa0575f9190565b5f9560019450925090614f70565b5050505f90565b93929190918083145f83125f87121883158715171717615021575f928082136150145703604c81135f821217614fb157600a0a9084614f8f8382029384614987565b9194600193509190614f70565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615079576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361508b57505090505f90600190565b60ff8116820191808312615153575f8312156150c3575050604c198112614c6e575f03600a0a916150bc83826140bb565b9283021490565b909293915f81135f1461514957604d811361511e57600a0a9283156140c557835f190483116150f55750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151b85761518f9192615788565b50615199816141d4565b1591826151a557505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461522c57600a6001818404940192061590565b909190600190565b909392915f615244918184614583565b9490945f8483019182019412159081615291575b8115615287575b5061526957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f61525f565b8281129150615258565b6152b093600160fe1b90810193920190614583565b9081815f8212156152e7575050604b198212612cb2576152d5915f03600a0a90614987565b90816152df575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611ab057600160ff1b9080820361530f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153be576001600160ff1b0392838311156153a857600160ff1b9383850361535e57505050509190565b90919293508514615378575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c6b575f039190565b90916001600160ff1b0380841115612c33578514615378575050600a60019104920190565b919091801561558557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615493575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615484575b831361546e5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615462565b6f4b3b4ca85a86c47a098a22400000000080840515615573575b507728c87cb5c89a2571ebfdcb54864ada834a0000000000000083051561555c575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615548575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561553857820515615529575b5f615417565b9290600a02905f190192615523565b93916064029160011901936154f4565b93916402540be400029160091901936154f4565b9391678ac7230489e80000029160121901936154cf565b6025198301955092909202915f6154ad565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561560d5714615605579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611ab091905f811215615645575f036157c2565b6157c2565b909291600160ff1b918281016156dc57508084146156d2578084139182156156ca578185035b604c8111156156b95750505f915b156156aa57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140c557049161567e565b848203615670565b505090505f905f90565b936156e992945f03614bbc565b809391809281146156fd575b50505f039190565b915092506001600160ff1b038314614cc857600a600191059201915f806156f5565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561575d575b6157455750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561573e565b81519190604183036157b8576157b19250602082015190606060408401519301515f1a90615851565b9192909190565b50505f9160029190565b90637ffffff581131561584b57637ffffffe1981019060438213615844575f82121561581857637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140c5577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158c8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158be57905f905f90565b505f906001905f90565b5050505f916003919056", "linkReferences": {} } } diff --git a/src/concrete/raindex/RaindexV6.sol b/src/concrete/raindex/RaindexV6.sol index 3d3aa90c14..c3478c30c6 100644 --- a/src/concrete/raindex/RaindexV6.sol +++ b/src/concrete/raindex/RaindexV6.sol @@ -97,6 +97,11 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex using LibDecimalFloat for Float; using LibBytes32Array for bytes32; + /// The order's calculate eval reverted, or returned fewer than + /// `CALCULATE_ORDER_MIN_OUTPUTS` stack items. The order is skipped rather + /// than reverting the batch. + event OrderCalculateReverted(address sender, address owner, bytes32 orderHash); + /// All hashes of all active orders. There's nothing interesting in the value /// it's just nonzero if the order is live. The key is the hash of the order. /// Removing an order sets the value back to zero so it is identical to the @@ -332,13 +337,14 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex checkTokenSelfTrade(quoteConfig.order, quoteConfig.inputIOIndex, quoteConfig.outputIOIndex); - OrderIOCalculationV4 memory orderIOCalculation = calculateOrderIO( + (, OrderIOCalculationV4 memory orderIOCalculation) = calculateOrderIO( quoteConfig.order, quoteConfig.inputIOIndex, quoteConfig.outputIOIndex, msg.sender, quoteConfig.signedContext, - new bytes32[](0) + new bytes32[](0), + false ); // true is quote2's "order is live" result required by IRaindexV6. // forge-lint: disable-next-line(boolean-cst) @@ -421,13 +427,14 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex // calculates, so a later same-owner order observes earlier // TAKEN orders' writes through the store. An untaken order // runs no `handleIO`, so it makes no state change at all. - OrderIOCalculationV4 memory orderIOCalculation = calculateOrderIO( + (bool calculated, OrderIOCalculationV4 memory orderIOCalculation) = calculateOrderIO( order, takeOrderConfig.inputIOIndex, takeOrderConfig.outputIOIndex, msg.sender, takeOrderConfig.signedContext, - new bytes32[](0) + new bytes32[](0), + true ); // Skip orders that are too expensive rather than revert as we have @@ -441,7 +448,9 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex // nothing. The explicit `taken` flag is the order's outcome // for the batch. bool taken; - if (orderIOCalculation.IORatio.gt(config.maximumIORatio)) { + if (!calculated) { + emit OrderCalculateReverted(msg.sender, order.owner, orderHash); + } else if (orderIOCalculation.IORatio.gt(config.maximumIORatio)) { emit OrderExceedsMaxRatio(msg.sender, order.owner, orderHash); } else if ( !orderIOCalculation.outputMax.gt(LibDecimalFloat.FLOAT_ZERO) @@ -612,21 +621,23 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex // Emit the Clear event before `eval2`. emit ClearV3(msg.sender, aliceOrder, bobOrder, clearConfig); } - OrderIOCalculationV4 memory aliceOrderIOCalculation = calculateOrderIO( + (, OrderIOCalculationV4 memory aliceOrderIOCalculation) = calculateOrderIO( aliceOrder, clearConfig.aliceInputIOIndex, clearConfig.aliceOutputIOIndex, bobOrder.owner, bobSignedContext, - new bytes32[](0) + new bytes32[](0), + false ); - OrderIOCalculationV4 memory bobOrderIOCalculation = calculateOrderIO( + (, OrderIOCalculationV4 memory bobOrderIOCalculation) = calculateOrderIO( bobOrder, clearConfig.bobInputIOIndex, clearConfig.bobOutputIOIndex, aliceOrder.owner, aliceSignedContext, - new bytes32[](0) + new bytes32[](0), + false ); // Each side must be one `takeOrders4` would take. Given this, each @@ -700,14 +711,20 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex /// in-memory store before the calculate eval, making earlier same-owner, /// same-batch calculate writes visible to this evaluation. Empty for /// single-order callers (`quote`, `clear3`). + /// @param skipFailure If true, a reverting calculate eval or a stack shorter + /// than `CALCULATE_ORDER_MIN_OUTPUTS` returns false instead of reverting. + /// @return False if `skipFailure` caught a failure, in which case the + /// calculation is zeroed and MUST NOT be used. + /// @return The order IO calculation. function calculateOrderIO( OrderV4 memory order, uint256 inputIOIndex, uint256 outputIOIndex, address counterparty, SignedContextV1[] memory signedContext, - bytes32[] memory stateOverlay - ) internal view returns (OrderIOCalculationV4 memory) { + bytes32[] memory stateOverlay, + bool skipFailure + ) internal view returns (bool, OrderIOCalculationV4 memory) { unchecked { bytes32[][] memory context; { @@ -764,12 +781,14 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex // and recordVaultInput so that local storage writes happen before // writes on the interpreter. StateNamespace namespace = StateNamespace.wrap(uint256(uint160(order.owner))); + StackItem[] memory calculateOrderStack; + bytes32[] memory calculateOrderKVs; // Slither false positive. External calls within loops are fine if // the caller controls which orders are eval'd as they can drop // failing calls and resubmit a new transaction. // https://github.com/crytic/slither/issues/880 //slither-disable-next-line calls-loop - (StackItem[] memory calculateOrderStack, bytes32[] memory calculateOrderKVs) = order.evaluable.interpreter + try order.evaluable.interpreter .eval4( EvalV4({ store: order.evaluable.store, @@ -780,11 +799,29 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex inputs: new StackItem[](0), stateOverlay: stateOverlay }) - ); + ) returns ( + StackItem[] memory stack, bytes32[] memory kvs + ) { + calculateOrderStack = stack; + calculateOrderKVs = kvs; + } catch { + if (!skipFailure) { + assembly ("memory-safe") { + let ptr := mload(0x40) + returndatacopy(ptr, 0, returndatasize()) + revert(ptr, returndatasize()) + } + } + } // This is a much clearer error message and overall is more efficient // than solidity generic index out of bounds errors. - if (calculateOrderStack.length < CALCULATE_ORDER_MIN_OUTPUTS) { + bool calculated = calculateOrderStack.length >= CALCULATE_ORDER_MIN_OUTPUTS; + if (!calculated) { + if (skipFailure) { + OrderIOCalculationV4 memory failed; + return (calculated, failed); + } revert UnsupportedCalculateOutputs(calculateOrderStack.length); } @@ -806,15 +843,18 @@ contract RaindexV6 is IRaindexV6, IMetaV1_2, ReentrancyGuard, Multicall, Raindex context[CONTEXT_CALCULATIONS_COLUMN] = LibBytes32Array.arrayFrom(Float.unwrap(orderOutputMax), Float.unwrap(orderIORatio)); - return OrderIOCalculationV4({ - order: order, - outputIOIndex: outputIOIndex, - outputMax: orderOutputMax, - IORatio: orderIORatio, - context: context, - namespace: namespace, - kvs: calculateOrderKVs - }); + return ( + calculated, + OrderIOCalculationV4({ + order: order, + outputIOIndex: outputIOIndex, + outputMax: orderOutputMax, + IORatio: orderIORatio, + context: context, + namespace: namespace, + kvs: calculateOrderKVs + }) + ); } } diff --git a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol index 31020f2095..45d03c4940 100644 --- a/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/GenericPoolRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x3cb4365b759e7b9bdfe38e83a74fbfa814f4cd9f7343546e0e17349f3573ffa1); +bytes32 constant BYTECODE_HASH = bytes32(0x76750e2ceac85f73b8d5a76fc0ddfeed92540b765dec9c9a8b948f501eb55b09); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xe2212E6c7cD4D714034C160bb2B0424Ee433B140); +address constant DEPLOYED_ADDRESS = address(0xf11fD458155d5658396DB8cD3D066Bc5536c76DA); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612413806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612413806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316739775cf5b76af58a1739d0e66c4e478daed806cba146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033739775cf5b76af58a1739d0e66c4e478daed806cba14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f57503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046116ad565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046116e8565b6100f3565b61003b61009d36600461178a565b610148565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b61010186868686868661040a565b6101408683838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061046f92505050565b505050505050565b610150610520565b61015f61015c82611a79565b50565b61016c6080830183611b35565b90505f0361018d57604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316739775cf5b76af58a1739d0e66c4e478daed806cba146101da5760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6101e86080840184611b35565b5f8181106101f8576101f8611b7b565b905060200281019061020a9190611b8f565b6102149080611bad565b610222906040810190611bc1565b61022f6080860186611b35565b5f81811061023f5761023f611b7b565b90506020028101906102519190611b8f565b6020013581811061026457610264611b7b565b61027a9260206040909202019081019150611c07565b90505f61028a6080850185611b35565b5f81811061029a5761029a611b7b565b90506020028101906102ac9190611b8f565b6102b69080611bad565b6102c4906060810190611bc1565b6102d16080870187611b35565b5f8181106102e1576102e1611b7b565b90506020028101906102f39190611b8f565b6040013581811061030657610306611b7b565b61031c9260206040909202019081019150611c07565b90506103336001600160a01b038316865f1961054e565b6040516334e3942b60e11b81526001600160a01b038616906369c728569061035f908790600401611e6b565b60408051808303815f875af115801561037a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039e919061206b565b506103b590506001600160a01b038316865f61054e565b6103da6103c184611a79565b836103cb856105c8565b846103d5866105c8565b61064c565b505061040560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561044f575033739775cf5b76af58a1739d0e66c4e478daed806cba14155b156101405760405163f6688adf60e01b81523360048201526024016101d1565b5f805f83806020019051810190610486919061208d565b919450925090506001600160a01b0383166104b4576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b0382166104db5760405163456ac4c360e11b815260040160405180910390fd5b6104f06001600160a01b038616845f1961054e565b6105046001600160a01b03831682476108eb565b506105196001600160a01b038616845f61054e565b5050505050565b6105286109b8565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61055a8383835f6109fc565b6104055761056b83835f60016109fc565b61059357604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b6105a083838360016109fc565b61040557604051635274afe760e01b81526001600160a01b03841660048201526024016101d1565b5f6105d1610a5e565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610628573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612128565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610662575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156106e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107059190612148565b90508015610721576107216001600160a01b0388163383610ae9565b5f61072c8288610af6565b50905080835f8151811061074257610742611b7b565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610793573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b79190612148565b905080156107d3576107d36001600160a01b0386163383610ae9565b5f6107de8286610af6565b50905080836001815181106107f5576107f5611b7b565b6020908102919091010152504790508015610814576108143382610b37565b5f610820826012610af6565b509050808360028151811061083757610837611b7b565b602002602001018181525050505080825f8151811061085857610858611b7b565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161087957905050905087815f815181106108cc576108cc611b7b565b60200260200101819052506108e18382610b95565b5050505050505050565b6060814710156109175760405163cf47918160e01b8152476004820152602481018390526044016101d1565b5f610923858486610ddd565b905080801561094457505f3d118061094457505f856001600160a01b03163b115b1561095957610951610df2565b9150506109b1565b801561098357604051639996b31560e01b81526001600160a01b03861660048201526024016101d1565b3d1561099657610991610e0b565b6109af565b60405163d6bda27560e01b815260040160405180910390fd5b505b9392505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036109fa57604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610ab5575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b156109fa576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb938960048201526024016101d1565b6105a08383836001610e16565b5f805f805f610b058787610e60565b9250925092505f80610b178585610ebc565b9150915081838015610b265750815b9650965050505050505b9250929050565b80471015610b615760405163cf47918160e01b8152476004820152602481018290526044016101d1565b610b7a828260405180602001604052805f815250610ddd565b15610b83575050565b3d1561099657610b91610e0b565b5050565b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610bac5790505090505f5b8351811015610c0d57838181518110610be057610be0611b7b565b6020026020010151828281518110610bfa57610bfa611b7b565b6020908102919091010152600101610bc5565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610dd257878181518110610c7557610c75611b7b565b602002602001015193505f845f015160400151511115610dca575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610ced8c8a6020015161112f565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610d189190612214565b5f60405180830381865afa158015610d32573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d599190810190612315565b9150505f81511115610dc85784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610d9a908a9085906004016123cb565b5f604051808303815f87803b158015610db1575f80fd5b505af1158015610dc3573d5f803e3d5ffd5b505050505b505b600101610c5a565b505050505050505050565b5f805f83516020850186885af1949350505050565b6040513d81523d5f602083013e3d602001810160405290565b6040513d5f823e3d81fd5b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610a52578383151615610a46573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610eab57600a860460018201600a88065f1493509350935050610eb5565b8593509150600190505b9250925092565b5f808383601b82900b821480611007577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515610f3d577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610f2e576305f5e10087059650600886019550610f3d565b620186a0870596506005860195505b8687601b0b14610f5857600a87059650856001019550610f3d565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611001575f600188039050808160030b03610fff5760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610b309350505050565b505b5061101e565b865f0361101e57505f935060019250610b30915050565b858660030b146110d5575f82131561107d5761103a8383611411565b156110625760405163d556b11160e01b815260048101849052602481018390526044016101d1565b637ffffffe19909501600a0a82029550637fffffff946110d5565b637fffffff19869003604381131561109f57505f9450849350610b3092505050565b80600a0a88816110b1576110b16123eb565b059750875f036110cb57505f9450849350610b3092505050565b50637fffffff1995505b8186136110e557600193506110fe565b818603600a0a83816110f9576110f96123eb565b071593505b5050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff841660e084901b1791509250929050565b60605f825167ffffffffffffffff81111561114c5761114c611808565b604051908082528060200260200182016040528015611175578160200160208202803683370190505b5090505f80845111611187575f61118d565b83516001015b85516001010190505f8167ffffffffffffffff8111156111af576111af611808565b6040519080825280602002602001820160405280156111e257816020015b60608152602001906001900390816111cd5790505b5090505f611206604080516002815233602082015230818301526060810190915290565b82828151811061121857611218611b7b565b60200260200101819052505f5b875181101561127557818060010192505087818151811061124857611248611b7b565b602002602001015183838151811061126257611262611b7b565b6020908102919091010152600101611225565b508551156114075780806001019150508382828151811061129857611298611b7b565b60200260200101819052505f5b8651811015611405576113548782815181106112c3576112c3611b7b565b60200260200101515f01516113316112ff8a85815181106112e6576112e6611b7b565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061134357611343611b7b565b60200260200101516040015161142c565b61137457604051630a57f30960e31b8152600481018290526024016101d1565b86818151811061138657611386611b7b565b60200260200101515f01516001600160a01b03165f1b8582815181106113ae576113ae611b7b565b60200260200101818152505081806001019250508681815181106113d4576113d4611b7b565b6020026020010151602001518383815181106113f2576113f2611b7b565b60209081029190910101526001016112a5565b505b5095945050505050565b5f6109b15f84126114225783611426565b835f035b8361149c565b5f836001600160a01b03163b5f0361148a575f8061144a858561153a565b5090925090505f816003811115611463576114636123ff565b1480156114815750856001600160a01b0316826001600160a01b0316145b925050506109b1565b611495848484611580565b90506109b1565b5f637ffffff582136114af57505f6100ed565b637ffffffe19820160438113156114ca5750508115156100ed565b5f811261150a5780600a0a7b80000000000000000000000000000000000000000000000000000001816114ff576114ff6123eb565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611571576020840151604085015160608601515f1a611563888285856115e5565b955095509550505050610eb5565b505081515f9150600290610eb5565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561161e57505f915060039050826116a3565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561166f573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661169a57505f9250600191508290506116a3565b92505f91508190505b9450945094915050565b5f602082840312156116bd575f80fd5b81356001600160e01b0319811681146109b1575f80fd5b6001600160a01b038116811461015c575f80fd5b5f805f805f8060a087890312156116fd575f80fd5b8635611708816116d4565b95506020870135611718816116d4565b94506040870135935060608701359250608087013567ffffffffffffffff80821115611742575f80fd5b818901915089601f830112611755575f80fd5b813581811115611763575f80fd5b8a6020828501011115611774575f80fd5b6020830194508093505050509295509295509295565b5f805f6060848603121561179c575f80fd5b83356117a7816116d4565b9250602084013567ffffffffffffffff808211156117c3575f80fd5b9085019060c082880312156117d6575f80fd5b909250604085013590808211156117eb575f80fd5b508401604081870312156117fd575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561183f5761183f611808565b60405290565b6040805190810167ffffffffffffffff8111828210171561183f5761183f611808565b604051601f8201601f1916810167ffffffffffffffff8111828210171561189157611891611808565b604052919050565b5f67ffffffffffffffff8211156118b2576118b2611808565b50601f01601f191660200190565b5f82601f8301126118cf575f80fd5b81356118e26118dd82611899565b611868565b8181528460208386010111156118f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f67ffffffffffffffff82111561192b5761192b611808565b5060051b60200190565b5f82601f830112611944575f80fd5b813560206119546118dd83611912565b82815260059290921b84018101918181019086841115611972575f80fd5b8286015b84811015611a6e57803567ffffffffffffffff80821115611995575f80fd5b908801906060828b03601f190112156119ac575f80fd5b6119b461181c565b868301356119c1816116d4565b8152604083810135838111156119d5575f80fd5b8401603f81018d136119e5575f80fd5b888101356119f56118dd82611912565b81815260059190911b82018301908a8101908f831115611a13575f80fd5b928401925b82841015611a315783358252928b0192908b0190611a18565b858c0152505050606084013583811115611a49575f80fd5b611a578d8a838801016118c0565b918301919091525085525050918301918301611976565b509695505050505050565b5f60408236031215611a89575f80fd5b611a91611845565b823567ffffffffffffffff80821115611aa8575f80fd5b818501915060608236031215611abc575f80fd5b611ac461181c565b8235611acf816116d4565b81526020830135611adf816116d4565b6020820152604083013582811115611af5575f80fd5b611b01368286016118c0565b60408301525083526020850135915080821115611b1c575f80fd5b50611b2936828601611935565b60208301525092915050565b5f808335601e19843603018112611b4a575f80fd5b83018035915067ffffffffffffffff821115611b64575f80fd5b6020019150600581901b3603821315610b30575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611ba3575f80fd5b9190910192915050565b5f8235609e19833603018112611ba3575f80fd5b5f808335601e19843603018112611bd6575f80fd5b83018035915067ffffffffffffffff821115611bf0575f80fd5b6020019150600681901b3603821315610b30575f80fd5b5f60208284031215611c17575f80fd5b81356109b1816116d4565b5f808335601e19843603018112611c37575f80fd5b830160208101925035905067ffffffffffffffff811115611c56575f80fd5b8060051b3603821315610b30575f80fd5b5f8235605e19833603018112611c7b575f80fd5b90910192915050565b5f808335601e19843603018112611c99575f80fd5b830160208101925035905067ffffffffffffffff811115611cb8575f80fd5b803603821315610b30575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611d03575f80fd5b830160208101925035905067ffffffffffffffff811115611d22575f80fd5b8060061b3603821315610b30575f80fd5b8183525f60208085019450825f5b85811015611d79578135611d54816116d4565b6001600160a01b03168752818301358388015260409687019690910190600101611d41565b509495945050505050565b8183526020808401935f91600585811b8301820185855b88811015611e5d57858303601f19018a52611db68289611c67565b60608135611dc3816116d4565b6001600160a01b03168552611dda82880183611c22565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611e14575f80fd5b871b808288850137860190506040611e2e84820185611c84565b9450838884030182890152611e468484018683611cc6565b9e8a019e9750505093870193505050600101611d9b565b509098975050505050505050565b5f602080835260e08301843582850152604082860135818601526060818701358187015280870135801515808214611ea1575f80fd5b8060808901525050611eb66080880188611c22565b60c060a08901529384905261010093848801600582901b89018601835f5b84811015612032578b830360ff19018452813536879003607e19018112611ef9575f80fd5b8601803536829003609e19018112611f0f575f80fd5b6080855281018035611f20816116d4565b6001600160a01b038082166080880152611f3c8e840184611c67565b915060a0808801528135611f4f816116d4565b8116610120880152818e0135611f64816116d4565b16610140870152611f77818c0182611c84565b91508a610160880152611f8f61018088018383611cc6565b915050611f9e8b830183611cee565b607f19808985030160c08a0152611fb6848385611d33565b9350611fc48d860186611cee565b93509150808985030160e08a015250611fde838383611d33565b9250505060808201358c8701528c8301358d8701528a8301358b8701526120078a840184611c22565b935091508581038a87015261201d818484611d84565b968d019695505050918a019150600101611ed4565b505061204160a08c018c611c84565b8b8303601f190160c08d01529850965061205c818989611cc6565b9b9a5050505050505050505050565b5f806040838503121561207c575f80fd5b505080516020909101519092909150565b5f805f6060848603121561209f575f80fd5b83516120aa816116d4565b60208501519093506120bb816116d4565b604085015190925067ffffffffffffffff8111156120d7575f80fd5b8401601f810186136120e7575f80fd5b80516120f56118dd82611899565b818152876020838501011115612109575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f60208284031215612138575f80fd5b815160ff811681146109b1575f80fd5b5f60208284031215612158575f80fd5b5051919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b83811015611d79578151875295820195908201906001016121a0565b5f8282518085526020808601955060208260051b840101602086015f5b8481101561220757601f198684030189526121f583835161218d565b988401989250908301906001016121d9565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261224d61010084018261215f565b9050606084015160808401526080840151601f19808584030160a086015261227583836121bc565b925060a08601519150808584030160c0860152612292838361218d565b925060c08601519150808584030160e0860152506122b0828261218d565b95945050505050565b5f82601f8301126122c8575f80fd5b815160206122d86118dd83611912565b8083825260208201915060208460051b8701019350868411156122f9575f80fd5b602086015b84811015611a6e57805183529183019183016122fe565b5f8060408385031215612326575f80fd5b825167ffffffffffffffff8082111561233d575f80fd5b818501915085601f830112612350575f80fd5b815160206123606118dd83611912565b82815260059290921b8401810191818101908984111561237e575f80fd5b948201945b8386101561239c57855182529482019490820190612383565b918801519196509093505050808211156123b4575f80fd5b506123c1858286016122b9565b9150509250929050565b828152604060208201525f6123e3604083018461218d565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005220000000000000000000000000c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051806080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000059800000000000000000000000009775cf5b76af58a1739d0e66c4e478daed806cba000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000058d36080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611829575080631f69cb75146115cc5780632cb77e9f146115a05780632fbc4ba01461145657806341d1514f1461141f5780635cffe9de146112c3578063607461191461113f578063613255ab146110bc57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611bbe565b6024358281116101825761010c903690600401611bbe565b60c0366043190112610182576101043583811161018257610131903690600401611d64565b90610124359384116101825761014e61015c943690600401611d64565b92610157612afa565b61228e565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a76118ad565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611a2d565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161187c565b9190610278612afa565b6040519261028584611a11565b5f84523691611e38565b90612f92565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161187c565b9190604051926102d684611a11565b5f84528284016102e582611b11565b946102f36040519687611a2d565b8286526102ff83611b11565b9361031186880195601f190186612272565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a82030186528851611939565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b87018761214e565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611a2d565b30614143565b6103ce828a612034565b526103d98189612034565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612196565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161187c565b9061048d612afa565b6104be6104b96104b46104ad6104a38880612181565b604081019061214e565b3691611a4f565b6140d9565b61412e565b801561075f576001101561074d57602483016104da8186611fa1565b90501561073b5760448401946104f08682611fa1565b9050156107295761055661051e9661054a61051561050e8580612181565b9585611fa1565b99909285611fa1565b91909261053b604051976105318961195d565b3389523690611ab3565b9a60209b8c8901523691611b29565b60408601523691611b29565b60608301526064850135608083015261056e82612b3c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861209c565b0390a10191610615838561214e565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611e38565b82808080808080610584565b6106866104ad848661214e565b61068f81614eca565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b51169361214e565b866040519586958652850152606060408501526060840191611d93565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b845260048401526024830190611939565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa612afa565b5f80806107bf60048035608481019101611eea565b9050156110aa5760246004350135926107d784612ba1565b15611098576060806040516107eb816119c5565b6107f3611f3f565b81525f60208201525f6040820152015261080b611f3f565b5061086b61086661084561083b61083561082f608460043501600435600401611eea565b90611f71565b80611f8c565b6040810190611fa1565b602061085e61082f608460043501600435600401611eea565b013591611fd7565b611d7f565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611eea565b6060810190611fa1565b604061085e61082f608460043501600435600401611eea565b81604051976108c88961198d565b16875216602086015260408501526108ea608460043501600435600401611eea565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611eea565b9050811080611085575b15610ed25761093a608460043501600435600401611eea565b821015610ebe578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f836119c5565b8181013567ffffffffffffffff81116101825761099190369084840101611bbe565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d64565b606082015280516001600160a01b036109ec6040830151602085015190612034565b5151166001600160a01b0385511614801590610e8a575b610e7857610a1b6020830151604084015190836134da565b610a2481612b3c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae84611a11565b5f845233918661354c565b5f9491610b2257505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610b1a575b5092610a82565b905088610b13565b610b3760608201516044600435013590612bc4565b15610b9157505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610b0c565b610b9e6040820151612ba1565b158015610e65575b15610bfc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b89565b9250925050600196959691610c15606460043501612048565b15610dd25796610c8597610c9560408401516040880151610c368183613bb3565b15610dca5750925b610c8f848592610c78610c7260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b614583565b9061473e565b9d8e9260408d0151613c7e565b60408c0152613ca8565b99613ca8565b98610ca08484613cd2565b610caa8482613d30565b60405192338452608060208501526060610cd0845160808088015261010087019061209c565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d6c57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d6796604084015260608301520390a180858c5101808d5260051b8c0152613e42565b610b0c565b9091929396602080610dbd600193601f198782030189528b51906001600160a01b0382511681526040610dac85840151606087850152606084019061211b565b920151906040818403910152611939565b9901950193929101610d0d565b905092610c3e565b610c8590610c956060840151610c8f610e10610c7260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b614583565b60408a0151610e1f8183613bb3565b15610e5d5750915b829c8d916060890151908116155f14610e4e575060408801515b96879460408d0151613c7e565b610e589085613bda565b610e41565b905091610e27565b50610e736060820151613b90565b610ba6565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610ea66060830151604085015190612034565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610ee4606460043501612048565b1561107f57835b6004356004013590610efd8282613bb3565b6110615750508490610f1d856001600160a01b0360208701511633613471565b505060a46004350190610f358260043560040161214e565b905015159081611059575b50610fb8575b506001600160a01b03610f5c9293511633612beb565b50505b8351811015610f845780610f7e610f7860019387612034565b5161401b565b01610f5f565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610fe26001600160a01b038551169260043560040161214e565b929091333b156101825761102a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d93565b038183335af190811561022c57859115610f4657905061104a91506119e1565b5f836001600160a01b03610f46565b905088610f40565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610eeb565b506110936040830151612ba1565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b036110e16118ad565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611112575b50604051908152f35b90508181813d8311611138575b6111298183611a2d565b81010312610182575182611109565b503d61111f565b346101825761114d366118ed565b929161115a949194612afa565b611165838333612b6d565b61116e81612ba1565b15611292578160ff91611186856112499695336131a4565b6111908183613bb3565b1561128c575080935b6111a585828533613413565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06111d4898833613471565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112755760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112849261028f913691611e38565b80808061015c565b93611199565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112f26118c3565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761137f956020921693611341868587613334565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d93565b03815f855af193841561022c575f946113eb575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113d2576113c7935030916133ad565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611417575b8161140760209383611a2d565b8101031261018257519284611393565b3d91506113fa565b3461018257606036600319011261018257602061144e61143d6118ad565b6114456118c3565b604435916131a4565b604051908152f35b3461018257611464366118ed565b92809492611470612afa565b61147b828533612b6d565b61148481612ba1565b1561157057806114986114e7928633612beb565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612c91565b939091856115155760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115649661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a082360391820112610182576024358481116101825761161c90369060040161187c565b9093611626612afa565b5f946001600160a01b03948561163b84611d7f565b1633036118075761165461164f3685611bbe565b612b3c565b805f525f60205260405f2096600188541461169b575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816116c7876118d9565b166060890152602484013590606219018112156101825783019060a06080890152806116f5600484016118d9565b16610100890152611708602483016118d9565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117d061028f9a60209f61178f906117fa9f9a606061014061064e9d0152610160880191611d93565b6117c16117b66117a26044880185611db3565b605f198a8603810160a08c01529491611de8565b926064870190611db3565b918784030160c0880152611de8565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061166a565b60248661181385611d7f565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561186b575b5015158152f35b6301ffc9a760e01b14905083611864565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576119359160040161187c565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761197957604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761197957604052565b6040810190811067ffffffffffffffff82111761197957604052565b6080810190811067ffffffffffffffff82111761197957604052565b67ffffffffffffffff811161197957604052565b60e0810190811067ffffffffffffffff82111761197957604052565b6020810190811067ffffffffffffffff82111761197957604052565b90601f8019910116810190811067ffffffffffffffff82111761197957604052565b92919267ffffffffffffffff82116119795760405191611a79601f8201601f191660200184611a2d565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611ab093359101611a4f565b90565b91906060838203126101825760405190611acc8261198d565b8193611ad7816118d9565b8352611ae5602082016118d9565b602084015260408101359167ffffffffffffffff831161018257604092611b0c9201611a95565b910152565b67ffffffffffffffff81116119795760051b60200190565b929192611b3582611b11565b604092611b456040519283611a2d565b819581835260208093019160061b84019381851161018257915b848310611b6e57505050505050565b8583830312610182578386918251611b85816119a9565b611b8e866118d9565b81528286013583820152815201920191611b5f565b9080601f8301121561018257816020611ab093359101611b29565b91909160a0818403126101825760405190611bd88261195d565b8193611be3826118d9565b835267ffffffffffffffff9160208101358381116101825782611c07918301611ab3565b602085015260408101358381116101825782611c24918301611ba3565b6040850152606081013592831161018257611c456080939284938301611ba3565b60608501520135910152565b909291611c5d84611b11565b916040611c6d6040519485611a2d565b839580855260208095019160059160051b8401948086116101825784935b868510611c9c575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611cc78161198d565b611cd0836118d9565b81528a83013584811161018257830185601f8201121561018257803590611cf682611b11565b91611d0389519384611a2d565b8083528d808401918b1b83010191888311610182578e809101915b838310611d5457509150508201528583013593841161018257611d45858c95869501611a95565b86820152815201940193611c8b565b82358152918101918f9101611d1e565b9080601f8301121561018257816020611ab093359101611c51565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611e05575050505090565b909192936001906001600160a01b03611e1d876118d9565b16815285830135838201526040908101950193920190611df7565b90929192611e4581611b11565b91604091611e566040519485611a2d565b839581855260208095019160051b8301938185116101825783925b858410611e815750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611eab816119a9565b82358481116101825786611ec0918501611ab3565b81528983013593841161018257611edb868b95869501611d64565b83820152815201930192611e71565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611f2d8261198d565b60606040835f81525f60208201520152565b60405190611f4c8261195d565b5f608083828152611f5b611f20565b6020820152606060408201526060808201520152565b9015610ebe57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610ebe5760061b0190565b805115610ebe5760200190565b805160011015610ebe5760400190565b805160021015610ebe5760600190565b805160031015610ebe5760800190565b805160041015610ebe5760a00190565b8051821015610ebe5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612074575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612066565b906080806121126121006120ee60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611939565b60408701518682036040880152612055565b60608601518582036060870152612055565b93015191015290565b9081518082526020808093019301915f5b82811061213a575050505090565b83518552938101939281019260010161212c565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121ad61164f6121a68380611f8c565b3690611bbe565b5f525f602052600160405f20540361224d57806121cd8161223993611f8c565b6122316121ec6121f16020850135938460408701359384923690611bbe565b6134da565b6122096121fe8580611f8c565b946060810190611eea565b92906122296040519661221b88611a11565b5f88525f3681373690611bbe565b933691611c51565b9233926137f8565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60808110612264575050565b606082820152602001612258565b5f5b82811061228057505050565b606082820152602001612274565b926001600160a01b038451166001600160a01b0383511614612ae8576001600160a01b036122c3606086015160643590612034565b5151166001600160a01b036122df604085015160843590612034565b51511614801590612aa8575b610e78576001600160a01b03612308604086015160443590612034565b5151166001600160a01b036123236064356060880151612034565b51511614612a965761233484612b3c565b805f525f60205260405f205415612a46575061234f82612b3c565b805f525f60205260405f2054156129f6575061240e907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e39604051806123b26123a461012033845280602085015283018a61209c565b82810360408401528761209c565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0383511690604051916123ff83611a11565b5f8352606435604435886137f8565b905061264d6001600160a01b03855116936040519461242c86611a11565b5f865261243761350f565b50604051906124458261195d565b6004825261245560208301612256565b61245e86612b3c565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261249182611fe7565b5261249b81611fe7565b506040516124a88161198d565b6002815260403660208301376124bd82611ff4565b526124c781611ff4565b506125976124ee6001600160a01b036124e660843560408a0151612034565b515116614527565b6125326001600160a01b038851166001600160a01b0361251460843560408c0151612034565b515116602061252960843560408d0151612034565b510151916131a4565b906001600160a01b0361254b60843560408b0151612034565b51511660ff602061256260843560408d0151612034565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6125a082612004565b526125aa81612004565b506126346125c96001600160a01b036124e660a43560608a0151612034565b6126046001600160a01b038851166001600160a01b036125ef60a43560608c0151612034565b515116602061252960a43560608d0151612034565b906001600160a01b0361261d60a43560608b0151612034565b51511660ff602061256260a43560608d0151612034565b61263d82612014565b5261264781612014565b506142f5565b926126e35f6001600160a01b038551169260208601908151906001600160a01b036020818451169301511692868552306020526040808620915101516040519161269683611a11565b868352604051956126a6876119f5565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936129d0575b50612702576040513d5f823e3d90fd5b908151600281106129b857506040602083015192015161272a61272488612024565b51612014565b516127358183613bb3565b156129b05750925b61275f8385919060405192600284526020840152604083015260608201604052565b61276888612004565b5261277287612004565b5060405196612780886119f5565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526127b56040840151612ba1565b1591821561299c575b508115612987575b8115612976575b5061296457604051916127df836119c5565b5f83525f60208401525f60408401525f60608401526127fe8483614eee565b845260408401526128246128128386614eee565b60208601528060608601528451613c7e565b946128386020850151604086015190613c7e565b9361284287613b90565b8015612955575b6129435761290a61293c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128ec6129419a60a09661288b8a8851613cd2565b6128998c6020890151613cd2565b6128a78a6040890151613d30565b6128b58c6060890151613d30565b6128be8a61401b565b6128c78c61401b565b6001600160a01b036128e360c435926060606435910151612034565b51511633612c91565b50506001600160a01b036128e360e43592606060a435910151612034565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e42565b613e42565b565b604051630d86822160e01b8152600490fd5b5061295f85613b90565b612849565b6040516321badf1f60e01b8152600490fd5b612981915051613b90565b5f6127cd565b90506129966060830151613b90565b906127c6565b6129a891925051612ba1565b15905f6127be565b90509261273d565b60249060405190630fbb8e5560e21b82526004820152fd5b9092506129ef91503d805f833e6129e78183611a2d565b810190612d55565b915f6126f2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612a41565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612ac2606084015160a43590612034565b5151166001600160a01b03612ade604087015160443590612034565b51511614156122eb565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b2a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b6781612b59602082019460208652604083019061209c565b03601f198101835282611a2d565b51902090565b909115612b78575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612bc0905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1290565b90612bc0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b929192612bf782614216565b93612c0181613b90565b612c7f5784816001600160e01b03612c209360e01d9116601b0b615051565b9290809315612c56575b50829081612c3a575b5050509190565b612c4e926001600160a01b033092166133ad565b5f8181612c33565b9092505f198114612c6b57600101915f612c2a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612c9e83613b90565b612d3c5784612cba57612cb2939450613471565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613ca8565b95612d0187613b90565b612d24575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612d9082611b11565b91612d9e6040519384611a2d565b808352848084019160051b830101918683116101825785809101915b838310612e2d5750505050948281015191821161018257019180601f84011215610182578251612de981611b11565b93612df76040519586611a2d565b818552838086019260051b820101928311610182578301905b828210612e1e575050505090565b81518152908301908301612e10565b8251815291810191869101612dba565b90808251908181526020809101926020808460051b8301019501935f915b848310612e6b5750505050505090565b9091929394958480612e89600193601f198682030187528a5161211b565b9801930193019194939290612e5b565b91906020928381526001600160a01b0382511684820152838201516040820152612ed3604083015160e06060840152610100830190611939565b9060608301516080820152612efa608084015192601f1993848483030160a0850152612e3d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f3d57505050611ab094955060c060e0910151928285030191015261211b565b825187529588019591880191600101612f19565b90604082019082526020606081936040838201528551809452019301915f5b828110612f7e575050505090565b835185529381019392810192600101612f70565b916040805191612fa18361195d565b60048084526020612fb3818601612256565b5f5b8751811015612fe85780612fcb6001928a612034565b51612fd68289612034565b52612fe18188612034565b5001612fb5565b5092955092939093335f52308352855f2091865190613006826119a9565b61300e611f20565b825260608581930152875161302281611a11565b5f815288519161303183611a11565b5f83525f3681375f5b81518110156131975761304d8183612034565b5190888c8b84519189818401518d8d8251613075575b5050505050505050600191500161303a565b5f6130e497948197948c97946130a28c956001600160a01b039d8e81818d51169c0151169b0151906142f5565b948651996130af8b6119f5565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612e99565b03915afa93841561318d578b915f9561316f575b50845161310d575b50908b8e89838d8d613063565b51015116803b156101825761313c925f918c8f84905180978195829463012c676d60e21b845233908401612f51565b03925af191821561316557600192613156575b8981613100565b61315f906119e1565b5f61314f565b8c513d5f823e3d90fd5b6131849195503d805f833e6129e78183611a2d565b9050935f6130f8565b8e513d5f823e3d90fd5b5050505050505050509050565b82156131d9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506131e582614527565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156132fb575f97613305575b508361323c6132358361326c9a615206565b5090614991565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156132fb575f976132ca575b5061323561329091611ab098615206565b5061329b8183613bb3565b156132c25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ca8565b9050936132a3565b96508387813d83116132f4575b6132e18183611a2d565b810103126101825795519561323561327f565b503d6132d7565b85513d5f823e3d90fd5b96508387813d831161332d575b61331c8183611a2d565b810103126101825795519583613223565b503d613312565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561338e575b836040521561337857505050565b635274afe760e01b835216600482015260249150fd5b60018115166133a457813b15153d15161661336a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156133fd575b836040525f6060521561337857505050565b60018115166133a457813b15153d1516166133eb565b9392919361342083613b90565b612d3c578461343457612cb2939450612beb565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613c7e565b9092919261347e81614216565b9361348881613b90565b6134c85784816001600160e01b036134a79360e01d9116601b0b615051565b508092816134b6575050509190565b6001600160a01b03612c4e9316613334565b604051632d1671a360e11b8152600490fd5b916135059060606134fa936001600160a01b039485916040880151612034565b515116940151612034565b51511614612a9657565b6040519061351c826119f5565b606060c083613529611f3f565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b9594919390869361355b61350f565b505f92604061368081519261356f8461195d565b60048452602093613581858201612256565b61364961358d8b612b3c565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135c486611fe7565b526135ce85611fe7565b5087516135da8161198d565b6002815288368b8301376135ed86611ff4565b526135f785611ff4565b5060ff896125628a85019361363387613615816124e6858a51612034565b97511688613624848951612034565b51511685612529858a51612034565b9661363f828751612034565b5151169451612034565b61365282612004565b5261365c81612004565b50612634878b8d60ff896125628c85019361363387613615816124e6858a51612034565b946137005f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136b883611a11565b8683528951956136c7876119f5565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936137da575b506137cd575050505f975b6002855110988915996137ba5782848701519601519061373c61272489612024565b51906137488284613bb3565b1590506137b25750925b6137748685919060405192600284526020840152604083015260608201604052565b61377d88612004565b5261378787612004565b5082519b6137948d6119f5565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613752565b5050505050505050509150611ab061350f565b919998509450939661371a565b9092506137f191503d805f833e6129e78183611a2d565b915f61370f565b9495939592919261380761350f565b506040968751906138178261195d565b60048252602093613829858401612256565b61383289612b3c565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261386484611fe7565b5261386e83611fe7565b50895161387a8161198d565b600281528a368783013761388d84611ff4565b5261389783611ff4565b508989019086818351906138aa91612034565b5151166138b690614527565b86888c511689848651906138c991612034565b51511682858751906138da91612034565b510151906138e7926131a4565b9289818651906138f691612034565b51511694519061390591612034565b5101519060ff1661393d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61394683612004565b5261395082612004565b5060608801858782519061396391612034565b51511661396f90614527565b868a5116878984519061398191612034565b515116878a85519061399291612034565b5101519061399f926131a4565b90868989818651906139b091612034565b5151169451906139bf91612034565b5101519060ff166139f7929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a0083612014565b52613a0a82612014565b50613a14916142f5565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a4583611a11565b5f83528c5196613a54886119f5565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613a939060048301612e99565b03815a935f94fa91825f915f94613b72575b50613ab45788513d5f823e3d90fd5b97949596979194825196600288109788613b5b57508183850151940151613add61272487612024565b51613ae88183613bb3565b15613b535750925b613b128585919060405192600284526020840152604083015260608201604052565b613b1b87612004565b52613b2586612004565b5082519a613b328c6119f5565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613af0565b602490835190630fbb8e5560e21b82526004820152fd5b909350613b8991503d805f833e6129e78183611a2d565b925f613aa5565b613baf905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1390565b90613baf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b613c016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614748565b90637ffffff58213613c51575b90613c1891614991565b9290921580613c49575b613c2b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c22565b613c5b8282615631565b15613c0e57604483856040519163d556b11160e01b835260048301526024820152fd5b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614b97565b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d5b565b613d2c916080810182613cee613ce88351612024565b51612024565b52613d25613d1f6001600160a01b03809451511693613d16613d108551612024565b51611fe7565b51169251612024565b51612004565b5191613413565b5050565b90608081019180613d44613ce88551612014565b526001600160a01b03809251511691613d60613d108551612014565b5116613d6f613d1f8551612014565b519081613e0a57613d7f83613b90565b612d3c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a41955f5260209060018252613dd5604094855f20835f528452855f20855f528452855f2054613ca8565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e3d565b91613e3b917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a4195612c91565b5050613def565b60c0810151908151915f92613fb6575b50613ef76020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613e9f83611a11565b8683528c5193613eae85611a11565b8785528d5196613ebd886119f5565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612e99565b03915afa948515613fac578795613f8e575b508451613f1a575b50505050505050565b81905101510151169051813b15613f8a57918491849383613f4f965180978195829463012c676d60e21b845260048401612f51565b03925af1908115613f815750613f6a575b8080808080613f11565b613f7482916119e1565b613f7e5780613f60565b80fd5b513d84823e3d90fd5b8480fd5b613fa39195503d8089833e6129e78183611a2d565b9050935f613f09565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613ff9925f928360405180968195829463012c676d60e21b845260048401612f51565b03925af1801561022c5715613e52576140139192506119e1565b5f905f613e52565b6080810161402c613d1f8251612014565b5191821561403957505050565b614053613d106001600160a01b0380935151169351612014565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661408e575b505050505050565b6140b2955f9284845260018152828420868552815282842091845252812055613471565b5f808080614086565b81156140c5570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614121576020810151908051603f198101908111612c6b5760051c821161410d5760016020920160051b010190565b505060405161411b81611a11565b5f815290565b5060405161411b81611a11565b80511561413e57602001515f1a90565b505f90565b905f8091602081519101845af480806141c1575b156141775750506040513d81523d5f602083013e60203d82010160405290565b1561419e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141af576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806141575750813b1515614157565b600411156141de57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614212836141d4565b0152565b61421e61571f565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af19283156142ec575f925f946142b7575b50614274836141d4565b6001831415806142a5575b6142895750505090565b5163ee07877f60e01b81529182916107259190600484016141f2565b506142af836141d4565b82151561427f565b908094506142db9293503d85116142e5575b6142d38183611a2d565b810190615027565b919091925f61426a565b503d6142c9565b513d5f823e3d90fd5b9080519161430283611b11565b9161431d60409461431586519586611a2d565b808552611b11565b601f19946020918601368684013783518351909590801561451c5760016143739101965b600197889101019761436a6143558a611b11565b9961436286519b8c611a2d565b808b52611b11565b01848901612272565b85805f96845160028152338782015230868201526060810186526143968b611fe7565b526143a08a611fe7565b505f925b6144d8575b50505083516143bc575b50505050505090565b858095989796929801816143d08289612034565b526143db8188612034565b505f925b6143ee575b50859697506143b3565b84518310156144d3576001600160a01b036144658161440d8689612034565b5151168661441b878a612034565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c61445c888b612034565b5101519161517d565b156144bb57868098999a92819261447c878a612034565b5151166144898787612034565b520193856144978289612034565b5101516144a4868c612034565b526144af858b612034565b500192909897966143df565b8951630a57f30960e31b815260048101859052602490fd5b6143e4565b90919681518810156145135782809101976144f38184612034565b516144fe8a8d612034565b52614509898c612034565b50019190816143a4565b968291506143a9565b506143735f96614341565b61452f61571f565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa9283156142ec575f925f946142b75750614274836141d4565b9091939284158215175f1461459d5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146d4575b50506145c0816152f6565b936145ca816152f6565b946145d58682615316565b909182156146c5575f9083986f0785ee10d5da46d900f436a0000000008086116146b7575b50670de0b6b3a7640000808b116146a8575b50633b9aca00808b11614699575b50612710808b1161468b575b5098805b61467a57508190611935989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615329565b60019290920191600a90048061462a565b60049a04998a930192614626565b600991939a049901915f61461a565b601291939a049901915f61460c565b85049950602592505f6145fa565b50929050611935949550615329565b5f8212156147285780841361471a575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145b557909250611935939491615234565b90925061193593949161529b565b808412156146e457909250611935939491615234565b613c188282614991565b9290918061476e576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461478357505050505f905f90565b61479c93614790916153e3565b929194909384926153e3565b90939192846147aa886152f6565b916147b4866152f6565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061495b575b030191600160ff1b98838a018112155f14614928575050035b5f955f82128061491f575b614901575b5f8112806148ef575b6148d15786820103966001600160ff1b03881490816148c7575b50806148be575b806148b5575b61489757509061484b929161558f565b915f811361485e575b5061193593615329565b9091604c821361488c5761487591600a0a906140bb565b908115614882575f614854565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261483b565b50828414614835565b905088145f61482e565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614814565b95508087018613156149195786818703015b9561480b565b5f614913565b505f8113614806565b89985090920390506001600160ff1b038190038701821361494c57018601946147fb565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506147e2565b81156140c5570590565b8082601b82810b8314614b86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b32575b8380820b03614b2157507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614ad2575b838060030b03614a56575b808413614a3a5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140c5576001600160e01b0391071592614a31565b92915f841315614aa6575090614a6c8383615631565b614a8857637ffffffe1901600a0a810290637fffffff92614a1c565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361488c57614ac591600a0a90614987565b9182156148825792614a1c565b5f198401808060030b14614ae65750614a11565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149c4565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b73576305f5e100600894058094819201955b9150506149c4565b620186a060059405809481920195614b6b565b5082614a1157505050505f90600190565b919291600160ff1b8401614baf57611935935061564a565b90611935935f0391614d5b565b919291600160ff1b9190801580614d49575090614bd8916153e3565b9490929091905f868585858282138015614d40575b614d23575b505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614cee575b505081019182821860ff1c1115614ce657826001600160ff1b0314614cc857905f600192135f14614c9957600a9004915b01925b81158117614c5d57509190565b80614c76575b508015614c6e579190565b505f91508190565b9192614c8c9203600160ff1b01600a0a90614987565b600160ff1b91905f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c4d565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c50565b8107614cfb575b80614c1c565b60ff1d600117015f614cf5565b505050919350614d16579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614bf2565b50835f12614bed565b15614d545750509190565b9350919050565b9392919384158115818117614eac57505090614d76916153e3565b9194908295614d87829582946153e3565b8096929491969387868482138015614ea3575b614e8a575b5050505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614e70575b505081019182821860ff1c1115614e6857826001600160ff1b0314614cc857905f600192135f14614e3957600a9004915b01925b81158117614e0c57509190565b80614e1c57508015614c6e579190565b600160ff1b93614e339291038401600a0a90614987565b5f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614dfc565b509092614dff565b8107614e7d575b80614dcb565b60ff1d600117015f614e77565b929b5098509196509450925090505f8080808080614d9f565b50858412614d9a565b9395939092919015614ec2575050614c6e579190565b945092915050565b600881511061413e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f28610c72606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614583565b94519301614f37815186612bc4565b614f3f575050565b909350611ab091925051925183613bda565b92915f9060018184145f87128715171717614fcb575f92808213614fbd575b03604c81135f821217614fb157600a0a9084614f8f8382029384614987565b14614fa457505015614fa0575f9190565b5f90565b9093509015611ab0579190565b505015614fa0575f9190565b5f9560019450925090614f70565b5050505f90565b93929190918083145f83125f87121883158715171717615021575f928082136150145703604c81135f821217614fb157600a0a9084614f8f8382029384614987565b9194600193509190614f70565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615079576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361508b57505090505f90600190565b60ff8116820191808312615153575f8312156150c3575050604c198112614c6e575f03600a0a916150bc83826140bb565b9283021490565b909293915f81135f1461514957604d811361511e57600a0a9283156140c557835f190483116150f55750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151b85761518f9192615788565b50615199816141d4565b1591826151a557505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461522c57600a6001818404940192061590565b909190600190565b909392915f615244918184614583565b9490945f8483019182019412159081615291575b8115615287575b5061526957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f61525f565b8281129150615258565b6152b093600160fe1b90810193920190614583565b9081815f8212156152e7575050604b198212612cb2576152d5915f03600a0a90614987565b90816152df575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611ab057600160ff1b9080820361530f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153be576001600160ff1b0392838311156153a857600160ff1b9383850361535e57505050509190565b90919293508514615378575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c6b575f039190565b90916001600160ff1b0380841115612c33578514615378575050600a60019104920190565b919091801561558557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615493575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615484575b831361546e5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615462565b6f4b3b4ca85a86c47a098a22400000000080840515615573575b507728c87cb5c89a2571ebfdcb54864ada834a0000000000000083051561555c575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615548575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561553857820515615529575b5f615417565b9290600a02905f190192615523565b93916064029160011901936154f4565b93916402540be400029160091901936154f4565b9391678ac7230489e80000029160121901936154cf565b6025198301955092909202915f6154ad565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561560d5714615605579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611ab091905f811215615645575f036157c2565b6157c2565b909291600160ff1b918281016156dc57508084146156d2578084139182156156ca578185035b604c8111156156b95750505f915b156156aa57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140c557049161567e565b848203615670565b505090505f905f90565b936156e992945f03614bbc565b809391809281146156fd575b50505f039190565b915092506001600160ff1b038314614cc857600a600191059201915f806156f5565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561575d575b6157455750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561573e565b81519190604183036157b8576157b19250602082015190606060408401519301515f1a90615851565b9192909190565b50505f9160029190565b90637ffffff581131561584b57637ffffffe1981019060438213615844575f82121561581857637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140c5577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158c8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158be57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol index 3b10dbfb09..1ec86126c3 100644 --- a/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol +++ b/src/generated/candidate/GenericPoolRaindexV6FlashBorrower.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x45b0aa707f74bbe440533fed9436e95b98f4709126e7560684b0291c837bff0f); +bytes32 constant BYTECODE_HASH = bytes32(0x9918c58def9f0dc96dc602b97550ac8b4c4fca382c543aeaf283226f59512bce); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x105E99F4Ba7Aa80C8c74Ec8a85EAc6bc82DA1c18); +address constant DEPLOYED_ADDRESS = address(0x7865cFE175dCeCb4c71f25E1743Cb7b7f14b9e29); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612da7806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055612da7806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33739775cf5b76af58a1739d0e66c4e478daed806cba1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038516739775cf5b76af58a1739d0e66c4e478daed806cba146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f3373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03851673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d57806323e30c8b146100715780638c18e4ba1461009e57005b3661003b57005b005b348015610048575f80fd5b5061005c6100573660046119d4565b6100b1565b60405190151581526020015b60405180910390f35b34801561007c575f80fd5b5061009061008b366004611a5d565b6100e7565b604051908152602001610068565b61003b6100ac366004611ad4565b610204565b5f6001600160e01b031982166323e30c8b60e01b14806100e157506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f33739775cf5b76af58a1739d0e66c4e478daed806cba1461012257604051625e1e6f60e51b81523360048201526024015b60405180910390fd5b6001600160a01b0387163014610156576040516322c7df1960e21b81526001600160a01b0388166004820152602401610119565b5f80610164848601866120d8565b91509150610172828261057c565b6040516334e3942b60e11b815233906369c72856906101959085906004016122f1565b60408051808303815f875af11580156101b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101d4919061246f565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99a9950505050505050505050565b61020c6105f0565b61021b61021882612491565b50565b61022860808501856124fa565b90505f0361024957604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038516739775cf5b76af58a1739d0e66c4e478daed806cba146102915760405163516e822d60e01b81526001600160a01b0386166004820152602401610119565b6102a16080850160608601612540565b6102be57604051636d3a9fe560e01b815260040160405180910390fd5b5f8484846040516020016102d493929190612799565b60408051601f1981840301815291905290505f6102f460808701876124fa565b5f818110610304576103046129ab565b905060200281019061031691906129bf565b61032090806129dd565b61032e9060608101906129f1565b61033b60808901896124fa565b5f81811061034b5761034b6129ab565b905060200281019061035d91906129bf565b60400135818110610370576103706129ab565b6103869260206040909202019081019150612a37565b90505f61039660808801886124fa565b5f8181106103a6576103a66129ab565b90506020028101906103b891906129bf565b6103c290806129dd565b6103d09060408101906129f1565b6103dd60808a018a6124fa565b5f8181106103ed576103ed6129ab565b90506020028101906103ff91906129bf565b60200135818110610412576104126129ab565b6104289260206040909202019081019150612a37565b90505f6104348261061e565b90505f6104408461061e565b90505f61044e8a35836106a2565b90506104656001600160a01b0385168c5f196106c9565b61047a6001600160a01b0386168c5f196106c9565b604051632e7ff4ef60e11b81526001600160a01b038c1690635cffe9de906104ac903090899086908c90600401612a52565b6020604051808303815f875af11580156104c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ec9190612a83565b610509576040516349088f5960e11b815260040160405180910390fd5b61051d6001600160a01b0386168c5f6106c9565b6105316001600160a01b0385168c5f6106c9565b61054661053d88612491565b85858886610743565b50505050505061057560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050505050565b5f82608001515f81518110610593576105936129ab565b60200260200101515f01516060015183608001515f815181106105b8576105b86129ab565b602002602001015160400151815181106105d4576105d46129ab565b60200260200101515f015190506105eb81836109e2565b505050565b6105f8610a8c565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f610627610ad0565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af115801561067e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100e19190612a9e565b5f6001600160e01b038316601b0b60e084901d6106c0828286610b5b565b95945050505050565b6106d58383835f610b9f565b6105eb576106e683835f6001610b9f565b61070e57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b61071b8383836001610b9f565b6105eb57604051635274afe760e01b81526001600160a01b0384166004820152602401610119565b6040805160018082528183019092525f91816020015b6060815260200190600190039081610759575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190612abe565b90508015610818576108186001600160a01b0388163383610c01565b5f6108238288610c0e565b50905080835f81518110610839576108396129ab565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561088a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ae9190612abe565b905080156108ca576108ca6001600160a01b0386163383610c01565b5f6108d58286610c0e565b50905080836001815181106108ec576108ec6129ab565b602090810291909101015250479050801561090b5761090b3382610c4f565b5f610917826012610c0e565b509050808360028151811061092e5761092e6129ab565b602002602001018181525050505080825f8151811061094f5761094f6129ab565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f918101828152606080830193909352608082018390528152602081019190915281526020019060019003908161097057905050905087815f815181106109c3576109c36129ab565b60200260200101819052506109d88382610cc6565b5050505050505050565b5f805f838060200190518101906109f99190612ad5565b919450925090506001600160a01b038316610a27576040516398521dc560e01b815260040160405180910390fd5b6001600160a01b038216610a4e5760405163456ac4c360e11b815260040160405180910390fd5b610a636001600160a01b038616845f196106c9565b610a776001600160a01b0383168247610f0e565b506105756001600160a01b038616845f6106c9565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610ace57604051633ee5aeb560e01b815260040160405180910390fd5b565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b1580610b27575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610ace576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610119565b5f805f610b69868686610fbc565b9150915080610b945760405162bc8ecf60e31b81526004810187905260248101869052604401610119565b5090505b9392505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b61071b838383600161112e565b5f805f805f610c1d8787611178565b9250925092505f80610c2f85856111d4565b9150915081838015610c3e5750815b9650965050505050505b9250929050565b80471015610c795760405163cf47918160e01b815247600482015260248101829052604401610119565b610c92828260405180602001604052805f81525061141d565b15610c9b575050565b3d15610cad57610ca9611432565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cdd5790505090505f5b8351811015610d3e57838181518110610d1157610d116129ab565b6020026020010151828281518110610d2b57610d2b6129ab565b6020908102919091010152600101610cf6565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610f0357878181518110610da657610da66129ab565b602002602001015193505f845f015160400151511115610efb575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610e1e8c8a6020015161143d565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e499190612bbb565b5f60405180830381865afa158015610e63573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8a9190810190612cb3565b9150505f81511115610ef95784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ecb908a908590600401612d5f565b5f604051808303815f87803b158015610ee2575f80fd5b505af1158015610ef4573d5f803e3d5ffd5b505050505b505b600101610d8b565b505050505050505050565b606081471015610f3a5760405163cf47918160e01b815247600482015260248101839052604401610119565b5f610f4685848661141d565b9050808015610f6757505f3d1180610f6757505f856001600160a01b03163b115b15610f7c57610f7461171f565b915050610b98565b8015610fa657604051639996b31560e01b81526001600160a01b0386166004820152602401610119565b3d15610cad57610fb4611432565b509392505050565b5f805f851215610fe957604051634a7d166b60e01b81526004810186905260248101859052604401610119565b845f03610ffb57505f90506001611126565b8460ff84168501858112156110365760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610119565b5f805f83121561108257604c19831215611059575f809550955050505050611126565b825f03600a0a915081848161107057611070612d7f565b04955050840290911491506111269050565b5f83131561111b57604d8313156110bf5760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b82600a0a9150815f19816110d5576110d5612d7f565b048411156111095760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610119565b50919091029250600191506111269050565b509193506001925050505b935093915050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610bf5578383151615610be9573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8611156111c357600a860460018201600a88065f14935093509350506111cd565b8593509150600190505b9250925092565b5f808383601b82900b82148061130a577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e1000000000000000000870515611255577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515611246576305f5e10087059650600886019550611255565b620186a0870596506005860195505b8687601b0b1461127057600a87059650856001019550611255565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b1999999999999999999999999999999999999999999999999999999888820111611304575f600188039050808160030b036113025760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f9450610c489350505050565b505b50611321565b865f0361132157505f935060019250610c48915050565b858660030b146113d8575f8213156113805761133d8383611738565b156113655760405163d556b11160e01b81526004810184905260248101839052604401610119565b637ffffffe19909501600a0a82029550637fffffff946113d8565b637fffffff1986900360438113156113a257505f9450849350610c4892505050565b80600a0a88816113b4576113b4612d7f565b059750875f036113ce57505f9450849350610c4892505050565b50637fffffff1995505b8186136113e85760019350611401565b818603600a0a83816113fc576113fc612d7f565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff81111561145a5761145a611b7b565b604051908082528060200260200182016040528015611483578160200160208202803683370190505b5090505f80845111611495575f61149b565b83516001015b85516001010190505f8167ffffffffffffffff8111156114bd576114bd611b7b565b6040519080825280602002602001820160405280156114f057816020015b60608152602001906001900390816114db5790505b5090505f611514604080516002815233602082015230818301526060810190915290565b828281518110611526576115266129ab565b60200260200101819052505f5b8751811015611583578180600101925050878181518110611556576115566129ab565b6020026020010151838381518110611570576115706129ab565b6020908102919091010152600101611533565b50855115611715578080600101915050838282815181106115a6576115a66129ab565b60200260200101819052505f5b8651811015611713576116628782815181106115d1576115d16129ab565b60200260200101515f015161163f61160d8a85815181106115f4576115f46129ab565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b898481518110611651576116516129ab565b602002602001015160400151611753565b61168257604051630a57f30960e31b815260048101829052602401610119565b868181518110611694576116946129ab565b60200260200101515f01516001600160a01b03165f1b8582815181106116bc576116bc6129ab565b60200260200101818152505081806001019250508681815181106116e2576116e26129ab565b602002602001015160200151838381518110611700576117006129ab565b60209081029190910101526001016115b3565b505b5095945050505050565b6040513d81523d5f602083013e3d602001810160405290565b5f610b985f8412611749578361174d565b835f035b836117c3565b5f836001600160a01b03163b5f036117b1575f806117718585611861565b5090925090505f81600381111561178a5761178a612d93565b1480156117a85750856001600160a01b0316826001600160a01b0316145b92505050610b98565b6117bc8484846118a7565b9050610b98565b5f637ffffff582136117d657505f6100e1565b637ffffffe19820160438113156117f15750508115156100e1565b5f81126118315780600a0a7b800000000000000000000000000000000000000000000000000000018161182657611826612d7f565b0484119150506100e1565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f8351604103611898576020840151604085015160608601515f1a61188a8882858561190c565b9550955095505050506111cd565b505081515f91506002906111cd565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561194557505f915060039050826119ca565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611996573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b0381166119c157505f9250600191508290506119ca565b92505f91508190505b9450945094915050565b5f602082840312156119e4575f80fd5b81356001600160e01b031981168114610b98575f80fd5b6001600160a01b0381168114610218575f80fd5b8035611a1a816119fb565b919050565b5f8083601f840112611a2f575f80fd5b50813567ffffffffffffffff811115611a46575f80fd5b602083019150836020828501011115610c48575f80fd5b5f805f805f8060a08789031215611a72575f80fd5b8635611a7d816119fb565b95506020870135611a8d816119fb565b94506040870135935060608701359250608087013567ffffffffffffffff811115611ab6575f80fd5b611ac289828a01611a1f565b979a9699509497509295939492505050565b5f805f805f60808688031215611ae8575f80fd5b8535611af3816119fb565b9450602086013567ffffffffffffffff80821115611b0f575f80fd5b9087019060c0828a031215611b22575f80fd5b90945060408701359080821115611b37575f80fd5b611b4389838a01611a1f565b90955093506060880135915080821115611b5b575f80fd5b50860160408189031215611b6d575f80fd5b809150509295509295909350565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405290565b6040805190810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b6040516080810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160a0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b60405160c0810167ffffffffffffffff81118282101715611bb257611bb2611b7b565b604051601f8201601f1916810167ffffffffffffffff81118282101715611c6d57611c6d611b7b565b604052919050565b8015158114610218575f80fd5b8035611a1a81611c75565b5f67ffffffffffffffff821115611ca657611ca6611b7b565b5060051b60200190565b5f67ffffffffffffffff821115611cc957611cc9611b7b565b50601f01601f191660200190565b5f82601f830112611ce6575f80fd5b8135611cf9611cf482611cb0565b611c44565b818152846020838601011115611d0d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608284031215611d39575f80fd5b611d41611b8f565b90508135611d4e816119fb565b81526020820135611d5e816119fb565b6020820152604082013567ffffffffffffffff811115611d7c575f80fd5b611d8884828501611cd7565b60408301525092915050565b5f82601f830112611da3575f80fd5b81356020611db3611cf483611c8d565b82815260069290921b84018101918181019086841115611dd1575f80fd5b8286015b84811015611e175760408189031215611dec575f80fd5b611df4611bb8565b8135611dff816119fb565b81528185013585820152835291830191604001611dd5565b509695505050505050565b5f82601f830112611e31575f80fd5b81356020611e41611cf483611c8d565b82815260059290921b84018101918181019086841115611e5f575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611e82575f80fd5b908801906060828b03601f19011215611e99575f80fd5b611ea1611b8f565b86830135611eae816119fb565b815260408381013583811115611ec2575f80fd5b8401603f81018d13611ed2575f80fd5b88810135611ee2611cf482611c8d565b81815260059190911b82018301908a8101908f831115611f00575f80fd5b928401925b82841015611f1e5783358252928b0192908b0190611f05565b858c0152505050606084013583811115611f36575f80fd5b611f448d8a83880101611cd7565b918301919091525085525050918301918301611e63565b5f82601f830112611f6a575f80fd5b81356020611f7a611cf483611c8d565b82815260059290921b84018101918181019086841115611f98575f80fd5b8286015b84811015611e1757803567ffffffffffffffff80821115611fbb575f80fd5b90880190601f196080838c0382011215611fd3575f80fd5b611fdb611bdb565b8784013583811115611feb575f80fd5b840160a0818e0384011215611ffe575f80fd5b612006611bfe565b9250612013898201611a0f565b8352604081013584811115612026575f80fd5b6120348e8b83850101611d29565b8a850152506060808201358581111561204b575f80fd5b6120598f8c83860101611d94565b604086015250608082013585811115612070575f80fd5b61207e8f8c83860101611d94565b828601525060a0820135608085015283835260408601358a84015280860135604084015260808601359350848411156120b5575f80fd5b6120c38e8b86890101611e22565b90830152508652505050918301918301611f9c565b5f80604083850312156120e9575f80fd5b823567ffffffffffffffff80821115612100575f80fd5b9084019060c08287031215612113575f80fd5b61211b611c21565b82358152602083013560208201526040830135604082015261213f60608401611c82565b6060820152608083013582811115612155575f80fd5b61216188828601611f5b565b60808301525060a083013582811115612178575f80fd5b61218488828601611cd7565b60a0830152509350602085013591508082111561219f575f80fd5b506121ac85828601611cd7565b9150509250929050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f815180845260208085019450602084015f5b8381101561222757815180516001600160a01b0316885283015183880152604090960195908201906001016121f7565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561222757815187529582019590820190600101612245565b5f82825180855260208086019550808260051b8401018186015f5b848110156122e457601f19868403018952815160606001600160a01b0382511685528582015181878701526122b382870182612232565b915050604080830151925085820381870152506122d081836121b6565b9a86019a945050509083019060010161227c565b5090979650505050505050565b5f602080835260e08301845182850152818501516040818187015280870151915060608281880152808801519250608083151560808901526080890151935060a060c060a08a01528585518088526101009750878b019150878160051b8c010189880197505f5b82811015612440578c820360ff190184528851805187845280516001600160a01b03908116898601528d82015188860189905280518216610120870152808f01519091166101408601528a015161016085018a90526123bb6101808601826121b6565b90508a820151607f19808784030160c08801526123d883836121e4565b92508b8401519150808784030160e0880152506123f582826121e4565b915050888201518d8601528d8301518e8601528a8301518b8601528983015192508481038a8601526124278184612261565b9b8e019b968e0196945050506001919091019050612358565b5060a08d01518c8203601f190160c08e0152995061245e818b6121b6565b9d9c50505050505050505050505050565b5f8060408385031215612480575f80fd5b505080516020909101519092909150565b5f604082360312156124a1575f80fd5b6124a9611bb8565b823567ffffffffffffffff808211156124c0575f80fd5b6124cc36838701611d29565b835260208501359150808211156124e1575f80fd5b506124ee36828601611e22565b60208301525092915050565b5f808335601e1984360301811261250f575f80fd5b83018035915067ffffffffffffffff821115612529575f80fd5b6020019150600581901b3603821315610c48575f80fd5b5f60208284031215612550575f80fd5b8135610b9881611c75565b5f808335601e19843603018112612570575f80fd5b830160208101925035905067ffffffffffffffff81111561258f575f80fd5b8060051b3603821315610c48575f80fd5b5f8235605e198336030181126125b4575f80fd5b90910192915050565b5f808335601e198436030181126125d2575f80fd5b830160208101925035905067ffffffffffffffff8111156125f1575f80fd5b803603821315610c48575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e1984360301811261263c575f80fd5b830160208101925035905067ffffffffffffffff81111561265b575f80fd5b8060061b3603821315610c48575f80fd5b8183525f60208085019450825f5b8581101561222757813561268d816119fb565b6001600160a01b0316875281830135838801526040968701969091019060010161267a565b8183526020808401935f91600585811b8301820185855b8881101561278b57858303601f19018a526126e482896125a0565b606081356126f1816119fb565b6001600160a01b031685526127088288018361255b565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115612742575f80fd5b871b80828885013786019050604061275c848201856125bd565b945083888403018289015261277484840186836125ff565b9e8a019e97505050938701935050506001016126c9565b509098975050505050505050565b5f604080835261010080840187358386015260206060818a013581880152848a01356080880152808a01356127cd81611c75565b151560a08801526127e160808b018b61255b565b60c0898101529384905261012093848901600582901b8a018601835f5b8481101561295b578c830361011f19018452813536879003607e19018112612824575f80fd5b8601803536829003609e1901811261283a575f80fd5b608085528101803561284b816119fb565b6001600160a01b0380821660808801526128678c8401846125a0565b915060a080880152813561287a816119fb565b8116878e0152818c013561288d816119fb565b166101408701526128a0818f01826125bd565b91508a6101608801526128b8610180880183836125ff565b9150506128c78e830183612627565b607f19808985030160c08a01526128df84838561266c565b93506128ed8d860186612627565b93509150808985030160e08a01525061290783838361266c565b9250505060808201358d8701528a8301358b8701528d8301358e8701526129308a84018461255b565b935091508581038a8701526129468184846126b2565b968b01969550505091880191506001016127fe565b505061296a60a08f018f6125bd565b8c8303603f190160e08e015299509750612985818a8a6125ff565b98505050505050858403818701525050506129a18185876125ff565b9695505050505050565b634e487b7160e01b5f52603260045260245ffd5b5f8235607e198336030181126129d3575f80fd5b9190910192915050565b5f8235609e198336030181126129d3575f80fd5b5f808335601e19843603018112612a06575f80fd5b83018035915067ffffffffffffffff821115612a20575f80fd5b6020019150600681901b3603821315610c48575f80fd5b5f60208284031215612a47575f80fd5b8135610b98816119fb565b5f6001600160a01b038087168352808616602084015250836040830152608060608301526129a160808301846121b6565b5f60208284031215612a93575f80fd5b8151610b9881611c75565b5f60208284031215612aae575f80fd5b815160ff81168114610b98575f80fd5b5f60208284031215612ace575f80fd5b5051919050565b5f805f60608486031215612ae7575f80fd5b8351612af2816119fb565b6020850151909350612b03816119fb565b604085015190925067ffffffffffffffff811115612b1f575f80fd5b8401601f81018613612b2f575f80fd5b8051612b3d611cf482611cb0565b818152876020838501011115612b51575f80fd5b8160208401602083015e5f602083830101528093505050509250925092565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e457601f19868403018952612ba9838351612232565b98840198925090830190600101612b8d565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e06060840152612bf46101008401826121b6565b9050606084015160808401526080840151601f19808584030160a0860152612c1c8383612b70565b925060a08601519150808584030160c0860152612c398383612232565b925060c08601519150808584030160e0860152506106c08282612232565b5f82601f830112612c66575f80fd5b81516020612c76611cf483611c8d565b8083825260208201915060208460051b870101935086841115612c97575f80fd5b602086015b84811015611e175780518352918301918301612c9c565b5f8060408385031215612cc4575f80fd5b825167ffffffffffffffff80821115612cdb575f80fd5b818501915085601f830112612cee575f80fd5b81516020612cfe611cf483611c8d565b82815260059290921b84018101918181019089841115612d1c575f80fd5b948201945b83861015612d3a57855182529482019490820190612d21565b91880151919650909350505080821115612d52575f80fd5b506121ac85828601612c57565b828152604060208201525f612d776040830184612232565b949350505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000005220000000000000000000000000c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051806080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000059800000000000000000000000009775cf5b76af58a1739d0e66c4e478daed806cba000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000058d36080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611829575080631f69cb75146115cc5780632cb77e9f146115a05780632fbc4ba01461145657806341d1514f1461141f5780635cffe9de146112c3578063607461191461113f578063613255ab146110bc57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611bbe565b6024358281116101825761010c903690600401611bbe565b60c0366043190112610182576101043583811161018257610131903690600401611d64565b90610124359384116101825761014e61015c943690600401611d64565b92610157612afa565b61228e565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a76118ad565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611a2d565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161187c565b9190610278612afa565b6040519261028584611a11565b5f84523691611e38565b90612f92565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161187c565b9190604051926102d684611a11565b5f84528284016102e582611b11565b946102f36040519687611a2d565b8286526102ff83611b11565b9361031186880195601f190186612272565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a82030186528851611939565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b87018761214e565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611a2d565b30614143565b6103ce828a612034565b526103d98189612034565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612196565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161187c565b9061048d612afa565b6104be6104b96104b46104ad6104a38880612181565b604081019061214e565b3691611a4f565b6140d9565b61412e565b801561075f576001101561074d57602483016104da8186611fa1565b90501561073b5760448401946104f08682611fa1565b9050156107295761055661051e9661054a61051561050e8580612181565b9585611fa1565b99909285611fa1565b91909261053b604051976105318961195d565b3389523690611ab3565b9a60209b8c8901523691611b29565b60408601523691611b29565b60608301526064850135608083015261056e82612b3c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861209c565b0390a10191610615838561214e565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611e38565b82808080808080610584565b6106866104ad848661214e565b61068f81614eca565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b51169361214e565b866040519586958652850152606060408501526060840191611d93565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b845260048401526024830190611939565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa612afa565b5f80806107bf60048035608481019101611eea565b9050156110aa5760246004350135926107d784612ba1565b15611098576060806040516107eb816119c5565b6107f3611f3f565b81525f60208201525f6040820152015261080b611f3f565b5061086b61086661084561083b61083561082f608460043501600435600401611eea565b90611f71565b80611f8c565b6040810190611fa1565b602061085e61082f608460043501600435600401611eea565b013591611fd7565b611d7f565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611eea565b6060810190611fa1565b604061085e61082f608460043501600435600401611eea565b81604051976108c88961198d565b16875216602086015260408501526108ea608460043501600435600401611eea565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611eea565b9050811080611085575b15610ed25761093a608460043501600435600401611eea565b821015610ebe578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f836119c5565b8181013567ffffffffffffffff81116101825761099190369084840101611bbe565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d64565b606082015280516001600160a01b036109ec6040830151602085015190612034565b5151166001600160a01b0385511614801590610e8a575b610e7857610a1b6020830151604084015190836134da565b610a2481612b3c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae84611a11565b5f845233918661354c565b5f9491610b2257505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610b1a575b5092610a82565b905088610b13565b610b3760608201516044600435013590612bc4565b15610b9157505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610b0c565b610b9e6040820151612ba1565b158015610e65575b15610bfc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b89565b9250925050600196959691610c15606460043501612048565b15610dd25796610c8597610c9560408401516040880151610c368183613bb3565b15610dca5750925b610c8f848592610c78610c7260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b614583565b9061473e565b9d8e9260408d0151613c7e565b60408c0152613ca8565b99613ca8565b98610ca08484613cd2565b610caa8482613d30565b60405192338452608060208501526060610cd0845160808088015261010087019061209c565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d6c57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d6796604084015260608301520390a180858c5101808d5260051b8c0152613e42565b610b0c565b9091929396602080610dbd600193601f198782030189528b51906001600160a01b0382511681526040610dac85840151606087850152606084019061211b565b920151906040818403910152611939565b9901950193929101610d0d565b905092610c3e565b610c8590610c956060840151610c8f610e10610c7260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b614583565b60408a0151610e1f8183613bb3565b15610e5d5750915b829c8d916060890151908116155f14610e4e575060408801515b96879460408d0151613c7e565b610e589085613bda565b610e41565b905091610e27565b50610e736060820151613b90565b610ba6565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610ea66060830151604085015190612034565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610ee4606460043501612048565b1561107f57835b6004356004013590610efd8282613bb3565b6110615750508490610f1d856001600160a01b0360208701511633613471565b505060a46004350190610f358260043560040161214e565b905015159081611059575b50610fb8575b506001600160a01b03610f5c9293511633612beb565b50505b8351811015610f845780610f7e610f7860019387612034565b5161401b565b01610f5f565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610fe26001600160a01b038551169260043560040161214e565b929091333b156101825761102a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d93565b038183335af190811561022c57859115610f4657905061104a91506119e1565b5f836001600160a01b03610f46565b905088610f40565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610eeb565b506110936040830151612ba1565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b036110e16118ad565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611112575b50604051908152f35b90508181813d8311611138575b6111298183611a2d565b81010312610182575182611109565b503d61111f565b346101825761114d366118ed565b929161115a949194612afa565b611165838333612b6d565b61116e81612ba1565b15611292578160ff91611186856112499695336131a4565b6111908183613bb3565b1561128c575080935b6111a585828533613413565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06111d4898833613471565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112755760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112849261028f913691611e38565b80808061015c565b93611199565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112f26118c3565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761137f956020921693611341868587613334565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d93565b03815f855af193841561022c575f946113eb575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113d2576113c7935030916133ad565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611417575b8161140760209383611a2d565b8101031261018257519284611393565b3d91506113fa565b3461018257606036600319011261018257602061144e61143d6118ad565b6114456118c3565b604435916131a4565b604051908152f35b3461018257611464366118ed565b92809492611470612afa565b61147b828533612b6d565b61148481612ba1565b1561157057806114986114e7928633612beb565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612c91565b939091856115155760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115649661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a082360391820112610182576024358481116101825761161c90369060040161187c565b9093611626612afa565b5f946001600160a01b03948561163b84611d7f565b1633036118075761165461164f3685611bbe565b612b3c565b805f525f60205260405f2096600188541461169b575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816116c7876118d9565b166060890152602484013590606219018112156101825783019060a06080890152806116f5600484016118d9565b16610100890152611708602483016118d9565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117d061028f9a60209f61178f906117fa9f9a606061014061064e9d0152610160880191611d93565b6117c16117b66117a26044880185611db3565b605f198a8603810160a08c01529491611de8565b926064870190611db3565b918784030160c0880152611de8565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061166a565b60248661181385611d7f565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561186b575b5015158152f35b6301ffc9a760e01b14905083611864565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576119359160040161187c565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761197957604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761197957604052565b6040810190811067ffffffffffffffff82111761197957604052565b6080810190811067ffffffffffffffff82111761197957604052565b67ffffffffffffffff811161197957604052565b60e0810190811067ffffffffffffffff82111761197957604052565b6020810190811067ffffffffffffffff82111761197957604052565b90601f8019910116810190811067ffffffffffffffff82111761197957604052565b92919267ffffffffffffffff82116119795760405191611a79601f8201601f191660200184611a2d565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611ab093359101611a4f565b90565b91906060838203126101825760405190611acc8261198d565b8193611ad7816118d9565b8352611ae5602082016118d9565b602084015260408101359167ffffffffffffffff831161018257604092611b0c9201611a95565b910152565b67ffffffffffffffff81116119795760051b60200190565b929192611b3582611b11565b604092611b456040519283611a2d565b819581835260208093019160061b84019381851161018257915b848310611b6e57505050505050565b8583830312610182578386918251611b85816119a9565b611b8e866118d9565b81528286013583820152815201920191611b5f565b9080601f8301121561018257816020611ab093359101611b29565b91909160a0818403126101825760405190611bd88261195d565b8193611be3826118d9565b835267ffffffffffffffff9160208101358381116101825782611c07918301611ab3565b602085015260408101358381116101825782611c24918301611ba3565b6040850152606081013592831161018257611c456080939284938301611ba3565b60608501520135910152565b909291611c5d84611b11565b916040611c6d6040519485611a2d565b839580855260208095019160059160051b8401948086116101825784935b868510611c9c575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611cc78161198d565b611cd0836118d9565b81528a83013584811161018257830185601f8201121561018257803590611cf682611b11565b91611d0389519384611a2d565b8083528d808401918b1b83010191888311610182578e809101915b838310611d5457509150508201528583013593841161018257611d45858c95869501611a95565b86820152815201940193611c8b565b82358152918101918f9101611d1e565b9080601f8301121561018257816020611ab093359101611c51565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611e05575050505090565b909192936001906001600160a01b03611e1d876118d9565b16815285830135838201526040908101950193920190611df7565b90929192611e4581611b11565b91604091611e566040519485611a2d565b839581855260208095019160051b8301938185116101825783925b858410611e815750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611eab816119a9565b82358481116101825786611ec0918501611ab3565b81528983013593841161018257611edb868b95869501611d64565b83820152815201930192611e71565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611f2d8261198d565b60606040835f81525f60208201520152565b60405190611f4c8261195d565b5f608083828152611f5b611f20565b6020820152606060408201526060808201520152565b9015610ebe57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610ebe5760061b0190565b805115610ebe5760200190565b805160011015610ebe5760400190565b805160021015610ebe5760600190565b805160031015610ebe5760800190565b805160041015610ebe5760a00190565b8051821015610ebe5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612074575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612066565b906080806121126121006120ee60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611939565b60408701518682036040880152612055565b60608601518582036060870152612055565b93015191015290565b9081518082526020808093019301915f5b82811061213a575050505090565b83518552938101939281019260010161212c565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121ad61164f6121a68380611f8c565b3690611bbe565b5f525f602052600160405f20540361224d57806121cd8161223993611f8c565b6122316121ec6121f16020850135938460408701359384923690611bbe565b6134da565b6122096121fe8580611f8c565b946060810190611eea565b92906122296040519661221b88611a11565b5f88525f3681373690611bbe565b933691611c51565b9233926137f8565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60808110612264575050565b606082820152602001612258565b5f5b82811061228057505050565b606082820152602001612274565b926001600160a01b038451166001600160a01b0383511614612ae8576001600160a01b036122c3606086015160643590612034565b5151166001600160a01b036122df604085015160843590612034565b51511614801590612aa8575b610e78576001600160a01b03612308604086015160443590612034565b5151166001600160a01b036123236064356060880151612034565b51511614612a965761233484612b3c565b805f525f60205260405f205415612a46575061234f82612b3c565b805f525f60205260405f2054156129f6575061240e907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e39604051806123b26123a461012033845280602085015283018a61209c565b82810360408401528761209c565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0383511690604051916123ff83611a11565b5f8352606435604435886137f8565b905061264d6001600160a01b03855116936040519461242c86611a11565b5f865261243761350f565b50604051906124458261195d565b6004825261245560208301612256565b61245e86612b3c565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261249182611fe7565b5261249b81611fe7565b506040516124a88161198d565b6002815260403660208301376124bd82611ff4565b526124c781611ff4565b506125976124ee6001600160a01b036124e660843560408a0151612034565b515116614527565b6125326001600160a01b038851166001600160a01b0361251460843560408c0151612034565b515116602061252960843560408d0151612034565b510151916131a4565b906001600160a01b0361254b60843560408b0151612034565b51511660ff602061256260843560408d0151612034565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6125a082612004565b526125aa81612004565b506126346125c96001600160a01b036124e660a43560608a0151612034565b6126046001600160a01b038851166001600160a01b036125ef60a43560608c0151612034565b515116602061252960a43560608d0151612034565b906001600160a01b0361261d60a43560608b0151612034565b51511660ff602061256260a43560608d0151612034565b61263d82612014565b5261264781612014565b506142f5565b926126e35f6001600160a01b038551169260208601908151906001600160a01b036020818451169301511692868552306020526040808620915101516040519161269683611a11565b868352604051956126a6876119f5565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936129d0575b50612702576040513d5f823e3d90fd5b908151600281106129b857506040602083015192015161272a61272488612024565b51612014565b516127358183613bb3565b156129b05750925b61275f8385919060405192600284526020840152604083015260608201604052565b61276888612004565b5261277287612004565b5060405196612780886119f5565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526127b56040840151612ba1565b1591821561299c575b508115612987575b8115612976575b5061296457604051916127df836119c5565b5f83525f60208401525f60408401525f60608401526127fe8483614eee565b845260408401526128246128128386614eee565b60208601528060608601528451613c7e565b946128386020850151604086015190613c7e565b9361284287613b90565b8015612955575b6129435761290a61293c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128ec6129419a60a09661288b8a8851613cd2565b6128998c6020890151613cd2565b6128a78a6040890151613d30565b6128b58c6060890151613d30565b6128be8a61401b565b6128c78c61401b565b6001600160a01b036128e360c435926060606435910151612034565b51511633612c91565b50506001600160a01b036128e360e43592606060a435910151612034565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e42565b613e42565b565b604051630d86822160e01b8152600490fd5b5061295f85613b90565b612849565b6040516321badf1f60e01b8152600490fd5b612981915051613b90565b5f6127cd565b90506129966060830151613b90565b906127c6565b6129a891925051612ba1565b15905f6127be565b90509261273d565b60249060405190630fbb8e5560e21b82526004820152fd5b9092506129ef91503d805f833e6129e78183611a2d565b810190612d55565b915f6126f2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612a41565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612ac2606084015160a43590612034565b5151166001600160a01b03612ade604087015160443590612034565b51511614156122eb565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b2a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b6781612b59602082019460208652604083019061209c565b03601f198101835282611a2d565b51902090565b909115612b78575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612bc0905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1290565b90612bc0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b929192612bf782614216565b93612c0181613b90565b612c7f5784816001600160e01b03612c209360e01d9116601b0b615051565b9290809315612c56575b50829081612c3a575b5050509190565b612c4e926001600160a01b033092166133ad565b5f8181612c33565b9092505f198114612c6b57600101915f612c2a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612c9e83613b90565b612d3c5784612cba57612cb2939450613471565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613ca8565b95612d0187613b90565b612d24575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612d9082611b11565b91612d9e6040519384611a2d565b808352848084019160051b830101918683116101825785809101915b838310612e2d5750505050948281015191821161018257019180601f84011215610182578251612de981611b11565b93612df76040519586611a2d565b818552838086019260051b820101928311610182578301905b828210612e1e575050505090565b81518152908301908301612e10565b8251815291810191869101612dba565b90808251908181526020809101926020808460051b8301019501935f915b848310612e6b5750505050505090565b9091929394958480612e89600193601f198682030187528a5161211b565b9801930193019194939290612e5b565b91906020928381526001600160a01b0382511684820152838201516040820152612ed3604083015160e06060840152610100830190611939565b9060608301516080820152612efa608084015192601f1993848483030160a0850152612e3d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f3d57505050611ab094955060c060e0910151928285030191015261211b565b825187529588019591880191600101612f19565b90604082019082526020606081936040838201528551809452019301915f5b828110612f7e575050505090565b835185529381019392810192600101612f70565b916040805191612fa18361195d565b60048084526020612fb3818601612256565b5f5b8751811015612fe85780612fcb6001928a612034565b51612fd68289612034565b52612fe18188612034565b5001612fb5565b5092955092939093335f52308352855f2091865190613006826119a9565b61300e611f20565b825260608581930152875161302281611a11565b5f815288519161303183611a11565b5f83525f3681375f5b81518110156131975761304d8183612034565b5190888c8b84519189818401518d8d8251613075575b5050505050505050600191500161303a565b5f6130e497948197948c97946130a28c956001600160a01b039d8e81818d51169c0151169b0151906142f5565b948651996130af8b6119f5565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612e99565b03915afa93841561318d578b915f9561316f575b50845161310d575b50908b8e89838d8d613063565b51015116803b156101825761313c925f918c8f84905180978195829463012c676d60e21b845233908401612f51565b03925af191821561316557600192613156575b8981613100565b61315f906119e1565b5f61314f565b8c513d5f823e3d90fd5b6131849195503d805f833e6129e78183611a2d565b9050935f6130f8565b8e513d5f823e3d90fd5b5050505050505050509050565b82156131d9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506131e582614527565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156132fb575f97613305575b508361323c6132358361326c9a615206565b5090614991565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156132fb575f976132ca575b5061323561329091611ab098615206565b5061329b8183613bb3565b156132c25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ca8565b9050936132a3565b96508387813d83116132f4575b6132e18183611a2d565b810103126101825795519561323561327f565b503d6132d7565b85513d5f823e3d90fd5b96508387813d831161332d575b61331c8183611a2d565b810103126101825795519583613223565b503d613312565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561338e575b836040521561337857505050565b635274afe760e01b835216600482015260249150fd5b60018115166133a457813b15153d15161661336a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156133fd575b836040525f6060521561337857505050565b60018115166133a457813b15153d1516166133eb565b9392919361342083613b90565b612d3c578461343457612cb2939450612beb565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613c7e565b9092919261347e81614216565b9361348881613b90565b6134c85784816001600160e01b036134a79360e01d9116601b0b615051565b508092816134b6575050509190565b6001600160a01b03612c4e9316613334565b604051632d1671a360e11b8152600490fd5b916135059060606134fa936001600160a01b039485916040880151612034565b515116940151612034565b51511614612a9657565b6040519061351c826119f5565b606060c083613529611f3f565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b9594919390869361355b61350f565b505f92604061368081519261356f8461195d565b60048452602093613581858201612256565b61364961358d8b612b3c565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135c486611fe7565b526135ce85611fe7565b5087516135da8161198d565b6002815288368b8301376135ed86611ff4565b526135f785611ff4565b5060ff896125628a85019361363387613615816124e6858a51612034565b97511688613624848951612034565b51511685612529858a51612034565b9661363f828751612034565b5151169451612034565b61365282612004565b5261365c81612004565b50612634878b8d60ff896125628c85019361363387613615816124e6858a51612034565b946137005f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136b883611a11565b8683528951956136c7876119f5565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936137da575b506137cd575050505f975b6002855110988915996137ba5782848701519601519061373c61272489612024565b51906137488284613bb3565b1590506137b25750925b6137748685919060405192600284526020840152604083015260608201604052565b61377d88612004565b5261378787612004565b5082519b6137948d6119f5565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613752565b5050505050505050509150611ab061350f565b919998509450939661371a565b9092506137f191503d805f833e6129e78183611a2d565b915f61370f565b9495939592919261380761350f565b506040968751906138178261195d565b60048252602093613829858401612256565b61383289612b3c565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261386484611fe7565b5261386e83611fe7565b50895161387a8161198d565b600281528a368783013761388d84611ff4565b5261389783611ff4565b508989019086818351906138aa91612034565b5151166138b690614527565b86888c511689848651906138c991612034565b51511682858751906138da91612034565b510151906138e7926131a4565b9289818651906138f691612034565b51511694519061390591612034565b5101519060ff1661393d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61394683612004565b5261395082612004565b5060608801858782519061396391612034565b51511661396f90614527565b868a5116878984519061398191612034565b515116878a85519061399291612034565b5101519061399f926131a4565b90868989818651906139b091612034565b5151169451906139bf91612034565b5101519060ff166139f7929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a0083612014565b52613a0a82612014565b50613a14916142f5565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a4583611a11565b5f83528c5196613a54886119f5565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613a939060048301612e99565b03815a935f94fa91825f915f94613b72575b50613ab45788513d5f823e3d90fd5b97949596979194825196600288109788613b5b57508183850151940151613add61272487612024565b51613ae88183613bb3565b15613b535750925b613b128585919060405192600284526020840152604083015260608201604052565b613b1b87612004565b52613b2586612004565b5082519a613b328c6119f5565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613af0565b602490835190630fbb8e5560e21b82526004820152fd5b909350613b8991503d805f833e6129e78183611a2d565b925f613aa5565b613baf905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1390565b90613baf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b613c016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614748565b90637ffffff58213613c51575b90613c1891614991565b9290921580613c49575b613c2b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c22565b613c5b8282615631565b15613c0e57604483856040519163d556b11160e01b835260048301526024820152fd5b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614b97565b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d5b565b613d2c916080810182613cee613ce88351612024565b51612024565b52613d25613d1f6001600160a01b03809451511693613d16613d108551612024565b51611fe7565b51169251612024565b51612004565b5191613413565b5050565b90608081019180613d44613ce88551612014565b526001600160a01b03809251511691613d60613d108551612014565b5116613d6f613d1f8551612014565b519081613e0a57613d7f83613b90565b612d3c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a41955f5260209060018252613dd5604094855f20835f528452855f20855f528452855f2054613ca8565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e3d565b91613e3b917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a4195612c91565b5050613def565b60c0810151908151915f92613fb6575b50613ef76020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613e9f83611a11565b8683528c5193613eae85611a11565b8785528d5196613ebd886119f5565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612e99565b03915afa948515613fac578795613f8e575b508451613f1a575b50505050505050565b81905101510151169051813b15613f8a57918491849383613f4f965180978195829463012c676d60e21b845260048401612f51565b03925af1908115613f815750613f6a575b8080808080613f11565b613f7482916119e1565b613f7e5780613f60565b80fd5b513d84823e3d90fd5b8480fd5b613fa39195503d8089833e6129e78183611a2d565b9050935f613f09565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613ff9925f928360405180968195829463012c676d60e21b845260048401612f51565b03925af1801561022c5715613e52576140139192506119e1565b5f905f613e52565b6080810161402c613d1f8251612014565b5191821561403957505050565b614053613d106001600160a01b0380935151169351612014565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661408e575b505050505050565b6140b2955f9284845260018152828420868552815282842091845252812055613471565b5f808080614086565b81156140c5570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614121576020810151908051603f198101908111612c6b5760051c821161410d5760016020920160051b010190565b505060405161411b81611a11565b5f815290565b5060405161411b81611a11565b80511561413e57602001515f1a90565b505f90565b905f8091602081519101845af480806141c1575b156141775750506040513d81523d5f602083013e60203d82010160405290565b1561419e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141af576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806141575750813b1515614157565b600411156141de57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614212836141d4565b0152565b61421e61571f565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af19283156142ec575f925f946142b7575b50614274836141d4565b6001831415806142a5575b6142895750505090565b5163ee07877f60e01b81529182916107259190600484016141f2565b506142af836141d4565b82151561427f565b908094506142db9293503d85116142e5575b6142d38183611a2d565b810190615027565b919091925f61426a565b503d6142c9565b513d5f823e3d90fd5b9080519161430283611b11565b9161431d60409461431586519586611a2d565b808552611b11565b601f19946020918601368684013783518351909590801561451c5760016143739101965b600197889101019761436a6143558a611b11565b9961436286519b8c611a2d565b808b52611b11565b01848901612272565b85805f96845160028152338782015230868201526060810186526143968b611fe7565b526143a08a611fe7565b505f925b6144d8575b50505083516143bc575b50505050505090565b858095989796929801816143d08289612034565b526143db8188612034565b505f925b6143ee575b50859697506143b3565b84518310156144d3576001600160a01b036144658161440d8689612034565b5151168661441b878a612034565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c61445c888b612034565b5101519161517d565b156144bb57868098999a92819261447c878a612034565b5151166144898787612034565b520193856144978289612034565b5101516144a4868c612034565b526144af858b612034565b500192909897966143df565b8951630a57f30960e31b815260048101859052602490fd5b6143e4565b90919681518810156145135782809101976144f38184612034565b516144fe8a8d612034565b52614509898c612034565b50019190816143a4565b968291506143a9565b506143735f96614341565b61452f61571f565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa9283156142ec575f925f946142b75750614274836141d4565b9091939284158215175f1461459d5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146d4575b50506145c0816152f6565b936145ca816152f6565b946145d58682615316565b909182156146c5575f9083986f0785ee10d5da46d900f436a0000000008086116146b7575b50670de0b6b3a7640000808b116146a8575b50633b9aca00808b11614699575b50612710808b1161468b575b5098805b61467a57508190611935989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615329565b60019290920191600a90048061462a565b60049a04998a930192614626565b600991939a049901915f61461a565b601291939a049901915f61460c565b85049950602592505f6145fa565b50929050611935949550615329565b5f8212156147285780841361471a575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145b557909250611935939491615234565b90925061193593949161529b565b808412156146e457909250611935939491615234565b613c188282614991565b9290918061476e576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461478357505050505f905f90565b61479c93614790916153e3565b929194909384926153e3565b90939192846147aa886152f6565b916147b4866152f6565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061495b575b030191600160ff1b98838a018112155f14614928575050035b5f955f82128061491f575b614901575b5f8112806148ef575b6148d15786820103966001600160ff1b03881490816148c7575b50806148be575b806148b5575b61489757509061484b929161558f565b915f811361485e575b5061193593615329565b9091604c821361488c5761487591600a0a906140bb565b908115614882575f614854565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261483b565b50828414614835565b905088145f61482e565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614814565b95508087018613156149195786818703015b9561480b565b5f614913565b505f8113614806565b89985090920390506001600160ff1b038190038701821361494c57018601946147fb565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506147e2565b81156140c5570590565b8082601b82810b8314614b86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b32575b8380820b03614b2157507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614ad2575b838060030b03614a56575b808413614a3a5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140c5576001600160e01b0391071592614a31565b92915f841315614aa6575090614a6c8383615631565b614a8857637ffffffe1901600a0a810290637fffffff92614a1c565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361488c57614ac591600a0a90614987565b9182156148825792614a1c565b5f198401808060030b14614ae65750614a11565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149c4565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b73576305f5e100600894058094819201955b9150506149c4565b620186a060059405809481920195614b6b565b5082614a1157505050505f90600190565b919291600160ff1b8401614baf57611935935061564a565b90611935935f0391614d5b565b919291600160ff1b9190801580614d49575090614bd8916153e3565b9490929091905f868585858282138015614d40575b614d23575b505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614cee575b505081019182821860ff1c1115614ce657826001600160ff1b0314614cc857905f600192135f14614c9957600a9004915b01925b81158117614c5d57509190565b80614c76575b508015614c6e579190565b505f91508190565b9192614c8c9203600160ff1b01600a0a90614987565b600160ff1b91905f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c4d565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c50565b8107614cfb575b80614c1c565b60ff1d600117015f614cf5565b505050919350614d16579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614bf2565b50835f12614bed565b15614d545750509190565b9350919050565b9392919384158115818117614eac57505090614d76916153e3565b9194908295614d87829582946153e3565b8096929491969387868482138015614ea3575b614e8a575b5050505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614e70575b505081019182821860ff1c1115614e6857826001600160ff1b0314614cc857905f600192135f14614e3957600a9004915b01925b81158117614e0c57509190565b80614e1c57508015614c6e579190565b600160ff1b93614e339291038401600a0a90614987565b5f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614dfc565b509092614dff565b8107614e7d575b80614dcb565b60ff1d600117015f614e77565b929b5098509196509450925090505f8080808080614d9f565b50858412614d9a565b9395939092919015614ec2575050614c6e579190565b945092915050565b600881511061413e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f28610c72606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614583565b94519301614f37815186612bc4565b614f3f575050565b909350611ab091925051925183613bda565b92915f9060018184145f87128715171717614fcb575f92808213614fbd575b03604c81135f821217614fb157600a0a9084614f8f8382029384614987565b14614fa457505015614fa0575f9190565b5f90565b9093509015611ab0579190565b505015614fa0575f9190565b5f9560019450925090614f70565b5050505f90565b93929190918083145f83125f87121883158715171717615021575f928082136150145703604c81135f821217614fb157600a0a9084614f8f8382029384614987565b9194600193509190614f70565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615079576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361508b57505090505f90600190565b60ff8116820191808312615153575f8312156150c3575050604c198112614c6e575f03600a0a916150bc83826140bb565b9283021490565b909293915f81135f1461514957604d811361511e57600a0a9283156140c557835f190483116150f55750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151b85761518f9192615788565b50615199816141d4565b1591826151a557505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461522c57600a6001818404940192061590565b909190600190565b909392915f615244918184614583565b9490945f8483019182019412159081615291575b8115615287575b5061526957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f61525f565b8281129150615258565b6152b093600160fe1b90810193920190614583565b9081815f8212156152e7575050604b198212612cb2576152d5915f03600a0a90614987565b90816152df575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611ab057600160ff1b9080820361530f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153be576001600160ff1b0392838311156153a857600160ff1b9383850361535e57505050509190565b90919293508514615378575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c6b575f039190565b90916001600160ff1b0380841115612c33578514615378575050600a60019104920190565b919091801561558557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615493575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615484575b831361546e5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615462565b6f4b3b4ca85a86c47a098a22400000000080840515615573575b507728c87cb5c89a2571ebfdcb54864ada834a0000000000000083051561555c575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615548575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561553857820515615529575b5f615417565b9290600a02905f190192615523565b93916064029160011901936154f4565b93916402540be400029160091901936154f4565b9391678ac7230489e80000029160121901936154cf565b6025198301955092909202915f6154ad565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561560d5714615605579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611ab091905f811215615645575f036157c2565b6157c2565b909291600160ff1b918281016156dc57508084146156d2578084139182156156ca578185035b604c8111156156b95750505f915b156156aa57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140c557049161567e565b848203615670565b505090505f905f90565b936156e992945f03614bbc565b809391809281146156fd575b50505f039190565b915092506001600160ff1b038314614cc857600a600191059201915f806156f5565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561575d575b6157455750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561573e565b81519190604183036157b8576157b19250602082015190606060408401519301515f1a90615851565b9192909190565b50505f9160029190565b90637ffffff581131561584b57637ffffffe1981019060438213615844575f82121561581857637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140c5577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158c8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158be57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca56000000000000000000000000000000000000000000"; diff --git a/src/generated/candidate/RaindexV6.sol b/src/generated/candidate/RaindexV6.sol index b53e3d0ef5..224413e5e6 100644 --- a/src/generated/candidate/RaindexV6.sol +++ b/src/generated/candidate/RaindexV6.sol @@ -5,19 +5,19 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xf7f6fb2d7658986e321c27fa6351690e170819f2dc34cdc983469a05df491aef); +bytes32 constant BYTECODE_HASH = bytes32(0xf68db8cc36e7b717eaaab05b2f4b00f8ea232fe17325a86e12865ddef0ff13c1); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0xC4cF8F35f6fa0a36CBAea5c0a6cEa77134C03e2A); +address constant DEPLOYED_ADDRESS = address(0x9775cf5b76aF58A1739D0e66c4E478dAEd806cba); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055615180908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040523460395760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556158d3908161003e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611829575080631f69cb75146115cc5780632cb77e9f146115a05780632fbc4ba01461145657806341d1514f1461141f5780635cffe9de146112c3578063607461191461113f578063613255ab146110bc57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611bbe565b6024358281116101825761010c903690600401611bbe565b60c0366043190112610182576101043583811161018257610131903690600401611d64565b90610124359384116101825761014e61015c943690600401611d64565b92610157612afa565b61228e565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a76118ad565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611a2d565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161187c565b9190610278612afa565b6040519261028584611a11565b5f84523691611e38565b90612f92565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161187c565b9190604051926102d684611a11565b5f84528284016102e582611b11565b946102f36040519687611a2d565b8286526102ff83611b11565b9361031186880195601f190186612272565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a82030186528851611939565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b87018761214e565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611a2d565b30614143565b6103ce828a612034565b526103d98189612034565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612196565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161187c565b9061048d612afa565b6104be6104b96104b46104ad6104a38880612181565b604081019061214e565b3691611a4f565b6140d9565b61412e565b801561075f576001101561074d57602483016104da8186611fa1565b90501561073b5760448401946104f08682611fa1565b9050156107295761055661051e9661054a61051561050e8580612181565b9585611fa1565b99909285611fa1565b91909261053b604051976105318961195d565b3389523690611ab3565b9a60209b8c8901523691611b29565b60408601523691611b29565b60608301526064850135608083015261056e82612b3c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861209c565b0390a10191610615838561214e565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611e38565b82808080808080610584565b6106866104ad848661214e565b61068f81614eca565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b51169361214e565b866040519586958652850152606060408501526060840191611d93565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b845260048401526024830190611939565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa612afa565b5f80806107bf60048035608481019101611eea565b9050156110aa5760246004350135926107d784612ba1565b15611098576060806040516107eb816119c5565b6107f3611f3f565b81525f60208201525f6040820152015261080b611f3f565b5061086b61086661084561083b61083561082f608460043501600435600401611eea565b90611f71565b80611f8c565b6040810190611fa1565b602061085e61082f608460043501600435600401611eea565b013591611fd7565b611d7f565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611eea565b6060810190611fa1565b604061085e61082f608460043501600435600401611eea565b81604051976108c88961198d565b16875216602086015260408501526108ea608460043501600435600401611eea565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611eea565b9050811080611085575b15610ed25761093a608460043501600435600401611eea565b821015610ebe578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f836119c5565b8181013567ffffffffffffffff81116101825761099190369084840101611bbe565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d64565b606082015280516001600160a01b036109ec6040830151602085015190612034565b5151166001600160a01b0385511614801590610e8a575b610e7857610a1b6020830151604084015190836134da565b610a2481612b3c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae84611a11565b5f845233918661354c565b5f9491610b2257505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610b1a575b5092610a82565b905088610b13565b610b3760608201516044600435013590612bc4565b15610b9157505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610b0c565b610b9e6040820151612ba1565b158015610e65575b15610bfc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b89565b9250925050600196959691610c15606460043501612048565b15610dd25796610c8597610c9560408401516040880151610c368183613bb3565b15610dca5750925b610c8f848592610c78610c7260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b614583565b9061473e565b9d8e9260408d0151613c7e565b60408c0152613ca8565b99613ca8565b98610ca08484613cd2565b610caa8482613d30565b60405192338452608060208501526060610cd0845160808088015261010087019061209c565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d6c57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d6796604084015260608301520390a180858c5101808d5260051b8c0152613e42565b610b0c565b9091929396602080610dbd600193601f198782030189528b51906001600160a01b0382511681526040610dac85840151606087850152606084019061211b565b920151906040818403910152611939565b9901950193929101610d0d565b905092610c3e565b610c8590610c956060840151610c8f610e10610c7260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b614583565b60408a0151610e1f8183613bb3565b15610e5d5750915b829c8d916060890151908116155f14610e4e575060408801515b96879460408d0151613c7e565b610e589085613bda565b610e41565b905091610e27565b50610e736060820151613b90565b610ba6565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610ea66060830151604085015190612034565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610ee4606460043501612048565b1561107f57835b6004356004013590610efd8282613bb3565b6110615750508490610f1d856001600160a01b0360208701511633613471565b505060a46004350190610f358260043560040161214e565b905015159081611059575b50610fb8575b506001600160a01b03610f5c9293511633612beb565b50505b8351811015610f845780610f7e610f7860019387612034565b5161401b565b01610f5f565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610fe26001600160a01b038551169260043560040161214e565b929091333b156101825761102a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d93565b038183335af190811561022c57859115610f4657905061104a91506119e1565b5f836001600160a01b03610f46565b905088610f40565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610eeb565b506110936040830151612ba1565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b036110e16118ad565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611112575b50604051908152f35b90508181813d8311611138575b6111298183611a2d565b81010312610182575182611109565b503d61111f565b346101825761114d366118ed565b929161115a949194612afa565b611165838333612b6d565b61116e81612ba1565b15611292578160ff91611186856112499695336131a4565b6111908183613bb3565b1561128c575080935b6111a585828533613413565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06111d4898833613471565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112755760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112849261028f913691611e38565b80808061015c565b93611199565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112f26118c3565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761137f956020921693611341868587613334565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d93565b03815f855af193841561022c575f946113eb575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113d2576113c7935030916133ad565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611417575b8161140760209383611a2d565b8101031261018257519284611393565b3d91506113fa565b3461018257606036600319011261018257602061144e61143d6118ad565b6114456118c3565b604435916131a4565b604051908152f35b3461018257611464366118ed565b92809492611470612afa565b61147b828533612b6d565b61148481612ba1565b1561157057806114986114e7928633612beb565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612c91565b939091856115155760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115649661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a082360391820112610182576024358481116101825761161c90369060040161187c565b9093611626612afa565b5f946001600160a01b03948561163b84611d7f565b1633036118075761165461164f3685611bbe565b612b3c565b805f525f60205260405f2096600188541461169b575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816116c7876118d9565b166060890152602484013590606219018112156101825783019060a06080890152806116f5600484016118d9565b16610100890152611708602483016118d9565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117d061028f9a60209f61178f906117fa9f9a606061014061064e9d0152610160880191611d93565b6117c16117b66117a26044880185611db3565b605f198a8603810160a08c01529491611de8565b926064870190611db3565b918784030160c0880152611de8565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061166a565b60248661181385611d7f565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561186b575b5015158152f35b6301ffc9a760e01b14905083611864565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576119359160040161187c565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761197957604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761197957604052565b6040810190811067ffffffffffffffff82111761197957604052565b6080810190811067ffffffffffffffff82111761197957604052565b67ffffffffffffffff811161197957604052565b60e0810190811067ffffffffffffffff82111761197957604052565b6020810190811067ffffffffffffffff82111761197957604052565b90601f8019910116810190811067ffffffffffffffff82111761197957604052565b92919267ffffffffffffffff82116119795760405191611a79601f8201601f191660200184611a2d565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611ab093359101611a4f565b90565b91906060838203126101825760405190611acc8261198d565b8193611ad7816118d9565b8352611ae5602082016118d9565b602084015260408101359167ffffffffffffffff831161018257604092611b0c9201611a95565b910152565b67ffffffffffffffff81116119795760051b60200190565b929192611b3582611b11565b604092611b456040519283611a2d565b819581835260208093019160061b84019381851161018257915b848310611b6e57505050505050565b8583830312610182578386918251611b85816119a9565b611b8e866118d9565b81528286013583820152815201920191611b5f565b9080601f8301121561018257816020611ab093359101611b29565b91909160a0818403126101825760405190611bd88261195d565b8193611be3826118d9565b835267ffffffffffffffff9160208101358381116101825782611c07918301611ab3565b602085015260408101358381116101825782611c24918301611ba3565b6040850152606081013592831161018257611c456080939284938301611ba3565b60608501520135910152565b909291611c5d84611b11565b916040611c6d6040519485611a2d565b839580855260208095019160059160051b8401948086116101825784935b868510611c9c575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611cc78161198d565b611cd0836118d9565b81528a83013584811161018257830185601f8201121561018257803590611cf682611b11565b91611d0389519384611a2d565b8083528d808401918b1b83010191888311610182578e809101915b838310611d5457509150508201528583013593841161018257611d45858c95869501611a95565b86820152815201940193611c8b565b82358152918101918f9101611d1e565b9080601f8301121561018257816020611ab093359101611c51565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611e05575050505090565b909192936001906001600160a01b03611e1d876118d9565b16815285830135838201526040908101950193920190611df7565b90929192611e4581611b11565b91604091611e566040519485611a2d565b839581855260208095019160051b8301938185116101825783925b858410611e815750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611eab816119a9565b82358481116101825786611ec0918501611ab3565b81528983013593841161018257611edb868b95869501611d64565b83820152815201930192611e71565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611f2d8261198d565b60606040835f81525f60208201520152565b60405190611f4c8261195d565b5f608083828152611f5b611f20565b6020820152606060408201526060808201520152565b9015610ebe57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610ebe5760061b0190565b805115610ebe5760200190565b805160011015610ebe5760400190565b805160021015610ebe5760600190565b805160031015610ebe5760800190565b805160041015610ebe5760a00190565b8051821015610ebe5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612074575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612066565b906080806121126121006120ee60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611939565b60408701518682036040880152612055565b60608601518582036060870152612055565b93015191015290565b9081518082526020808093019301915f5b82811061213a575050505090565b83518552938101939281019260010161212c565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121ad61164f6121a68380611f8c565b3690611bbe565b5f525f602052600160405f20540361224d57806121cd8161223993611f8c565b6122316121ec6121f16020850135938460408701359384923690611bbe565b6134da565b6122096121fe8580611f8c565b946060810190611eea565b92906122296040519661221b88611a11565b5f88525f3681373690611bbe565b933691611c51565b9233926137f8565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60808110612264575050565b606082820152602001612258565b5f5b82811061228057505050565b606082820152602001612274565b926001600160a01b038451166001600160a01b0383511614612ae8576001600160a01b036122c3606086015160643590612034565b5151166001600160a01b036122df604085015160843590612034565b51511614801590612aa8575b610e78576001600160a01b03612308604086015160443590612034565b5151166001600160a01b036123236064356060880151612034565b51511614612a965761233484612b3c565b805f525f60205260405f205415612a46575061234f82612b3c565b805f525f60205260405f2054156129f6575061240e907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e39604051806123b26123a461012033845280602085015283018a61209c565b82810360408401528761209c565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0383511690604051916123ff83611a11565b5f8352606435604435886137f8565b905061264d6001600160a01b03855116936040519461242c86611a11565b5f865261243761350f565b50604051906124458261195d565b6004825261245560208301612256565b61245e86612b3c565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261249182611fe7565b5261249b81611fe7565b506040516124a88161198d565b6002815260403660208301376124bd82611ff4565b526124c781611ff4565b506125976124ee6001600160a01b036124e660843560408a0151612034565b515116614527565b6125326001600160a01b038851166001600160a01b0361251460843560408c0151612034565b515116602061252960843560408d0151612034565b510151916131a4565b906001600160a01b0361254b60843560408b0151612034565b51511660ff602061256260843560408d0151612034565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6125a082612004565b526125aa81612004565b506126346125c96001600160a01b036124e660a43560608a0151612034565b6126046001600160a01b038851166001600160a01b036125ef60a43560608c0151612034565b515116602061252960a43560608d0151612034565b906001600160a01b0361261d60a43560608b0151612034565b51511660ff602061256260a43560608d0151612034565b61263d82612014565b5261264781612014565b506142f5565b926126e35f6001600160a01b038551169260208601908151906001600160a01b036020818451169301511692868552306020526040808620915101516040519161269683611a11565b868352604051956126a6876119f5565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936129d0575b50612702576040513d5f823e3d90fd5b908151600281106129b857506040602083015192015161272a61272488612024565b51612014565b516127358183613bb3565b156129b05750925b61275f8385919060405192600284526020840152604083015260608201604052565b61276888612004565b5261277287612004565b5060405196612780886119f5565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526127b56040840151612ba1565b1591821561299c575b508115612987575b8115612976575b5061296457604051916127df836119c5565b5f83525f60208401525f60408401525f60608401526127fe8483614eee565b845260408401526128246128128386614eee565b60208601528060608601528451613c7e565b946128386020850151604086015190613c7e565b9361284287613b90565b8015612955575b6129435761290a61293c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128ec6129419a60a09661288b8a8851613cd2565b6128998c6020890151613cd2565b6128a78a6040890151613d30565b6128b58c6060890151613d30565b6128be8a61401b565b6128c78c61401b565b6001600160a01b036128e360c435926060606435910151612034565b51511633612c91565b50506001600160a01b036128e360e43592606060a435910151612034565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e42565b613e42565b565b604051630d86822160e01b8152600490fd5b5061295f85613b90565b612849565b6040516321badf1f60e01b8152600490fd5b612981915051613b90565b5f6127cd565b90506129966060830151613b90565b906127c6565b6129a891925051612ba1565b15905f6127be565b90509261273d565b60249060405190630fbb8e5560e21b82526004820152fd5b9092506129ef91503d805f833e6129e78183611a2d565b810190612d55565b915f6126f2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612a41565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612ac2606084015160a43590612034565b5151166001600160a01b03612ade604087015160443590612034565b51511614156122eb565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b2a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b6781612b59602082019460208652604083019061209c565b03601f198101835282611a2d565b51902090565b909115612b78575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612bc0905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1290565b90612bc0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b929192612bf782614216565b93612c0181613b90565b612c7f5784816001600160e01b03612c209360e01d9116601b0b615051565b9290809315612c56575b50829081612c3a575b5050509190565b612c4e926001600160a01b033092166133ad565b5f8181612c33565b9092505f198114612c6b57600101915f612c2a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612c9e83613b90565b612d3c5784612cba57612cb2939450613471565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613ca8565b95612d0187613b90565b612d24575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612d9082611b11565b91612d9e6040519384611a2d565b808352848084019160051b830101918683116101825785809101915b838310612e2d5750505050948281015191821161018257019180601f84011215610182578251612de981611b11565b93612df76040519586611a2d565b818552838086019260051b820101928311610182578301905b828210612e1e575050505090565b81518152908301908301612e10565b8251815291810191869101612dba565b90808251908181526020809101926020808460051b8301019501935f915b848310612e6b5750505050505090565b9091929394958480612e89600193601f198682030187528a5161211b565b9801930193019194939290612e5b565b91906020928381526001600160a01b0382511684820152838201516040820152612ed3604083015160e06060840152610100830190611939565b9060608301516080820152612efa608084015192601f1993848483030160a0850152612e3d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f3d57505050611ab094955060c060e0910151928285030191015261211b565b825187529588019591880191600101612f19565b90604082019082526020606081936040838201528551809452019301915f5b828110612f7e575050505090565b835185529381019392810192600101612f70565b916040805191612fa18361195d565b60048084526020612fb3818601612256565b5f5b8751811015612fe85780612fcb6001928a612034565b51612fd68289612034565b52612fe18188612034565b5001612fb5565b5092955092939093335f52308352855f2091865190613006826119a9565b61300e611f20565b825260608581930152875161302281611a11565b5f815288519161303183611a11565b5f83525f3681375f5b81518110156131975761304d8183612034565b5190888c8b84519189818401518d8d8251613075575b5050505050505050600191500161303a565b5f6130e497948197948c97946130a28c956001600160a01b039d8e81818d51169c0151169b0151906142f5565b948651996130af8b6119f5565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612e99565b03915afa93841561318d578b915f9561316f575b50845161310d575b50908b8e89838d8d613063565b51015116803b156101825761313c925f918c8f84905180978195829463012c676d60e21b845233908401612f51565b03925af191821561316557600192613156575b8981613100565b61315f906119e1565b5f61314f565b8c513d5f823e3d90fd5b6131849195503d805f833e6129e78183611a2d565b9050935f6130f8565b8e513d5f823e3d90fd5b5050505050505050509050565b82156131d9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506131e582614527565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156132fb575f97613305575b508361323c6132358361326c9a615206565b5090614991565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156132fb575f976132ca575b5061323561329091611ab098615206565b5061329b8183613bb3565b156132c25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ca8565b9050936132a3565b96508387813d83116132f4575b6132e18183611a2d565b810103126101825795519561323561327f565b503d6132d7565b85513d5f823e3d90fd5b96508387813d831161332d575b61331c8183611a2d565b810103126101825795519583613223565b503d613312565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561338e575b836040521561337857505050565b635274afe760e01b835216600482015260249150fd5b60018115166133a457813b15153d15161661336a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156133fd575b836040525f6060521561337857505050565b60018115166133a457813b15153d1516166133eb565b9392919361342083613b90565b612d3c578461343457612cb2939450612beb565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613c7e565b9092919261347e81614216565b9361348881613b90565b6134c85784816001600160e01b036134a79360e01d9116601b0b615051565b508092816134b6575050509190565b6001600160a01b03612c4e9316613334565b604051632d1671a360e11b8152600490fd5b916135059060606134fa936001600160a01b039485916040880151612034565b515116940151612034565b51511614612a9657565b6040519061351c826119f5565b606060c083613529611f3f565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b9594919390869361355b61350f565b505f92604061368081519261356f8461195d565b60048452602093613581858201612256565b61364961358d8b612b3c565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135c486611fe7565b526135ce85611fe7565b5087516135da8161198d565b6002815288368b8301376135ed86611ff4565b526135f785611ff4565b5060ff896125628a85019361363387613615816124e6858a51612034565b97511688613624848951612034565b51511685612529858a51612034565b9661363f828751612034565b5151169451612034565b61365282612004565b5261365c81612004565b50612634878b8d60ff896125628c85019361363387613615816124e6858a51612034565b946137005f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136b883611a11565b8683528951956136c7876119f5565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936137da575b506137cd575050505f975b6002855110988915996137ba5782848701519601519061373c61272489612024565b51906137488284613bb3565b1590506137b25750925b6137748685919060405192600284526020840152604083015260608201604052565b61377d88612004565b5261378787612004565b5082519b6137948d6119f5565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613752565b5050505050505050509150611ab061350f565b919998509450939661371a565b9092506137f191503d805f833e6129e78183611a2d565b915f61370f565b9495939592919261380761350f565b506040968751906138178261195d565b60048252602093613829858401612256565b61383289612b3c565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261386484611fe7565b5261386e83611fe7565b50895161387a8161198d565b600281528a368783013761388d84611ff4565b5261389783611ff4565b508989019086818351906138aa91612034565b5151166138b690614527565b86888c511689848651906138c991612034565b51511682858751906138da91612034565b510151906138e7926131a4565b9289818651906138f691612034565b51511694519061390591612034565b5101519060ff1661393d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61394683612004565b5261395082612004565b5060608801858782519061396391612034565b51511661396f90614527565b868a5116878984519061398191612034565b515116878a85519061399291612034565b5101519061399f926131a4565b90868989818651906139b091612034565b5151169451906139bf91612034565b5101519060ff166139f7929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a0083612014565b52613a0a82612014565b50613a14916142f5565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a4583611a11565b5f83528c5196613a54886119f5565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613a939060048301612e99565b03815a935f94fa91825f915f94613b72575b50613ab45788513d5f823e3d90fd5b97949596979194825196600288109788613b5b57508183850151940151613add61272487612024565b51613ae88183613bb3565b15613b535750925b613b128585919060405192600284526020840152604083015260608201604052565b613b1b87612004565b52613b2586612004565b5082519a613b328c6119f5565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613af0565b602490835190630fbb8e5560e21b82526004820152fd5b909350613b8991503d805f833e6129e78183611a2d565b925f613aa5565b613baf905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1390565b90613baf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b613c016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614748565b90637ffffff58213613c51575b90613c1891614991565b9290921580613c49575b613c2b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c22565b613c5b8282615631565b15613c0e57604483856040519163d556b11160e01b835260048301526024820152fd5b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614b97565b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d5b565b613d2c916080810182613cee613ce88351612024565b51612024565b52613d25613d1f6001600160a01b03809451511693613d16613d108551612024565b51611fe7565b51169251612024565b51612004565b5191613413565b5050565b90608081019180613d44613ce88551612014565b526001600160a01b03809251511691613d60613d108551612014565b5116613d6f613d1f8551612014565b519081613e0a57613d7f83613b90565b612d3c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a41955f5260209060018252613dd5604094855f20835f528452855f20855f528452855f2054613ca8565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e3d565b91613e3b917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a4195612c91565b5050613def565b60c0810151908151915f92613fb6575b50613ef76020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613e9f83611a11565b8683528c5193613eae85611a11565b8785528d5196613ebd886119f5565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612e99565b03915afa948515613fac578795613f8e575b508451613f1a575b50505050505050565b81905101510151169051813b15613f8a57918491849383613f4f965180978195829463012c676d60e21b845260048401612f51565b03925af1908115613f815750613f6a575b8080808080613f11565b613f7482916119e1565b613f7e5780613f60565b80fd5b513d84823e3d90fd5b8480fd5b613fa39195503d8089833e6129e78183611a2d565b9050935f613f09565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613ff9925f928360405180968195829463012c676d60e21b845260048401612f51565b03925af1801561022c5715613e52576140139192506119e1565b5f905f613e52565b6080810161402c613d1f8251612014565b5191821561403957505050565b614053613d106001600160a01b0380935151169351612014565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661408e575b505050505050565b6140b2955f9284845260018152828420868552815282842091845252812055613471565b5f808080614086565b81156140c5570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614121576020810151908051603f198101908111612c6b5760051c821161410d5760016020920160051b010190565b505060405161411b81611a11565b5f815290565b5060405161411b81611a11565b80511561413e57602001515f1a90565b505f90565b905f8091602081519101845af480806141c1575b156141775750506040513d81523d5f602083013e60203d82010160405290565b1561419e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141af576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806141575750813b1515614157565b600411156141de57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614212836141d4565b0152565b61421e61571f565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af19283156142ec575f925f946142b7575b50614274836141d4565b6001831415806142a5575b6142895750505090565b5163ee07877f60e01b81529182916107259190600484016141f2565b506142af836141d4565b82151561427f565b908094506142db9293503d85116142e5575b6142d38183611a2d565b810190615027565b919091925f61426a565b503d6142c9565b513d5f823e3d90fd5b9080519161430283611b11565b9161431d60409461431586519586611a2d565b808552611b11565b601f19946020918601368684013783518351909590801561451c5760016143739101965b600197889101019761436a6143558a611b11565b9961436286519b8c611a2d565b808b52611b11565b01848901612272565b85805f96845160028152338782015230868201526060810186526143968b611fe7565b526143a08a611fe7565b505f925b6144d8575b50505083516143bc575b50505050505090565b858095989796929801816143d08289612034565b526143db8188612034565b505f925b6143ee575b50859697506143b3565b84518310156144d3576001600160a01b036144658161440d8689612034565b5151168661441b878a612034565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c61445c888b612034565b5101519161517d565b156144bb57868098999a92819261447c878a612034565b5151166144898787612034565b520193856144978289612034565b5101516144a4868c612034565b526144af858b612034565b500192909897966143df565b8951630a57f30960e31b815260048101859052602490fd5b6143e4565b90919681518810156145135782809101976144f38184612034565b516144fe8a8d612034565b52614509898c612034565b50019190816143a4565b968291506143a9565b506143735f96614341565b61452f61571f565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa9283156142ec575f925f946142b75750614274836141d4565b9091939284158215175f1461459d5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146d4575b50506145c0816152f6565b936145ca816152f6565b946145d58682615316565b909182156146c5575f9083986f0785ee10d5da46d900f436a0000000008086116146b7575b50670de0b6b3a7640000808b116146a8575b50633b9aca00808b11614699575b50612710808b1161468b575b5098805b61467a57508190611935989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615329565b60019290920191600a90048061462a565b60049a04998a930192614626565b600991939a049901915f61461a565b601291939a049901915f61460c565b85049950602592505f6145fa565b50929050611935949550615329565b5f8212156147285780841361471a575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145b557909250611935939491615234565b90925061193593949161529b565b808412156146e457909250611935939491615234565b613c188282614991565b9290918061476e576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461478357505050505f905f90565b61479c93614790916153e3565b929194909384926153e3565b90939192846147aa886152f6565b916147b4866152f6565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061495b575b030191600160ff1b98838a018112155f14614928575050035b5f955f82128061491f575b614901575b5f8112806148ef575b6148d15786820103966001600160ff1b03881490816148c7575b50806148be575b806148b5575b61489757509061484b929161558f565b915f811361485e575b5061193593615329565b9091604c821361488c5761487591600a0a906140bb565b908115614882575f614854565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261483b565b50828414614835565b905088145f61482e565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614814565b95508087018613156149195786818703015b9561480b565b5f614913565b505f8113614806565b89985090920390506001600160ff1b038190038701821361494c57018601946147fb565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506147e2565b81156140c5570590565b8082601b82810b8314614b86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b32575b8380820b03614b2157507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614ad2575b838060030b03614a56575b808413614a3a5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140c5576001600160e01b0391071592614a31565b92915f841315614aa6575090614a6c8383615631565b614a8857637ffffffe1901600a0a810290637fffffff92614a1c565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361488c57614ac591600a0a90614987565b9182156148825792614a1c565b5f198401808060030b14614ae65750614a11565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149c4565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b73576305f5e100600894058094819201955b9150506149c4565b620186a060059405809481920195614b6b565b5082614a1157505050505f90600190565b919291600160ff1b8401614baf57611935935061564a565b90611935935f0391614d5b565b919291600160ff1b9190801580614d49575090614bd8916153e3565b9490929091905f868585858282138015614d40575b614d23575b505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614cee575b505081019182821860ff1c1115614ce657826001600160ff1b0314614cc857905f600192135f14614c9957600a9004915b01925b81158117614c5d57509190565b80614c76575b508015614c6e579190565b505f91508190565b9192614c8c9203600160ff1b01600a0a90614987565b600160ff1b91905f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c4d565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c50565b8107614cfb575b80614c1c565b60ff1d600117015f614cf5565b505050919350614d16579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614bf2565b50835f12614bed565b15614d545750509190565b9350919050565b9392919384158115818117614eac57505090614d76916153e3565b9194908295614d87829582946153e3565b8096929491969387868482138015614ea3575b614e8a575b5050505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614e70575b505081019182821860ff1c1115614e6857826001600160ff1b0314614cc857905f600192135f14614e3957600a9004915b01925b81158117614e0c57509190565b80614e1c57508015614c6e579190565b600160ff1b93614e339291038401600a0a90614987565b5f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614dfc565b509092614dff565b8107614e7d575b80614dcb565b60ff1d600117015f614e77565b929b5098509196509450925090505f8080808080614d9f565b50858412614d9a565b9395939092919015614ec2575050614c6e579190565b945092915050565b600881511061413e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f28610c72606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614583565b94519301614f37815186612bc4565b614f3f575050565b909350611ab091925051925183613bda565b92915f9060018184145f87128715171717614fcb575f92808213614fbd575b03604c81135f821217614fb157600a0a9084614f8f8382029384614987565b14614fa457505015614fa0575f9190565b5f90565b9093509015611ab0579190565b505015614fa0575f9190565b5f9560019450925090614f70565b5050505f90565b93929190918083145f83125f87121883158715171717615021575f928082136150145703604c81135f821217614fb157600a0a9084614f8f8382029384614987565b9194600193509190614f70565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615079576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361508b57505090505f90600190565b60ff8116820191808312615153575f8312156150c3575050604c198112614c6e575f03600a0a916150bc83826140bb565b9283021490565b909293915f81135f1461514957604d811361511e57600a0a9283156140c557835f190483116150f55750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151b85761518f9192615788565b50615199816141d4565b1591826151a557505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461522c57600a6001818404940192061590565b909190600190565b909392915f615244918184614583565b9490945f8483019182019412159081615291575b8115615287575b5061526957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f61525f565b8281129150615258565b6152b093600160fe1b90810193920190614583565b9081815f8212156152e7575050604b198212612cb2576152d5915f03600a0a90614987565b90816152df575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611ab057600160ff1b9080820361530f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153be576001600160ff1b0392838311156153a857600160ff1b9383850361535e57505050509190565b90919293508514615378575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c6b575f039190565b90916001600160ff1b0380841115612c33578514615378575050600a60019104920190565b919091801561558557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615493575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615484575b831361546e5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615462565b6f4b3b4ca85a86c47a098a22400000000080840515615573575b507728c87cb5c89a2571ebfdcb54864ada834a0000000000000083051561555c575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615548575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561553857820515615529575b5f615417565b9290600a02905f190192615523565b93916064029160011901936154f4565b93916402540be400029160091901936154f4565b9391678ac7230489e80000029160121901936154cf565b6025198301955092909202915f6154ad565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561560d5714615605579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611ab091905f811215615645575f036157c2565b6157c2565b909291600160ff1b918281016156dc57508084146156d2578084139182156156ca578185035b604c8111156156b95750505f915b156156aa57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140c557049161567e565b848203615670565b505090505f905f90565b936156e992945f03614bbc565b809391809281146156fd575b50505f039190565b915092506001600160ff1b038314614cc857600a600191059201915f806156f5565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561575d575b6157455750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561573e565b81519190604183036157b8576157b19250602082015190606060408401519301515f1a90615851565b9192909190565b50505f9160029190565b90637ffffff581131561584b57637ffffffe1981019060438213615844575f82121561581857637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140c5577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158c8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158be57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056"; + hex"6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611829575080631f69cb75146115cc5780632cb77e9f146115a05780632fbc4ba01461145657806341d1514f1461141f5780635cffe9de146112c3578063607461191461113f578063613255ab146110bc57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611bbe565b6024358281116101825761010c903690600401611bbe565b60c0366043190112610182576101043583811161018257610131903690600401611d64565b90610124359384116101825761014e61015c943690600401611d64565b92610157612afa565b61228e565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a76118ad565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611a2d565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161187c565b9190610278612afa565b6040519261028584611a11565b5f84523691611e38565b90612f92565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161187c565b9190604051926102d684611a11565b5f84528284016102e582611b11565b946102f36040519687611a2d565b8286526102ff83611b11565b9361031186880195601f190186612272565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a82030186528851611939565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b87018761214e565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611a2d565b30614143565b6103ce828a612034565b526103d98189612034565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612196565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161187c565b9061048d612afa565b6104be6104b96104b46104ad6104a38880612181565b604081019061214e565b3691611a4f565b6140d9565b61412e565b801561075f576001101561074d57602483016104da8186611fa1565b90501561073b5760448401946104f08682611fa1565b9050156107295761055661051e9661054a61051561050e8580612181565b9585611fa1565b99909285611fa1565b91909261053b604051976105318961195d565b3389523690611ab3565b9a60209b8c8901523691611b29565b60408601523691611b29565b60608301526064850135608083015261056e82612b3c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861209c565b0390a10191610615838561214e565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611e38565b82808080808080610584565b6106866104ad848661214e565b61068f81614eca565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b51169361214e565b866040519586958652850152606060408501526060840191611d93565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b845260048401526024830190611939565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa612afa565b5f80806107bf60048035608481019101611eea565b9050156110aa5760246004350135926107d784612ba1565b15611098576060806040516107eb816119c5565b6107f3611f3f565b81525f60208201525f6040820152015261080b611f3f565b5061086b61086661084561083b61083561082f608460043501600435600401611eea565b90611f71565b80611f8c565b6040810190611fa1565b602061085e61082f608460043501600435600401611eea565b013591611fd7565b611d7f565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611eea565b6060810190611fa1565b604061085e61082f608460043501600435600401611eea565b81604051976108c88961198d565b16875216602086015260408501526108ea608460043501600435600401611eea565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611eea565b9050811080611085575b15610ed25761093a608460043501600435600401611eea565b821015610ebe578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f836119c5565b8181013567ffffffffffffffff81116101825761099190369084840101611bbe565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d64565b606082015280516001600160a01b036109ec6040830151602085015190612034565b5151166001600160a01b0385511614801590610e8a575b610e7857610a1b6020830151604084015190836134da565b610a2481612b3c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae84611a11565b5f845233918661354c565b5f9491610b2257505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610b1a575b5092610a82565b905088610b13565b610b3760608201516044600435013590612bc4565b15610b9157505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610b0c565b610b9e6040820151612ba1565b158015610e65575b15610bfc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b89565b9250925050600196959691610c15606460043501612048565b15610dd25796610c8597610c9560408401516040880151610c368183613bb3565b15610dca5750925b610c8f848592610c78610c7260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b614583565b9061473e565b9d8e9260408d0151613c7e565b60408c0152613ca8565b99613ca8565b98610ca08484613cd2565b610caa8482613d30565b60405192338452608060208501526060610cd0845160808088015261010087019061209c565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d6c57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d6796604084015260608301520390a180858c5101808d5260051b8c0152613e42565b610b0c565b9091929396602080610dbd600193601f198782030189528b51906001600160a01b0382511681526040610dac85840151606087850152606084019061211b565b920151906040818403910152611939565b9901950193929101610d0d565b905092610c3e565b610c8590610c956060840151610c8f610e10610c7260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b614583565b60408a0151610e1f8183613bb3565b15610e5d5750915b829c8d916060890151908116155f14610e4e575060408801515b96879460408d0151613c7e565b610e589085613bda565b610e41565b905091610e27565b50610e736060820151613b90565b610ba6565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610ea66060830151604085015190612034565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610ee4606460043501612048565b1561107f57835b6004356004013590610efd8282613bb3565b6110615750508490610f1d856001600160a01b0360208701511633613471565b505060a46004350190610f358260043560040161214e565b905015159081611059575b50610fb8575b506001600160a01b03610f5c9293511633612beb565b50505b8351811015610f845780610f7e610f7860019387612034565b5161401b565b01610f5f565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610fe26001600160a01b038551169260043560040161214e565b929091333b156101825761102a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d93565b038183335af190811561022c57859115610f4657905061104a91506119e1565b5f836001600160a01b03610f46565b905088610f40565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610eeb565b506110936040830151612ba1565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b036110e16118ad565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611112575b50604051908152f35b90508181813d8311611138575b6111298183611a2d565b81010312610182575182611109565b503d61111f565b346101825761114d366118ed565b929161115a949194612afa565b611165838333612b6d565b61116e81612ba1565b15611292578160ff91611186856112499695336131a4565b6111908183613bb3565b1561128c575080935b6111a585828533613413565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06111d4898833613471565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112755760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112849261028f913691611e38565b80808061015c565b93611199565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112f26118c3565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761137f956020921693611341868587613334565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d93565b03815f855af193841561022c575f946113eb575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113d2576113c7935030916133ad565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611417575b8161140760209383611a2d565b8101031261018257519284611393565b3d91506113fa565b3461018257606036600319011261018257602061144e61143d6118ad565b6114456118c3565b604435916131a4565b604051908152f35b3461018257611464366118ed565b92809492611470612afa565b61147b828533612b6d565b61148481612ba1565b1561157057806114986114e7928633612beb565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612c91565b939091856115155760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115649661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a082360391820112610182576024358481116101825761161c90369060040161187c565b9093611626612afa565b5f946001600160a01b03948561163b84611d7f565b1633036118075761165461164f3685611bbe565b612b3c565b805f525f60205260405f2096600188541461169b575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816116c7876118d9565b166060890152602484013590606219018112156101825783019060a06080890152806116f5600484016118d9565b16610100890152611708602483016118d9565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117d061028f9a60209f61178f906117fa9f9a606061014061064e9d0152610160880191611d93565b6117c16117b66117a26044880185611db3565b605f198a8603810160a08c01529491611de8565b926064870190611db3565b918784030160c0880152611de8565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061166a565b60248661181385611d7f565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561186b575b5015158152f35b6301ffc9a760e01b14905083611864565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576119359160040161187c565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761197957604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761197957604052565b6040810190811067ffffffffffffffff82111761197957604052565b6080810190811067ffffffffffffffff82111761197957604052565b67ffffffffffffffff811161197957604052565b60e0810190811067ffffffffffffffff82111761197957604052565b6020810190811067ffffffffffffffff82111761197957604052565b90601f8019910116810190811067ffffffffffffffff82111761197957604052565b92919267ffffffffffffffff82116119795760405191611a79601f8201601f191660200184611a2d565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611ab093359101611a4f565b90565b91906060838203126101825760405190611acc8261198d565b8193611ad7816118d9565b8352611ae5602082016118d9565b602084015260408101359167ffffffffffffffff831161018257604092611b0c9201611a95565b910152565b67ffffffffffffffff81116119795760051b60200190565b929192611b3582611b11565b604092611b456040519283611a2d565b819581835260208093019160061b84019381851161018257915b848310611b6e57505050505050565b8583830312610182578386918251611b85816119a9565b611b8e866118d9565b81528286013583820152815201920191611b5f565b9080601f8301121561018257816020611ab093359101611b29565b91909160a0818403126101825760405190611bd88261195d565b8193611be3826118d9565b835267ffffffffffffffff9160208101358381116101825782611c07918301611ab3565b602085015260408101358381116101825782611c24918301611ba3565b6040850152606081013592831161018257611c456080939284938301611ba3565b60608501520135910152565b909291611c5d84611b11565b916040611c6d6040519485611a2d565b839580855260208095019160059160051b8401948086116101825784935b868510611c9c575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611cc78161198d565b611cd0836118d9565b81528a83013584811161018257830185601f8201121561018257803590611cf682611b11565b91611d0389519384611a2d565b8083528d808401918b1b83010191888311610182578e809101915b838310611d5457509150508201528583013593841161018257611d45858c95869501611a95565b86820152815201940193611c8b565b82358152918101918f9101611d1e565b9080601f8301121561018257816020611ab093359101611c51565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611e05575050505090565b909192936001906001600160a01b03611e1d876118d9565b16815285830135838201526040908101950193920190611df7565b90929192611e4581611b11565b91604091611e566040519485611a2d565b839581855260208095019160051b8301938185116101825783925b858410611e815750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611eab816119a9565b82358481116101825786611ec0918501611ab3565b81528983013593841161018257611edb868b95869501611d64565b83820152815201930192611e71565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611f2d8261198d565b60606040835f81525f60208201520152565b60405190611f4c8261195d565b5f608083828152611f5b611f20565b6020820152606060408201526060808201520152565b9015610ebe57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610ebe5760061b0190565b805115610ebe5760200190565b805160011015610ebe5760400190565b805160021015610ebe5760600190565b805160031015610ebe5760800190565b805160041015610ebe5760a00190565b8051821015610ebe5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612074575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612066565b906080806121126121006120ee60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611939565b60408701518682036040880152612055565b60608601518582036060870152612055565b93015191015290565b9081518082526020808093019301915f5b82811061213a575050505090565b83518552938101939281019260010161212c565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121ad61164f6121a68380611f8c565b3690611bbe565b5f525f602052600160405f20540361224d57806121cd8161223993611f8c565b6122316121ec6121f16020850135938460408701359384923690611bbe565b6134da565b6122096121fe8580611f8c565b946060810190611eea565b92906122296040519661221b88611a11565b5f88525f3681373690611bbe565b933691611c51565b9233926137f8565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60808110612264575050565b606082820152602001612258565b5f5b82811061228057505050565b606082820152602001612274565b926001600160a01b038451166001600160a01b0383511614612ae8576001600160a01b036122c3606086015160643590612034565b5151166001600160a01b036122df604085015160843590612034565b51511614801590612aa8575b610e78576001600160a01b03612308604086015160443590612034565b5151166001600160a01b036123236064356060880151612034565b51511614612a965761233484612b3c565b805f525f60205260405f205415612a46575061234f82612b3c565b805f525f60205260405f2054156129f6575061240e907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e39604051806123b26123a461012033845280602085015283018a61209c565b82810360408401528761209c565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0383511690604051916123ff83611a11565b5f8352606435604435886137f8565b905061264d6001600160a01b03855116936040519461242c86611a11565b5f865261243761350f565b50604051906124458261195d565b6004825261245560208301612256565b61245e86612b3c565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261249182611fe7565b5261249b81611fe7565b506040516124a88161198d565b6002815260403660208301376124bd82611ff4565b526124c781611ff4565b506125976124ee6001600160a01b036124e660843560408a0151612034565b515116614527565b6125326001600160a01b038851166001600160a01b0361251460843560408c0151612034565b515116602061252960843560408d0151612034565b510151916131a4565b906001600160a01b0361254b60843560408b0151612034565b51511660ff602061256260843560408d0151612034565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6125a082612004565b526125aa81612004565b506126346125c96001600160a01b036124e660a43560608a0151612034565b6126046001600160a01b038851166001600160a01b036125ef60a43560608c0151612034565b515116602061252960a43560608d0151612034565b906001600160a01b0361261d60a43560608b0151612034565b51511660ff602061256260a43560608d0151612034565b61263d82612014565b5261264781612014565b506142f5565b926126e35f6001600160a01b038551169260208601908151906001600160a01b036020818451169301511692868552306020526040808620915101516040519161269683611a11565b868352604051956126a6876119f5565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936129d0575b50612702576040513d5f823e3d90fd5b908151600281106129b857506040602083015192015161272a61272488612024565b51612014565b516127358183613bb3565b156129b05750925b61275f8385919060405192600284526020840152604083015260608201604052565b61276888612004565b5261277287612004565b5060405196612780886119f5565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526127b56040840151612ba1565b1591821561299c575b508115612987575b8115612976575b5061296457604051916127df836119c5565b5f83525f60208401525f60408401525f60608401526127fe8483614eee565b845260408401526128246128128386614eee565b60208601528060608601528451613c7e565b946128386020850151604086015190613c7e565b9361284287613b90565b8015612955575b6129435761290a61293c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128ec6129419a60a09661288b8a8851613cd2565b6128998c6020890151613cd2565b6128a78a6040890151613d30565b6128b58c6060890151613d30565b6128be8a61401b565b6128c78c61401b565b6001600160a01b036128e360c435926060606435910151612034565b51511633612c91565b50506001600160a01b036128e360e43592606060a435910151612034565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e42565b613e42565b565b604051630d86822160e01b8152600490fd5b5061295f85613b90565b612849565b6040516321badf1f60e01b8152600490fd5b612981915051613b90565b5f6127cd565b90506129966060830151613b90565b906127c6565b6129a891925051612ba1565b15905f6127be565b90509261273d565b60249060405190630fbb8e5560e21b82526004820152fd5b9092506129ef91503d805f833e6129e78183611a2d565b810190612d55565b915f6126f2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612a41565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612ac2606084015160a43590612034565b5151166001600160a01b03612ade604087015160443590612034565b51511614156122eb565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b2a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b6781612b59602082019460208652604083019061209c565b03601f198101835282611a2d565b51902090565b909115612b78575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612bc0905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1290565b90612bc0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b929192612bf782614216565b93612c0181613b90565b612c7f5784816001600160e01b03612c209360e01d9116601b0b615051565b9290809315612c56575b50829081612c3a575b5050509190565b612c4e926001600160a01b033092166133ad565b5f8181612c33565b9092505f198114612c6b57600101915f612c2a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612c9e83613b90565b612d3c5784612cba57612cb2939450613471565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613ca8565b95612d0187613b90565b612d24575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612d9082611b11565b91612d9e6040519384611a2d565b808352848084019160051b830101918683116101825785809101915b838310612e2d5750505050948281015191821161018257019180601f84011215610182578251612de981611b11565b93612df76040519586611a2d565b818552838086019260051b820101928311610182578301905b828210612e1e575050505090565b81518152908301908301612e10565b8251815291810191869101612dba565b90808251908181526020809101926020808460051b8301019501935f915b848310612e6b5750505050505090565b9091929394958480612e89600193601f198682030187528a5161211b565b9801930193019194939290612e5b565b91906020928381526001600160a01b0382511684820152838201516040820152612ed3604083015160e06060840152610100830190611939565b9060608301516080820152612efa608084015192601f1993848483030160a0850152612e3d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f3d57505050611ab094955060c060e0910151928285030191015261211b565b825187529588019591880191600101612f19565b90604082019082526020606081936040838201528551809452019301915f5b828110612f7e575050505090565b835185529381019392810192600101612f70565b916040805191612fa18361195d565b60048084526020612fb3818601612256565b5f5b8751811015612fe85780612fcb6001928a612034565b51612fd68289612034565b52612fe18188612034565b5001612fb5565b5092955092939093335f52308352855f2091865190613006826119a9565b61300e611f20565b825260608581930152875161302281611a11565b5f815288519161303183611a11565b5f83525f3681375f5b81518110156131975761304d8183612034565b5190888c8b84519189818401518d8d8251613075575b5050505050505050600191500161303a565b5f6130e497948197948c97946130a28c956001600160a01b039d8e81818d51169c0151169b0151906142f5565b948651996130af8b6119f5565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612e99565b03915afa93841561318d578b915f9561316f575b50845161310d575b50908b8e89838d8d613063565b51015116803b156101825761313c925f918c8f84905180978195829463012c676d60e21b845233908401612f51565b03925af191821561316557600192613156575b8981613100565b61315f906119e1565b5f61314f565b8c513d5f823e3d90fd5b6131849195503d805f833e6129e78183611a2d565b9050935f6130f8565b8e513d5f823e3d90fd5b5050505050505050509050565b82156131d9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506131e582614527565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156132fb575f97613305575b508361323c6132358361326c9a615206565b5090614991565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156132fb575f976132ca575b5061323561329091611ab098615206565b5061329b8183613bb3565b156132c25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ca8565b9050936132a3565b96508387813d83116132f4575b6132e18183611a2d565b810103126101825795519561323561327f565b503d6132d7565b85513d5f823e3d90fd5b96508387813d831161332d575b61331c8183611a2d565b810103126101825795519583613223565b503d613312565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561338e575b836040521561337857505050565b635274afe760e01b835216600482015260249150fd5b60018115166133a457813b15153d15161661336a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156133fd575b836040525f6060521561337857505050565b60018115166133a457813b15153d1516166133eb565b9392919361342083613b90565b612d3c578461343457612cb2939450612beb565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613c7e565b9092919261347e81614216565b9361348881613b90565b6134c85784816001600160e01b036134a79360e01d9116601b0b615051565b508092816134b6575050509190565b6001600160a01b03612c4e9316613334565b604051632d1671a360e11b8152600490fd5b916135059060606134fa936001600160a01b039485916040880151612034565b515116940151612034565b51511614612a9657565b6040519061351c826119f5565b606060c083613529611f3f565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b9594919390869361355b61350f565b505f92604061368081519261356f8461195d565b60048452602093613581858201612256565b61364961358d8b612b3c565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135c486611fe7565b526135ce85611fe7565b5087516135da8161198d565b6002815288368b8301376135ed86611ff4565b526135f785611ff4565b5060ff896125628a85019361363387613615816124e6858a51612034565b97511688613624848951612034565b51511685612529858a51612034565b9661363f828751612034565b5151169451612034565b61365282612004565b5261365c81612004565b50612634878b8d60ff896125628c85019361363387613615816124e6858a51612034565b946137005f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136b883611a11565b8683528951956136c7876119f5565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936137da575b506137cd575050505f975b6002855110988915996137ba5782848701519601519061373c61272489612024565b51906137488284613bb3565b1590506137b25750925b6137748685919060405192600284526020840152604083015260608201604052565b61377d88612004565b5261378787612004565b5082519b6137948d6119f5565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613752565b5050505050505050509150611ab061350f565b919998509450939661371a565b9092506137f191503d805f833e6129e78183611a2d565b915f61370f565b9495939592919261380761350f565b506040968751906138178261195d565b60048252602093613829858401612256565b61383289612b3c565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261386484611fe7565b5261386e83611fe7565b50895161387a8161198d565b600281528a368783013761388d84611ff4565b5261389783611ff4565b508989019086818351906138aa91612034565b5151166138b690614527565b86888c511689848651906138c991612034565b51511682858751906138da91612034565b510151906138e7926131a4565b9289818651906138f691612034565b51511694519061390591612034565b5101519060ff1661393d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61394683612004565b5261395082612004565b5060608801858782519061396391612034565b51511661396f90614527565b868a5116878984519061398191612034565b515116878a85519061399291612034565b5101519061399f926131a4565b90868989818651906139b091612034565b5151169451906139bf91612034565b5101519060ff166139f7929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a0083612014565b52613a0a82612014565b50613a14916142f5565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a4583611a11565b5f83528c5196613a54886119f5565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613a939060048301612e99565b03815a935f94fa91825f915f94613b72575b50613ab45788513d5f823e3d90fd5b97949596979194825196600288109788613b5b57508183850151940151613add61272487612024565b51613ae88183613bb3565b15613b535750925b613b128585919060405192600284526020840152604083015260608201604052565b613b1b87612004565b52613b2586612004565b5082519a613b328c6119f5565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613af0565b602490835190630fbb8e5560e21b82526004820152fd5b909350613b8991503d805f833e6129e78183611a2d565b925f613aa5565b613baf905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1390565b90613baf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b613c016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614748565b90637ffffff58213613c51575b90613c1891614991565b9290921580613c49575b613c2b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c22565b613c5b8282615631565b15613c0e57604483856040519163d556b11160e01b835260048301526024820152fd5b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614b97565b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d5b565b613d2c916080810182613cee613ce88351612024565b51612024565b52613d25613d1f6001600160a01b03809451511693613d16613d108551612024565b51611fe7565b51169251612024565b51612004565b5191613413565b5050565b90608081019180613d44613ce88551612014565b526001600160a01b03809251511691613d60613d108551612014565b5116613d6f613d1f8551612014565b519081613e0a57613d7f83613b90565b612d3c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a41955f5260209060018252613dd5604094855f20835f528452855f20855f528452855f2054613ca8565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e3d565b91613e3b917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a4195612c91565b5050613def565b60c0810151908151915f92613fb6575b50613ef76020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613e9f83611a11565b8683528c5193613eae85611a11565b8785528d5196613ebd886119f5565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612e99565b03915afa948515613fac578795613f8e575b508451613f1a575b50505050505050565b81905101510151169051813b15613f8a57918491849383613f4f965180978195829463012c676d60e21b845260048401612f51565b03925af1908115613f815750613f6a575b8080808080613f11565b613f7482916119e1565b613f7e5780613f60565b80fd5b513d84823e3d90fd5b8480fd5b613fa39195503d8089833e6129e78183611a2d565b9050935f613f09565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613ff9925f928360405180968195829463012c676d60e21b845260048401612f51565b03925af1801561022c5715613e52576140139192506119e1565b5f905f613e52565b6080810161402c613d1f8251612014565b5191821561403957505050565b614053613d106001600160a01b0380935151169351612014565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661408e575b505050505050565b6140b2955f9284845260018152828420868552815282842091845252812055613471565b5f808080614086565b81156140c5570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614121576020810151908051603f198101908111612c6b5760051c821161410d5760016020920160051b010190565b505060405161411b81611a11565b5f815290565b5060405161411b81611a11565b80511561413e57602001515f1a90565b505f90565b905f8091602081519101845af480806141c1575b156141775750506040513d81523d5f602083013e60203d82010160405290565b1561419e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141af576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806141575750813b1515614157565b600411156141de57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614212836141d4565b0152565b61421e61571f565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af19283156142ec575f925f946142b7575b50614274836141d4565b6001831415806142a5575b6142895750505090565b5163ee07877f60e01b81529182916107259190600484016141f2565b506142af836141d4565b82151561427f565b908094506142db9293503d85116142e5575b6142d38183611a2d565b810190615027565b919091925f61426a565b503d6142c9565b513d5f823e3d90fd5b9080519161430283611b11565b9161431d60409461431586519586611a2d565b808552611b11565b601f19946020918601368684013783518351909590801561451c5760016143739101965b600197889101019761436a6143558a611b11565b9961436286519b8c611a2d565b808b52611b11565b01848901612272565b85805f96845160028152338782015230868201526060810186526143968b611fe7565b526143a08a611fe7565b505f925b6144d8575b50505083516143bc575b50505050505090565b858095989796929801816143d08289612034565b526143db8188612034565b505f925b6143ee575b50859697506143b3565b84518310156144d3576001600160a01b036144658161440d8689612034565b5151168661441b878a612034565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c61445c888b612034565b5101519161517d565b156144bb57868098999a92819261447c878a612034565b5151166144898787612034565b520193856144978289612034565b5101516144a4868c612034565b526144af858b612034565b500192909897966143df565b8951630a57f30960e31b815260048101859052602490fd5b6143e4565b90919681518810156145135782809101976144f38184612034565b516144fe8a8d612034565b52614509898c612034565b50019190816143a4565b968291506143a9565b506143735f96614341565b61452f61571f565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa9283156142ec575f925f946142b75750614274836141d4565b9091939284158215175f1461459d5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146d4575b50506145c0816152f6565b936145ca816152f6565b946145d58682615316565b909182156146c5575f9083986f0785ee10d5da46d900f436a0000000008086116146b7575b50670de0b6b3a7640000808b116146a8575b50633b9aca00808b11614699575b50612710808b1161468b575b5098805b61467a57508190611935989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615329565b60019290920191600a90048061462a565b60049a04998a930192614626565b600991939a049901915f61461a565b601291939a049901915f61460c565b85049950602592505f6145fa565b50929050611935949550615329565b5f8212156147285780841361471a575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145b557909250611935939491615234565b90925061193593949161529b565b808412156146e457909250611935939491615234565b613c188282614991565b9290918061476e576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461478357505050505f905f90565b61479c93614790916153e3565b929194909384926153e3565b90939192846147aa886152f6565b916147b4866152f6565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061495b575b030191600160ff1b98838a018112155f14614928575050035b5f955f82128061491f575b614901575b5f8112806148ef575b6148d15786820103966001600160ff1b03881490816148c7575b50806148be575b806148b5575b61489757509061484b929161558f565b915f811361485e575b5061193593615329565b9091604c821361488c5761487591600a0a906140bb565b908115614882575f614854565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261483b565b50828414614835565b905088145f61482e565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614814565b95508087018613156149195786818703015b9561480b565b5f614913565b505f8113614806565b89985090920390506001600160ff1b038190038701821361494c57018601946147fb565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506147e2565b81156140c5570590565b8082601b82810b8314614b86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b32575b8380820b03614b2157507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614ad2575b838060030b03614a56575b808413614a3a5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140c5576001600160e01b0391071592614a31565b92915f841315614aa6575090614a6c8383615631565b614a8857637ffffffe1901600a0a810290637fffffff92614a1c565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361488c57614ac591600a0a90614987565b9182156148825792614a1c565b5f198401808060030b14614ae65750614a11565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149c4565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b73576305f5e100600894058094819201955b9150506149c4565b620186a060059405809481920195614b6b565b5082614a1157505050505f90600190565b919291600160ff1b8401614baf57611935935061564a565b90611935935f0391614d5b565b919291600160ff1b9190801580614d49575090614bd8916153e3565b9490929091905f868585858282138015614d40575b614d23575b505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614cee575b505081019182821860ff1c1115614ce657826001600160ff1b0314614cc857905f600192135f14614c9957600a9004915b01925b81158117614c5d57509190565b80614c76575b508015614c6e579190565b505f91508190565b9192614c8c9203600160ff1b01600a0a90614987565b600160ff1b91905f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c4d565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c50565b8107614cfb575b80614c1c565b60ff1d600117015f614cf5565b505050919350614d16579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614bf2565b50835f12614bed565b15614d545750509190565b9350919050565b9392919384158115818117614eac57505090614d76916153e3565b9194908295614d87829582946153e3565b8096929491969387868482138015614ea3575b614e8a575b5050505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614e70575b505081019182821860ff1c1115614e6857826001600160ff1b0314614cc857905f600192135f14614e3957600a9004915b01925b81158117614e0c57509190565b80614e1c57508015614c6e579190565b600160ff1b93614e339291038401600a0a90614987565b5f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614dfc565b509092614dff565b8107614e7d575b80614dcb565b60ff1d600117015f614e77565b929b5098509196509450925090505f8080808080614d9f565b50858412614d9a565b9395939092919015614ec2575050614c6e579190565b945092915050565b600881511061413e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f28610c72606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614583565b94519301614f37815186612bc4565b614f3f575050565b909350611ab091925051925183613bda565b92915f9060018184145f87128715171717614fcb575f92808213614fbd575b03604c81135f821217614fb157600a0a9084614f8f8382029384614987565b14614fa457505015614fa0575f9190565b5f90565b9093509015611ab0579190565b505015614fa0575f9190565b5f9560019450925090614f70565b5050505f90565b93929190918083145f83125f87121883158715171717615021575f928082136150145703604c81135f821217614fb157600a0a9084614f8f8382029384614987565b9194600193509190614f70565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615079576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361508b57505090505f90600190565b60ff8116820191808312615153575f8312156150c3575050604c198112614c6e575f03600a0a916150bc83826140bb565b9283021490565b909293915f81135f1461514957604d811361511e57600a0a9283156140c557835f190483116150f55750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151b85761518f9192615788565b50615199816141d4565b1591826151a557505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461522c57600a6001818404940192061590565b909190600190565b909392915f615244918184614583565b9490945f8483019182019412159081615291575b8115615287575b5061526957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f61525f565b8281129150615258565b6152b093600160fe1b90810193920190614583565b9081815f8212156152e7575050604b198212612cb2576152d5915f03600a0a90614987565b90816152df575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611ab057600160ff1b9080820361530f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153be576001600160ff1b0392838311156153a857600160ff1b9383850361535e57505050509190565b90919293508514615378575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c6b575f039190565b90916001600160ff1b0380841115612c33578514615378575050600a60019104920190565b919091801561558557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615493575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615484575b831361546e5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615462565b6f4b3b4ca85a86c47a098a22400000000080840515615573575b507728c87cb5c89a2571ebfdcb54864ada834a0000000000000083051561555c575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615548575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561553857820515615529575b5f615417565b9290600a02905f190192615523565b93916064029160011901936154f4565b93916402540be400029160091901936154f4565b9391678ac7230489e80000029160121901936154cf565b6025198301955092909202915f6154ad565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561560d5714615605579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611ab091905f811215615645575f036157c2565b6157c2565b909291600160ff1b918281016156dc57508084146156d2578084139182156156ca578185035b604c8111156156b95750505f915b156156aa57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140c557049161567e565b848203615670565b505090505f905f90565b936156e992945f03614bbc565b809391809281146156fd575b50505f039190565b915092506001600160ff1b038314614cc857600a600191059201915f806156f5565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561575d575b6157455750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561573e565b81519190604183036157b8576157b19250602082015190606060408401519301515f1a90615851565b9192909190565b50505f9160029190565b90637ffffff581131561584b57637ffffffe1981019060438213615844575f82121561581857637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140c5577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158c8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158be57905f905f90565b505f906001905f90565b5050505f916003919056"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. diff --git a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol index 7a8ac37e1f..5a5b79ba00 100644 --- a/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol +++ b/src/generated/candidate/RouteProcessorRaindexV6ArbOrderTaker.sol @@ -5,23 +5,23 @@ pragma solidity ^0.8.25; // THIS FILE IS AUTOGENERATED BY THE BUILD SCRIPT. DO NOT EDIT BY HAND. /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x858b3b9c3d903cc3e77e1e38b38c3f3322bfe54d0d9057866096e2b12530b8e5); +bytes32 constant BYTECODE_HASH = bytes32(0xf6ee3ec0f42ea2f814f61628390e6381197406602a56cb0c0957118bfc4d5bb0); /// @dev The deterministic deploy address of the contract when deployed via /// the Zoltu factory. -address constant DEPLOYED_ADDRESS = address(0x2b0178bAa4E6F09459a8c06a17D3E4Cec64a8479); +address constant DEPLOYED_ADDRESS = address(0x10d615EE8eA8f198eFd437bA0cB1612D9d428363); /// @dev The creation bytecode of the contract. bytes constant CREATION_CODE = - hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556124d5806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; + hex"6080604052348015600e575f80fd5b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556124d5806100405f395ff3fe608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316739775cf5b76af58a1739d0e66c4e478daed806cba146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033739775cf5b76af58a1739d0e66c4e478daed806cba14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; /// @dev The runtime bytecode of the contract. bytes constant RUNTIME_CODE = - hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b03831673c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600214801561051557503373c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; + hex"608060405260043610610034575f3560e01c806301ffc9a71461003d578063691f9ed714610070578063b17c83c11461008f57005b3661003b57005b005b348015610048575f80fd5b5061005c610057366004611779565b6100a2565b604051901515815260200160405180910390f35b34801561007b575f80fd5b5061003b61008a3660046117b4565b6100f3565b61003b61009d366004611856565b61020e565b5f6001600160e01b0319821663691f9ed760e01b14806100d257506001600160e01b0319821663b17c83c160e01b145b806100ed57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6101018686868686866104d0565b736e2d0e71d900474b262e545bc4c98b71ab368d2161012b6001600160a01b038816825f1961053d565b5f610138838501856119d1565b90505f61014d876101488b6105b7565b61063b565b5090505f8061015f886101488c6105b7565b9150915080610176578161017281611a03565b9250505b604051632646478b60e01b81526001600160a01b03861690632646478b906101ac908e9087908f90889030908c90600401611a55565b6020604051808303815f875af11580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec9190611aa0565b506102016001600160a01b038c16865f61053d565b5050505050505050505050565b610216610668565b61022561022282611c23565b50565b6102326080830183611cdf565b90505f0361025357604051639c95219f60e01b815260040160405180910390fd5b6001600160a01b038316739775cf5b76af58a1739d0e66c4e478daed806cba146102a05760405163516e822d60e01b81526001600160a01b03841660048201526024015b60405180910390fd5b5f6102ae6080840184611cdf565b5f8181106102be576102be611d25565b90506020028101906102d09190611d39565b6102da9080611d57565b6102e8906040810190611d6b565b6102f56080860186611cdf565b5f81811061030557610305611d25565b90506020028101906103179190611d39565b6020013581811061032a5761032a611d25565b6103409260206040909202019081019150611db1565b90505f6103506080850185611cdf565b5f81811061036057610360611d25565b90506020028101906103729190611d39565b61037c9080611d57565b61038a906060810190611d6b565b6103976080870187611cdf565b5f8181106103a7576103a7611d25565b90506020028101906103b99190611d39565b604001358181106103cc576103cc611d25565b6103e29260206040909202019081019150611db1565b90506103f96001600160a01b038316865f1961053d565b6040516334e3942b60e11b81526001600160a01b038616906369c7285690610425908790600401612015565b60408051808303815f875af1158015610440573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104649190612215565b5061047b90506001600160a01b038316865f61053d565b6104a061048784611c23565b83610491856105b7565b8461049b866105b7565b610696565b50506104cb60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002148015610515575033739775cf5b76af58a1739d0e66c4e478daed806cba14155b156105355760405163f6688adf60e01b8152336004820152602401610297565b505050505050565b6105498383835f610935565b6104cb5761055a83835f6001610935565b61058257604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b61058f8383836001610935565b6104cb57604051635274afe760e01b81526001600160a01b0384166004820152602401610297565b5f6105c0610997565b6040516354636d2b60e01b81526001600160a01b038316600482015273200e12d10bb0c5e4a17e7018f0f1161919bb9389906354636d2b906024016020604051808303815f875af1158015610617573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100ed9190612237565b5f806001600160e01b038416601b0b60e085901d61065a828287610a24565b9350935050505b9250929050565b610670610b96565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160018082528183019092525f91816020015b60608152602001906001900390816106ac575050604080516003808252608082019092529192505f919060208201606080368337019050506040516370a0823160e01b81523060048201529091505f906001600160a01b038816906370a0823190602401602060405180830381865afa15801561072b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074f9190611aa0565b9050801561076b5761076b6001600160a01b0388163383610bd8565b5f6107768288610be5565b50905080835f8151811061078c5761078c611d25565b602090810291909101015250506040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156107dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108019190611aa0565b9050801561081d5761081d6001600160a01b0386163383610bd8565b5f6108288286610be5565b509050808360018151811061083f5761083f611d25565b602090810291909101015250479050801561085e5761085e3382610c25565b5f61086a826012610be5565b509050808360028151811061088157610881611d25565b602002602001018181525050505080825f815181106108a2576108a2611d25565b60209081029190910101526040805160018082528183019092525f91816020015b6040805160a0810182525f91810182815260608083019390935260808201839052815260208101919091528152602001906001900390816108c357905050905087815f8151811061091657610916611d25565b602002602001018190525061092b8382610c9c565b5050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b73200e12d10bb0c5e4a17e7018f0f1161919bb93893b15806109ee575073200e12d10bb0c5e4a17e7018f0f1161919bb93893f7f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d4114155b15610a22576040516373e6d7b360e01b815273200e12d10bb0c5e4a17e7018f0f1161919bb93896004820152602401610297565b565b5f805f851215610a5157604051634a7d166b60e01b81526004810186905260248101859052604401610297565b845f03610a6357505f90506001610b8e565b8460ff8416850185811215610a9e5760405163c849483b60e01b8152600481018890526024810187905260ff86166044820152606401610297565b5f805f831215610aea57604c19831215610ac1575f809550955050505050610b8e565b825f03600a0a9150818481610ad857610ad8612257565b0495505084029091149150610b8e9050565b5f831315610b8357604d831315610b275760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b82600a0a9150815f1981610b3d57610b3d612257565b04841115610b715760405163c849483b60e01b8152600481018a90526024810189905260ff88166044820152606401610297565b5091909102925060019150610b8e9050565b509193506001925050505b935093915050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054600203610a2257604051633ee5aeb560e01b815260040160405180910390fd5b61058f8383836001610ee4565b5f805f805f610bf48787610f2e565b9250925092505f80610c068585610f8a565b9150915081838015610c155750815b9650965050505050509250929050565b80471015610c4f5760405163cf47918160e01b815247600482015260248101829052604401610297565b610c68828260405180602001604052805f8152506111d3565b15610c71575050565b3d15610c8357610c7f6111e8565b5050565b60405163d6bda27560e01b815260040160405180910390fd5b60408051600480825260a082019092525f91816020015b6060815260200190600190039081610cb35790505090505f5b8351811015610d1457838181518110610ce757610ce7611d25565b6020026020010151828281518110610d0157610d01611d25565b6020908102919091010152600101610ccc565b50335f8181523060209081526040808320815160a0810183528083018581526060808301879052608083018190529082528185015282518581529384018581528484019093529093909291905b8751811015610ed957878181518110610d7c57610d7c611d25565b602002602001015193505f845f015160400151511115610ed1575f845f01515f01516001600160a01b031663d04dfe236040518060e00160405280885f0151602001516001600160a01b03168152602001898152602001885f01516040015181526020015f8152602001610df48c8a602001516111f3565b8152602001878152602001868152506040518263ffffffff1660e01b8152600401610e1f91906122f2565b5f60405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e6091908101906123f3565b9150505f81511115610ecf5784516020015160405163012c676d60e21b81526001600160a01b03909116906304b19db490610ea1908a9085906004016124a9565b5f604051808303815f87803b158015610eb8575f80fd5b505af1158015610eca573d5f803e3d5ffd5b505050505b505b600101610d61565b505050505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f5114831661098b57838315161561097f573d5f823e3d81fd5b5f808060ff841681037f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115610f7957600a860460018201600a88065f1493509350935050610f83565b8593509150600190505b9250925092565b5f808383601b82900b8214806110c0577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000087051561100b577f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000870515610ffc576305f5e1008705965060088601955061100b565b620186a0870596506005860195505b8687601b0b1461102657600a8705965085600101955061100b565b7b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc7b19999999999999999999999999999999999999999999999999999998888201116110ba575f600188039050808160030b036110b85760e01b6001600160e01b037b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff60ff8b901d18161795505f94506106619350505050565b505b506110d7565b865f036110d757505f935060019250610661915050565b858660030b1461118e575f821315611136576110f383836114d5565b1561111b5760405163d556b11160e01b81526004810184905260248101839052604401610297565b637ffffffe19909501600a0a82029550637fffffff9461118e565b637fffffff19869003604381131561115857505f945084935061066192505050565b80600a0a888161116a5761116a612257565b059750875f0361118457505f945084935061066192505050565b50637fffffff1995505b81861361119e57600193506111b7565b818603600a0a83816111b2576111b2612257565b071593505b5050506001600160e01b03841660e084901b1791509250929050565b5f805f83516020850186885af1949350505050565b6040513d5f823e3d81fd5b60605f825167ffffffffffffffff811115611210576112106118d4565b604051908082528060200260200182016040528015611239578160200160208202803683370190505b5090505f8084511161124b575f611251565b83516001015b85516001010190505f8167ffffffffffffffff811115611273576112736118d4565b6040519080825280602002602001820160405280156112a657816020015b60608152602001906001900390816112915790505b5090505f6112ca604080516002815233602082015230818301526060810190915290565b8282815181106112dc576112dc611d25565b60200260200101819052505f5b875181101561133957818060010192505087818151811061130c5761130c611d25565b602002602001015183838151811061132657611326611d25565b60209081029190910101526001016112e9565b508551156114cb5780806001019150508382828151811061135c5761135c611d25565b60200260200101819052505f5b86518110156114c95761141887828151811061138757611387611d25565b60200260200101515f01516113f56113c38a85815181106113aa576113aa611d25565b6020026020010151602001518051602090810291012090565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c902090565b89848151811061140757611407611d25565b6020026020010151604001516114f7565b61143857604051630a57f30960e31b815260048101829052602401610297565b86818151811061144a5761144a611d25565b60200260200101515f01516001600160a01b03165f1b85828151811061147257611472611d25565b602002602001018181525050818060010192505086818151811061149857611498611d25565b6020026020010151602001518383815181106114b6576114b6611d25565b6020908102919091010152600101611369565b505b5095945050505050565b5f6114f05f84126114e657836114ea565b835f035b83611568565b9392505050565b5f836001600160a01b03163b5f03611555575f806115158585611606565b5090925090505f81600381111561152e5761152e6124c1565b14801561154c5750856001600160a01b0316826001600160a01b0316145b925050506114f0565b61156084848461164c565b949350505050565b5f637ffffff5821361157b57505f6100ed565b637ffffffe19820160438113156115965750508115156100ed565b5f81126115d65780600a0a7b80000000000000000000000000000000000000000000000000000001816115cb576115cb612257565b0484119150506100ed565b805f03600a0a7b800000000000000000000000000000000000000000000000000000020284101591505092915050565b5f805f835160410361163d576020840151604085015160608601515f1a61162f888285856116b1565b955095509550505050610f83565b505081515f9150600290610f83565b805160408051630b135d3f60e11b8082526004820186905260248201929092525f92906020820185604483015e5f82606483010152601f820160051c60051b915060205f60648401838a5afa9050825f5114601f3d1116811693505050509392505050565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156116ea57505f9150600390508261176f565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561173b573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b03811661176657505f92506001915082905061176f565b92505f91508190505b9450945094915050565b5f60208284031215611789575f80fd5b81356001600160e01b0319811681146114f0575f80fd5b6001600160a01b0381168114610222575f80fd5b5f805f805f8060a087890312156117c9575f80fd5b86356117d4816117a0565b955060208701356117e4816117a0565b94506040870135935060608701359250608087013567ffffffffffffffff8082111561180e575f80fd5b818901915089601f830112611821575f80fd5b81358181111561182f575f80fd5b8a6020828501011115611840575f80fd5b6020830194508093505050509295509295509295565b5f805f60608486031215611868575f80fd5b8335611873816117a0565b9250602084013567ffffffffffffffff8082111561188f575f80fd5b9085019060c082880312156118a2575f80fd5b909250604085013590808211156118b7575f80fd5b508401604081870312156118c9575f80fd5b809150509250925092565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561190b5761190b6118d4565b60405290565b6040805190810167ffffffffffffffff8111828210171561190b5761190b6118d4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561195d5761195d6118d4565b604052919050565b5f82601f830112611974575f80fd5b813567ffffffffffffffff81111561198e5761198e6118d4565b6119a1601f8201601f1916602001611934565b8181528460208386010111156119b5575f80fd5b816020850160208301375f918101602001919091529392505050565b5f602082840312156119e1575f80fd5b813567ffffffffffffffff8111156119f7575f80fd5b61156084828501611965565b5f60018201611a2057634e487b7160e01b5f52601160045260245ffd5b5060010190565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f6001600160a01b038089168352876020840152808716604084015285606084015280851660808401525060c060a0830152611a9460c0830184611a27565b98975050505050505050565b5f60208284031215611ab0575f80fd5b5051919050565b5f67ffffffffffffffff821115611ad057611ad06118d4565b5060051b60200190565b5f82601f830112611ae9575f80fd5b81356020611afe611af983611ab7565b611934565b82815260059290921b84018101918181019086841115611b1c575f80fd5b8286015b84811015611c1857803567ffffffffffffffff80821115611b3f575f80fd5b908801906060828b03601f19011215611b56575f80fd5b611b5e6118e8565b86830135611b6b816117a0565b815260408381013583811115611b7f575f80fd5b8401603f81018d13611b8f575f80fd5b88810135611b9f611af982611ab7565b81815260059190911b82018301908a8101908f831115611bbd575f80fd5b928401925b82841015611bdb5783358252928b0192908b0190611bc2565b858c0152505050606084013583811115611bf3575f80fd5b611c018d8a83880101611965565b918301919091525085525050918301918301611b20565b509695505050505050565b5f60408236031215611c33575f80fd5b611c3b611911565b823567ffffffffffffffff80821115611c52575f80fd5b818501915060608236031215611c66575f80fd5b611c6e6118e8565b8235611c79816117a0565b81526020830135611c89816117a0565b6020820152604083013582811115611c9f575f80fd5b611cab36828601611965565b60408301525083526020850135915080821115611cc6575f80fd5b50611cd336828601611ada565b60208301525092915050565b5f808335601e19843603018112611cf4575f80fd5b83018035915067ffffffffffffffff821115611d0e575f80fd5b6020019150600581901b3603821315610661575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235607e19833603018112611d4d575f80fd5b9190910192915050565b5f8235609e19833603018112611d4d575f80fd5b5f808335601e19843603018112611d80575f80fd5b83018035915067ffffffffffffffff821115611d9a575f80fd5b6020019150600681901b3603821315610661575f80fd5b5f60208284031215611dc1575f80fd5b81356114f0816117a0565b5f808335601e19843603018112611de1575f80fd5b830160208101925035905067ffffffffffffffff811115611e00575f80fd5b8060051b3603821315610661575f80fd5b5f8235605e19833603018112611e25575f80fd5b90910192915050565b5f808335601e19843603018112611e43575f80fd5b830160208101925035905067ffffffffffffffff811115611e62575f80fd5b803603821315610661575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f808335601e19843603018112611ead575f80fd5b830160208101925035905067ffffffffffffffff811115611ecc575f80fd5b8060061b3603821315610661575f80fd5b8183525f60208085019450825f5b85811015611f23578135611efe816117a0565b6001600160a01b03168752818301358388015260409687019690910190600101611eeb565b509495945050505050565b8183526020808401935f91600585811b8301820185855b8881101561200757858303601f19018a52611f608289611e11565b60608135611f6d816117a0565b6001600160a01b03168552611f8482880183611dcc565b82898801528083880152608092507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811115611fbe575f80fd5b871b808288850137860190506040611fd884820185611e2e565b9450838884030182890152611ff08484018683611e70565b9e8a019e9750505093870193505050600101611f45565b509098975050505050505050565b5f602080835260e0830184358285015260408286013581860152606081870135818701528087013580151580821461204b575f80fd5b80608089015250506120606080880188611dcc565b60c060a08901529384905261010093848801600582901b89018601835f5b848110156121dc578b830360ff19018452813536879003607e190181126120a3575f80fd5b8601803536829003609e190181126120b9575f80fd5b60808552810180356120ca816117a0565b6001600160a01b0380821660808801526120e68e840184611e11565b915060a08088015281356120f9816117a0565b8116610120880152818e013561210e816117a0565b16610140870152612121818c0182611e2e565b91508a61016088015261213961018088018383611e70565b9150506121488b830183611e98565b607f19808985030160c08a0152612160848385611edd565b935061216e8d860186611e98565b93509150808985030160e08a015250612188838383611edd565b9250505060808201358c8701528c8301358d8701528a8301358b8701526121b18a840184611dcc565b935091508581038a8701526121c7818484611f2e565b968d019695505050918a01915060010161207e565b50506121eb60a08c018c611e2e565b8b8303601f190160c08d015298509650612206818989611e70565b9b9a5050505050505050505050565b5f8060408385031215612226575f80fd5b505080516020909101519092909150565b5f60208284031215612247575f80fd5b815160ff811681146114f0575f80fd5b634e487b7160e01b5f52601260045260245ffd5b5f815180845260208085019450602084015f5b83811015611f235781518752958201959082019060010161227e565b5f8282518085526020808601955060208260051b840101602086015f5b848110156122e557601f198684030189526122d383835161226b565b988401989250908301906001016122b7565b5090979650505050505050565b602081526001600160a01b038251166020820152602082015160408201525f604083015160e0606084015261232b610100840182611a27565b9050606084015160808401526080840151601f19808584030160a0860152612353838361229a565b925060a08601519150808584030160c0860152612370838361226b565b925060c08601519150808584030160e08601525061238e828261226b565b95945050505050565b5f82601f8301126123a6575f80fd5b815160206123b6611af983611ab7565b8083825260208201915060208460051b8701019350868411156123d7575f80fd5b602086015b84811015611c1857805183529183019183016123dc565b5f8060408385031215612404575f80fd5b825167ffffffffffffffff8082111561241b575f80fd5b818501915085601f83011261242e575f80fd5b8151602061243e611af983611ab7565b82815260059290921b8401810191818101908984111561245c575f80fd5b948201945b8386101561247a57855182529482019490820190612461565b91880151919650909350505080821115612492575f80fd5b5061249f85828601612397565b9150509250929050565b828152604060208201525f611560604083018461226b565b634e487b7160e01b5f52602160045260245ffd"; /// @dev What MUST already be on a network before this release can be /// broadcast there: an address, and the runtime code that belongs at it. /// `abi.encode`d as a `DeployDependency[]` because Solidity has no /// file-scope constant of dynamic array type. bytes constant DEPENDENCIES = - hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000052400000000000000000000000000000000000000000000000000000000000005700000000000000000000000000c4cf8f35f6fa0a36cbaea5c0a6cea77134c03e2a000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000051806080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146117cf575080631f69cb75146115725780632cb77e9f146115465780632fbc4ba0146113fc57806341d1514f146113c55780635cffe9de1461126957806360746119146110e5578063613255ab1461106257806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611b64565b6024358281116101825761010c903690600401611b64565b60c0366043190112610182576101043583811161018257610131903690600401611d0a565b90610124359384116101825761014e61015c943690600401611d0a565b926101576126ea565b612230565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a7611853565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b81610215602093836119d3565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c923690600401611822565b91906102786126ea565b60405192610285846119b7565b5f84523691611dde565b90612b82565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c7903690600401611822565b9190604051926102d6846119b7565b5f84528284016102e582611ab7565b946102f360405196876119d3565b8286526102ff83611ab7565b9361031186880195601f190186612214565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a820301865288516118df565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b8701876120f4565b929089846040519586938585013782018381015f81528b519283915e015f838201520380845201826119d3565b306139f0565b6103ce828a611fda565b526103d98189611fda565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff82116101825760809082360301126101825761042260609160040161213c565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c0826004019383360301126101825760243590811161018257610484903690600401611822565b9061048d6126ea565b6104be6104b96104b46104ad6104a38880612127565b60408101906120f4565b36916119f5565b613986565b6139db565b801561075f576001101561074d57602483016104da8186611f47565b90501561073b5760448401946104f08682611f47565b9050156107295761055661051e9661054a61051561050e8580612127565b9585611f47565b99909285611f47565b91909261053b6040519761053189611903565b3389523690611a59565b9a60209b8c8901523691611acf565b60408601523691611acf565b60608301526064850135608083015261056e8261272c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c82015260606040820152806106066060820188612042565b0390a1019161061583856120f4565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611dde565b82808080808080610584565b6106866104ad84866120f4565b61068f81614777565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b5116936120f4565b866040519586958652850152606060408501526060840191611d39565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b8452600484015260248301906118df565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa6126ea565b5f80806107bf60048035608481019101611e90565b9050156110505760246004350135926107d784612791565b1561103e576060806040516107eb8161196b565b6107f3611ee5565b81525f60208201525f6040820152015261080b611ee5565b5061086b61086661084561083b61083561082f608460043501600435600401611e90565b90611f17565b80611f32565b6040810190611f47565b602061085e61082f608460043501600435600401611e90565b013591611f7d565b611d25565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611e90565b6060810190611f47565b604061085e61082f608460043501600435600401611e90565b81604051976108c889611933565b16875216602086015260408501526108ea608460043501600435600401611e90565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611e90565b905081108061102b575b15610e785761093a608460043501600435600401611e90565b821015610e64578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f8361196b565b8181013567ffffffffffffffff81116101825761099190369084840101611b64565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d0a565b606082015280516001600160a01b036109ec6040830151602085015190611fda565b5151166001600160a01b0385511614801590610e30575b610e1e57610a1b6020830151604084015190836130d2565b610a248161272c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae846119b7565b5f8452339186613107565b925f93610ad1606082015160446004350135906127b4565b15610b3857505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d590606090a15b8115610b30575b5092610a82565b905088610b29565b610b456040820151612791565b158015610e0b575b15610ba257505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa90606090a1610b22565b9250925050600196959691610bbb606460043501611fee565b15610d785796610c2b97610c3b60408401516040880151610bdc8183613460565b15610d705750925b610c35848592610c1e610c1860608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b613e30565b90613feb565b9d8e9260408d015161352b565b60408c0152613555565b99613555565b98610c46848461357f565b610c5084826135dd565b60405192338452608060208501526060610c768451608080880152610100870190612042565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d1257505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d0d96604084015260608301520390a180858c5101808d5260051b8c01526136ef565b610b22565b9091929396602080610d63600193601f198782030189528b51906001600160a01b0382511681526040610d528584015160608785015260608401906120c1565b9201519060408184039101526118df565b9901950193929101610cb3565b905092610be4565b610c2b90610c3b6060840151610c35610db6610c1860408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b613e30565b60408a0151610dc58183613460565b15610e035750915b829c8d916060890151908116155f14610df4575060408801515b96879460408d015161352b565b610dfe9085613487565b610de7565b905091610dcd565b50610e19606082015161343d565b610b4d565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610e4c6060830151604085015190611fda565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610e8a606460043501611fee565b1561102557835b6004356004013590610ea38282613460565b6110075750508490610ec3856001600160a01b0360208701511633613069565b505060a46004350190610edb826004356004016120f4565b905015159081610fff575b50610f5e575b506001600160a01b03610f0292935116336127db565b50505b8351811015610f2a5780610f24610f1e60019387611fda565b516138c8565b01610f05565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610f886001600160a01b03855116926004356004016120f4565b929091333b1561018257610fd05f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d39565b038183335af190811561022c57859115610eec579050610ff09150611987565b5f836001600160a01b03610eec565b905088610ee6565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610e91565b506110396040830151612791565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b03611087611853565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f916110b8575b50604051908152f35b90508181813d83116110de575b6110cf81836119d3565b810103126101825751826110af565b503d6110c5565b34610182576110f336611893565b92916111009491946126ea565b61110b83833361275d565b61111481612791565b15611238578160ff9161112c856111ef969533612d9c565b6111368183613460565b15611232575080935b61114b8582853361300b565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c061117a898833613069565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b908061121b5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61122a9261028f913691611dde565b80808061015c565b9361113f565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b039081811680910361018257611298611869565b6044359167ffffffffffffffff916064358381116101825736602382011215610182578060040135938411610182573660248583010111610182576113259560209216936112e7868587612f2c565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d39565b03815f855af193841561022c575f94611391575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113785761136d93503091612fa5565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d6020116113bd575b816113ad602093836119d3565b8101031261018257519284611339565b3d91506113a0565b346101825760603660031901126101825760206113f46113e3611853565b6113eb611869565b60443591612d9c565b604051908152f35b346101825761140a36611893565b928094926114166126ea565b61142182853361275d565b61142a81612791565b15611516578061143e61148d9286336127db565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612881565b939091856114bb5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b61150a9661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a08236039182011261018257602435848111610182576115c2903690600401611822565b90936115cc6126ea565b5f946001600160a01b0394856115e184611d25565b1633036117ad576115fa6115f53685611b64565b61272c565b805f525f60205260405f20966001885414611641575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f6001985560405196338852826020890152606060408901528161166d8761187f565b166060890152602484013590606219018112156101825783019060a060808901528061169b6004840161187f565b166101008901526116ae6024830161187f565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e63878061066595608461177661028f9a60209f611735906117a09f9a606061014061064e9d0152610160880191611d39565b61176761175c6117486044880185611d59565b605f198a8603810160a08c01529491611d8e565b926064870190611d59565b918784030160c0880152611d8e565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b8280808080808080611610565b6024866117b985611d25565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b8114908115611811575b5015158152f35b6301ffc9a760e01b1490508361180a565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576118db91600401611822565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761191f57604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761191f57604052565b6040810190811067ffffffffffffffff82111761191f57604052565b6080810190811067ffffffffffffffff82111761191f57604052565b67ffffffffffffffff811161191f57604052565b60e0810190811067ffffffffffffffff82111761191f57604052565b6020810190811067ffffffffffffffff82111761191f57604052565b90601f8019910116810190811067ffffffffffffffff82111761191f57604052565b92919267ffffffffffffffff821161191f5760405191611a1f601f8201601f1916602001846119d3565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611a56933591016119f5565b90565b91906060838203126101825760405190611a7282611933565b8193611a7d8161187f565b8352611a8b6020820161187f565b602084015260408101359167ffffffffffffffff831161018257604092611ab29201611a3b565b910152565b67ffffffffffffffff811161191f5760051b60200190565b929192611adb82611ab7565b604092611aeb60405192836119d3565b819581835260208093019160061b84019381851161018257915b848310611b1457505050505050565b8583830312610182578386918251611b2b8161194f565b611b348661187f565b81528286013583820152815201920191611b05565b9080601f8301121561018257816020611a5693359101611acf565b91909160a0818403126101825760405190611b7e82611903565b8193611b898261187f565b835267ffffffffffffffff9160208101358381116101825782611bad918301611a59565b602085015260408101358381116101825782611bca918301611b49565b6040850152606081013592831161018257611beb6080939284938301611b49565b60608501520135910152565b909291611c0384611ab7565b916040611c1360405194856119d3565b839580855260208095019160059160051b8401948086116101825784935b868510611c42575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611c6d81611933565b611c768361187f565b81528a83013584811161018257830185601f8201121561018257803590611c9c82611ab7565b91611ca9895193846119d3565b8083528d808401918b1b83010191888311610182578e809101915b838310611cfa57509150508201528583013593841161018257611ceb858c95869501611a3b565b86820152815201940193611c31565b82358152918101918f9101611cc4565b9080601f8301121561018257816020611a5693359101611bf7565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611dab575050505090565b909192936001906001600160a01b03611dc38761187f565b16815285830135838201526040908101950193920190611d9d565b90929192611deb81611ab7565b91604091611dfc60405194856119d3565b839581855260208095019160051b8301938185116101825783925b858410611e275750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611e518161194f565b82358481116101825786611e66918501611a59565b81528983013593841161018257611e81868b95869501611d0a565b83820152815201930192611e17565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611ed382611933565b60606040835f81525f60208201520152565b60405190611ef282611903565b5f608083828152611f01611ec6565b6020820152606060408201526060808201520152565b9015610e6457803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610e645760061b0190565b805115610e645760200190565b805160011015610e645760400190565b805160021015610e645760600190565b805160031015610e645760800190565b805160041015610e645760a00190565b8051821015610e645760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b82811061201a575050505090565b835180516001600160a01b03168652820151858301526040909401939281019260010161200c565b906080806120b86120a661209460406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e08801526101008701906118df565b60408701518682036040880152611ffb565b60608601518582036060870152611ffb565b93015191015290565b9081518082526020808093019301915f5b8281106120e0575050505090565b8351855293810193928101926001016120d2565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121536115f561214c8380611f32565b3690611b64565b5f525f602052600160405f2054036121ef5780612173816121df93611f32565b6121d76121926121976020850135938460408701359384923690611b64565b6130d2565b6121af6121a48580611f32565b946060810190611e90565b92906121cf604051966121c1886119b7565b5f88525f3681373690611b64565b933691611bf7565b923392613107565b6040810151606090910151600192565b505f905f905f90565b5f5b60808110612206575050565b6060828201526020016121fa565b5f5b82811061222257505050565b606082820152602001612216565b926001600160a01b038451166001600160a01b03835116146126d8576001600160a01b03612265606086015160643590611fda565b515116906040830151916001600160a01b036122846084358095611fda565b51511614801590612698575b610e1e576040850151906001600160a01b036122af6044358094611fda565b5151166001600160a01b036122ca60643560608a0151611fda565b51511614612686576122db8661272c565b805f525f60205260405f20541561263357506122f68461272c565b805f525f60205260405f2054156125df57506123d992916123b3917f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e396040518061235e61235061012033845280602085015283018d612042565b82810360408401528a612042565b85606083015260643560808301528760a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b03865116604051926123a6846119b7565b5f8452606435908a613107565b936001600160a01b03865116604051926123cc846119b7565b5f845260a4359086613107565b916123e76040820151612791565b1580156125cb575b80156125b8575b80156125a5575b612593576040519161240e8361196b565b5f83525f60208401525f60408401525f606084015261242d848361479b565b84526040840152612453612441838661479b565b6020860152806060860152845161352b565b94612467602085015160408601519061352b565b936124718761343d565b8015612584575b6125725761253961256b957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d9461251b6125709a60a0966124ba8a885161357f565b6124c88c602089015161357f565b6124d68a60408901516135dd565b6124e48c60608901516135dd565b6124ed8a6138c8565b6124f68c6138c8565b6001600160a01b0361251260c435926060606435910151611fda565b51511633612881565b50506001600160a01b0361251260e43592606060a435910151611fda565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a16136ef565b6136ef565b565b604051630d86822160e01b8152600490fd5b5061258e8561343d565b612478565b6040516321badf1f60e01b8152600490fd5b506125b3606084015161343d565b6123fd565b506125c6606082015161343d565b6123f6565b506125d96040840151612791565b156123ef565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f3945091925082915050606081015b0390a1565b9551604080513381526001600160a01b039092166020830152810196909652507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39493508392505060608201905061262e565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b036126b2606085015160a43590611fda565b5151166001600160a01b036126ce604088015160443590611fda565b5151161415612290565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00600281541461271a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612757816127496020820194602086526040830190612042565b03601f1981018352826119d3565b51902090565b909115612768575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b6127b0905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1290565b906127b0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b9291926127e782613ac3565b936127f18161343d565b61286f5784816001600160e01b036128109360e01d9116601b0b6148fe565b9290809315612846575b5082908161282a575b5050509190565b61283e926001600160a01b03309216612fa5565b5f8181612823565b9092505f19811461285b57600101915f61281a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b9392919361288e8361343d565b61292c57846128aa576128a2939450613069565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f20549485613555565b956128f18761343d565b612914575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f8301121561018257815160209261298082611ab7565b9161298e60405193846119d3565b808352848084019160051b830101918683116101825785809101915b838310612a1d5750505050948281015191821161018257019180601f840112156101825782516129d981611ab7565b936129e760405195866119d3565b818552838086019260051b820101928311610182578301905b828210612a0e575050505090565b81518152908301908301612a00565b82518152918101918691016129aa565b90808251908181526020809101926020808460051b8301019501935f915b848310612a5b5750505050505090565b9091929394958480612a79600193601f198682030187528a516120c1565b9801930193019194939290612a4b565b91906020928381526001600160a01b0382511684820152838201516040820152612ac3604083015160e060608401526101008301906118df565b9060608301516080820152612aea608084015192601f1993848483030160a0850152612a2d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612b2d57505050611a5694955060c060e091015192828503019101526120c1565b825187529588019591880191600101612b09565b90604082019082526020606081936040838201528551809452019301915f5b828110612b6e575050505090565b835185529381019392810192600101612b60565b916040805191612b9183611903565b60048084526020612ba38186016121f8565b5f5b8751811015612bd85780612bbb6001928a611fda565b51612bc68289611fda565b52612bd18188611fda565b5001612ba5565b5092955092939093335f52308352855f2091865190612bf68261194f565b612bfe611ec6565b8252606085819301528751612c12816119b7565b5f8152885191612c21836119b7565b5f83525f3681375f5b8151811015612d8f57612c3d8183611fda565b5190888c8b84519189818401518d8d8251612c65575b50505050505050506001915001612c2a565b5f612cd497948197948c9794612c928c956001600160a01b039d8e81818d51169c0151169b015190613ba2565b94865199612c9f8b61199b565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612a89565b03915afa938415612d85578b915f95612d5f575b508451612cfd575b50908b8e89838d8d612c53565b51015116803b1561018257612d2c925f918c8f84905180978195829463012c676d60e21b845233908401612b41565b03925af1918215612d5557600192612d46575b8981612cf0565b612d4f90611987565b5f612d3f565b8c513d5f823e3d90fd5b612d7c9195503d805f833e612d7481836119d3565b810190612945565b9050935f612ce8565b8e513d5f823e3d90fd5b5050505050505050509050565b8215612dd1576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b909150612ddd82613dd4565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa968715612ef3575f97612efd575b5083612e34612e2d83612e649a614ab3565b509061423e565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa968715612ef3575f97612ec2575b50612e2d612e8891611a5698614ab3565b50612e938183613460565b15612eba5750935b5f5260018252825f20905f528152815f20905f8052525f205490613555565b905093612e9b565b96508387813d8311612eec575b612ed981836119d3565b8101031261018257955195612e2d612e77565b503d612ecf565b85513d5f823e3d90fd5b96508387813d8311612f25575b612f1481836119d3565b810103126101825795519583612e1b565b503d612f0a565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f5114811615612f86575b8360405215612f7057505050565b635274afe760e01b835216600482015260249150fd5b6001811516612f9c57813b15153d151616612f62565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f5114811615612ff5575b836040525f60605215612f7057505050565b6001811516612f9c57813b15153d151616612fe3565b939291936130188361343d565b61292c578461302c576128a29394506127db565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f5281526128e7835f2054948561352b565b9092919261307681613ac3565b936130808161343d565b6130c05784816001600160e01b0361309f9360e01d9116601b0b6148fe565b508092816130ae575050509190565b6001600160a01b0361283e9316612f2c565b604051632d1671a360e11b8152600490fd5b916130fd9060606130f2936001600160a01b039485916040880151611fda565b515116940151611fda565b5151161461268657565b949193613346919360c0915f6132cd6040928351946131258661199b565b61312d611ee5565b86526020958487820152848682015260609781868a809401528260808201528660a0820152015261327d85519161316383611903565b600483526131728884016121f8565b8d61317c8161272c565b9c896001600160a01b039e8f94859182865116908d5194600386528501528c840152168c820152608081018a526131b286611f8d565b526131bc85611f8d565b5088516131c881611933565b6002815289368c8301376131db86611f9a565b526131e585611f9a565b5060ff8a6132488b8501936132328761320b81613203858a51611fda565b515116613dd4565b9751168861321a848951611fda565b51511685613229858a51611fda565b51015191612d9c565b9661323e828751611fda565b5151169451611fda565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61328682611faa565b5261329081611faa565b506132b48a8d8d60ff8a6132488d8501936132328761320b81613203858a51611fda565b6132bd82611fba565b526132c781611fba565b50613ba2565b95878a511697848b0191825191868184511693015116928a855230875285808620915101518651916132fe836119b7565b86835287519561330d8761199b565b86528886015286850152848885015289608085015260a084015260c08301528351808098819463d04dfe2360e01b835260048301612a89565b03915afa968715613433575f945f98613411575b508451600281106133fa5750818386015195015161338061337a88611fca565b51611fba565b5161338b8183613460565b156133f25750925b6133b58685919060405192600284526020840152604083015260608201604052565b6133be88611faa565b526133c887611faa565b508251996133d58b61199b565b8a52890152870152850152608084015260a083015260c082015290565b905092613393565b602490835190630fbb8e5560e21b82526004820152fd5b9097506134299194503d805f833e612d7481836119d3565b939093965f61335a565b50513d5f823e3d90fd5b61345c905f60e01d906001600160e01b038160e01d9116601b0b6147fe565b1390565b9061345c916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b61487f565b6134ae6001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484613ff5565b90637ffffff582136134fe575b906134c59161423e565b92909215806134f6575b6134d857505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b5082156134cf565b6135088282614ede565b156134bb57604483856040519163d556b11160e01b835260048301526024820152fd5b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614444565b611a5691610c18916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614608565b6135d991608081018261359b6135958351611fca565b51611fca565b526135d26135cc6001600160a01b038094515116936135c36135bd8551611fca565b51611f8d565b51169251611fca565b51611faa565b519161300b565b5050565b906080810191806135f16135958551611fba565b526001600160a01b0380925151169161360d6135bd8551611fba565b511661361c6135cc8551611fba565b5190816136b75761362c8361343d565b61292c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e955f5260209060018252613682604094855f20835f528452855f20855f528452855f2054613555565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612a2d565b916136e8917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a959361262e95612881565b505061369c565b60c0810151908151915f92613863575b506137a46020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b519161374c836119b7565b8683528c519361375b856119b7565b8785528d519661376a8861199b565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612a89565b03915afa94851561385957879561383b575b5084516137c7575b50505050505050565b81905101510151169051813b15613837579184918493836137fc965180978195829463012c676d60e21b845260048401612b41565b03925af190811561382e5750613817575b80808080806137be565b6138218291611987565b61382b578061380d565b80fd5b513d84823e3d90fd5b8480fd5b6138509195503d8089833e612d7481836119d3565b9050935f6137b6565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b15610182576138a6925f928360405180968195829463012c676d60e21b845260048401612b41565b03925af1801561022c57156136ff576138c0919250611987565b5f905f6136ff565b608081016138d96135cc8251611fba565b519182156138e657505050565b6139006135bd6001600160a01b0380935151169351611fba565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661393b575b505050505050565b61395f955f9284845260018152828420868552815282842091845252812055613069565b5f808080613933565b8115613972570490565b634e487b7160e01b5f52601260045260245ffd5b60408151106139ce576020810151908051603f19810190811161285b5760051c82116139ba5760016020920160051b010190565b50506040516139c8816119b7565b5f815290565b506040516139c8816119b7565b8051156139eb57602001515f1a90565b505f90565b905f8091602081519101845af48080613a6e575b15613a245750506040513d81523d5f602083013e60203d82010160405290565b15613a4b57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d15613a5c576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d151580613a045750813b1515613a04565b60041115613a8b57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152613abf83613a81565b0152565b613acb614fcc565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af1928315613b99575f925f94613b64575b50613b2183613a81565b600183141580613b52575b613b365750505090565b5163ee07877f60e01b8152918291610725919060048401613a9f565b50613b5c83613a81565b821515613b2c565b90809450613b889293503d8511613b92575b613b8081836119d3565b8101906148d4565b919091925f613b17565b503d613b76565b513d5f823e3d90fd5b90805191613baf83611ab7565b91613bca604094613bc2865195866119d3565b808552611ab7565b601f199460209186013686840137835183519095908015613dc9576001613c209101965b6001978891010197613c17613c028a611ab7565b99613c0f86519b8c6119d3565b808b52611ab7565b01848901612214565b85805f9684516002815233878201523086820152606081018652613c438b611f8d565b52613c4d8a611f8d565b505f925b613d85575b5050508351613c69575b50505050505090565b85809598979692980181613c7d8289611fda565b52613c888188611fda565b505f925b613c9b575b5085969750613c60565b8451831015613d80576001600160a01b03613d1281613cba8689611fda565b51511686613cc8878a611fda565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c613d09888b611fda565b51015191614a2a565b15613d6857868098999a928192613d29878a611fda565b515116613d368787611fda565b52019385613d448289611fda565b510151613d51868c611fda565b52613d5c858b611fda565b50019290989796613c8c565b8951630a57f30960e31b815260048101859052602490fd5b613c91565b9091968151881015613dc0578280910197613da08184611fda565b51613dab8a8d611fda565b52613db6898c611fda565b5001919081613c51565b96829150613c56565b50613c205f96613bee565b613ddc614fcc565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa928315613b99575f925f94613b645750613b2183613a81565b9091939284158215175f14613e4a5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c613f81575b5050613e6d81614ba3565b93613e7781614ba3565b94613e828682614bc3565b90918215613f72575f9083986f0785ee10d5da46d900f436a000000000808611613f64575b50670de0b6b3a7640000808b11613f55575b50633b9aca00808b11613f46575b50612710808b11613f38575b5098805b613f27575081906118db989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291614bd6565b60019290920191600a900480613ed7565b60049a04998a930192613ed3565b600991939a049901915f613ec7565b601291939a049901915f613eb9565b85049950602592505f613ea7565b509290506118db949550614bd6565b5f821215613fd557808413613fc7575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb2841315613e62579092506118db939491614ae1565b9092506118db939491614b48565b80841215613f91579092506118db939491614ae1565b6134c5828261423e565b9290918061401b576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461403057505050505f905f90565b6140499361403d91614c90565b92919490938492614c90565b909391928461405788614ba3565b9161406186614ba3565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c91868810614208575b030191600160ff1b98838a018112155f146141d5575050035b5f955f8212806141cc575b6141ae575b5f81128061419c575b61417e5786820103966001600160ff1b0388149081614174575b508061416b575b80614162575b6141445750906140f89291614e3c565b915f811361410b575b506118db93614bd6565b9091604c82136141395761412291600a0a90613968565b90811561412f575f614101565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f85126140e8565b508284146140e2565b905088145f6140db565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b030182136140c1565b95508087018613156141c65786818703015b956140b8565b5f6141c0565b505f81136140b3565b89985090920390506001600160ff1b03819003870182136141f957018601946140a8565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b925061408f565b8115613972570590565b8082601b82810b8314614433577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e100000000000000000084056143df575b8380820b036143ce57507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc8401111561437f575b838060030b03614303575b8084136142e75750506001600160e01b036001925b60e01b91161791565b8303600a0a8015613972576001600160e01b03910715926142de565b92915f8413156143535750906143198383614ede565b61433557637ffffffe1901600a0a810290637fffffff926142c9565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff1992830390604382136141395761437291600a0a90614234565b91821561412f57926142c9565b5f198401808060030b1461439357506142be565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a90930592614271565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614420576305f5e100600894058094819201955b915050614271565b620186a060059405809481920195614418565b50826142be57505050505f90600190565b919291600160ff1b840161445c576118db9350614ef7565b906118db935f0391614608565b919291600160ff1b91908015806145f657509061448591614c90565b9490929091905f8685858582821380156145ed575b6145d0575b505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461459b575b505081019182821860ff1c111561459357826001600160ff1b031461457557905f600192135f1461454657600a9004915b01925b8115811761450a57509190565b80614523575b50801561451b579190565b505f91508190565b91926145399203600160ff1b01600a0a90614234565b600160ff1b91905f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916144fa565b604490836040519163d556b11160e01b835260048301526024820152fd5b5090926144fd565b81076145a8575b806144c9565b60ff1d600117015f6145a2565b5050509193506145c3579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b9450925090508680808061449f565b50835f1261449a565b156146015750509190565b9350919050565b93929193841581158181176147595750509061462391614c90565b919490829561463482958294614c90565b8096929491969387868482138015614750575b614737575b5050505050508682841860ff1c94860391039081604c0381116145b55701600a0a80820591908461471d575b505081019182821860ff1c111561471557826001600160ff1b031461457557905f600192135f146146e657600a9004915b01925b811581176146b957509190565b806146c95750801561451b579190565b600160ff1b936146e09291038401600a0a90614234565b5f614510565b600a60037fe66666666666666666666666666666666666666666666666666666666666666792010401916146a9565b5090926146ac565b810761472a575b80614678565b60ff1d600117015f614724565b929b5098509196509450925090505f808080808061464c565b50858412614647565b939593909291901561476f57505061451b579190565b945092915050565b60088151106139eb576008015167ffffffffffffffff1667ff0a89c674ee78741490565b91604083019260406147d5610c18606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b613e30565b945193016147e48151866127b4565b6147ec575050565b909350611a5691925051925183613487565b92915f9060018184145f87128715171717614878575f9280821361486a575b03604c81135f82121761485e57600a0a908461483c8382029384614234565b146148515750501561484d575f9190565b5f90565b9093509015611a56579190565b50501561484d575f9190565b5f956001945092509061481d565b5050505f90565b93929190918083145f83125f871218831587151717176148ce575f928082136148c15703604c81135f82121761485e57600a0a908461483c8382029384614234565b919460019350919061481d565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215614926576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361493857505090505f90600190565b60ff8116820191808312614a00575f831215614970575050604c19811261451b575f03600a0a916149698382613968565b9283021490565b909293915f81135f146149f657604d81136149cb57600a0a92831561397257835f190483116149a25750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b614a6557614a3c9192615035565b50614a4681613a81565b159182614a5257505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f14614ad957600a6001818404940192061590565b909190600190565b909392915f614af1918184613e30565b9490945f8483019182019412159081614b3e575b8115614b34575b50614b1657505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f614b0c565b8281129150614b05565b614b5d93600160fe1b90810193920190613e30565b9081815f821215614b94575050604b1982126128a257614b82915f03600a0a90614234565b9081614b8c575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611a5657600160ff1b90808203614bbc575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f8184181215614c6b576001600160ff1b039283831115614c5557600160ff1b93838503614c0b57505050509190565b90919293508514614c25575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b811461285b575f039190565b90916001600160ff1b0380841115612823578514614c25575050600a60019104920190565b9190918015614e3257827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515614d40575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110614d31575b8313614d1b5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192614d0f565b6f4b3b4ca85a86c47a098a22400000000080840515614e20575b507728c87cb5c89a2571ebfdcb54864ada834a00000000000000830515614e09575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515614df5575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e4000000000000000000830515614de557820515614dd6575b5f614cc4565b9290600a02905f190192614dd0565b9391606402916001190193614da1565b93916402540be40002916009190193614da1565b9391678ac7230489e8000002916012190193614d7c565b6025198301955092909202915f614d5a565b505f915081908190565b90915f198383099280830292838086109503948086039584871015614eba5714614eb2579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611a5691905f811215614ef2575f0361506f565b61506f565b909291600160ff1b91828101614f895750808414614f7f57808413918215614f77578185035b604c811115614f665750505f915b15614f5757507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a908115613972570491614f2b565b848203614f1d565b505090505f905f90565b93614f9692945f03614469565b80939180928114614faa575b50505f039190565b915092506001600160ff1b03831461457557600a600191059201915f80614fa2565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561500a575b614ff25750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f1415614feb565b81519190604183036150655761505e9250602082015190606060408401519301515f1a906150fe565b9192909190565b50505f9160029190565b90637ffffff58113156150f857637ffffffe19810190604382136150f1575f8212156150c557637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a8015613972577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615175579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b0381161561516b57905f905f90565b505f906001905f90565b5050505f916003919056000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; + hex"00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000059a00000000000000000000000000000000000000000000000000000000000005e600000000000000000000000009775cf5b76af58a1739d0e66c4e478daed806cba000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000058d36080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714611829575080631f69cb75146115cc5780632cb77e9f146115a05780632fbc4ba01461145657806341d1514f1461141f5780635cffe9de146112c3578063607461191461113f578063613255ab146110bc57806369c7285614610771578063709fb8a5146104375780639235084d146103e3578063ac9650d814610295578063d7e442ec14610237578063d9d98ce4146101865763fa501182146100c1575f80fd5b34610182576101403660031901126101825767ffffffffffffffff600435818111610182576100f4903690600401611bbe565b6024358281116101825761010c903690600401611bbe565b60c0366043190112610182576101043583811161018257610131903690600401611d64565b90610124359384116101825761014e61015c943690600401611d64565b92610157612afa565b61228e565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b5f80fd5b34610182576040366003190112610182576001600160a01b036101a76118ad565b166040516370a0823160e01b8152306004820152602081602481855afa90811561022c575f916101fa575b50156101e25760206040515f8152f35b60249060405190633c5bf76960e21b82526004820152fd5b90506020813d602011610224575b8161021560209383611a2d565b810103126101825751826101d2565b3d9150610208565b6040513d5f823e3d90fd5b346101825760203660031901126101825760043567ffffffffffffffff81116101825761028f61026e61015c92369060040161187c565b9190610278612afa565b6040519261028584611a11565b5f84523691611e38565b90612f92565b34610182576020806003193601126101825760043567ffffffffffffffff8111610182576102c790369060040161187c565b9190604051926102d684611a11565b5f84528284016102e582611b11565b946102f36040519687611a2d565b8286526102ff83611b11565b9361031186880195601f190186612272565b5f5b84811061037557604080518881528951818a018190525f92600582901b83018101918a918c9085015b8287106103495785850386f35b909192938280610365600193603f198a82030186528851611939565b960192019601959291909261033c565b806103c4886103be61039160019560059d9c9d1b87018761214e565b929089846040519586938585013782018381015f81528b519283915e015f83820152038084520182611a2d565b30614143565b6103ce828a612034565b526103d98189612034565b5001969596610313565b3461018257600319602036820112610182576004359067ffffffffffffffff821161018257608090823603011261018257610422606091600401612196565b90604051921515835260208301526040820152f35b34610182576003196040368201126101825760043567ffffffffffffffff8082116101825760c082600401938336030112610182576024359081116101825761048490369060040161187c565b9061048d612afa565b6104be6104b96104b46104ad6104a38880612181565b604081019061214e565b3691611a4f565b6140d9565b61412e565b801561075f576001101561074d57602483016104da8186611fa1565b90501561073b5760448401946104f08682611fa1565b9050156107295761055661051e9661054a61051561050e8580612181565b9585611fa1565b99909285611fa1565b91909261053b604051976105318961195d565b3389523690611ab3565b9a60209b8c8901523691611b29565b60408601523691611b29565b60608301526064850135608083015261056e82612b3c565b91825f525f875260405f209586541596876105b2575b888860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055604051908152f35b6001905560a46001600160a01b03917f87491344dfbcf91f6cbbc610cbbeedc85313d37a02df0c93527f7ea5f8db717f83855116604051908152878c8201526060604082015280610606606082018861209c565b0390a10191610615838561214e565b9050610679575b5050505061066d929161066561064e61028f933390919060405192600284526020840152604083015260608201604052565b906040519160018352602083015260408201604052565b923691611e38565b82808080808080610584565b6106866104ad848661214e565b61068f81614eca565b156107025750937fd46c2c56b35c8210e9e712ec3f02242d5fc90187c0ac8ed80cc33626846ec3698961066d9897956106f56106d86106659761064e9761028f9b51169361214e565b866040519586958652850152606060408501526060840191611d93565b0390a1938395965061061c565b89610725604051928392630c89984b60e31b845260048401526024830190611939565b0390fd5b60405163540e5f0b60e01b8152600490fd5b604051636c44ef8f60e01b8152600490fd5b604051633c8270bd60e21b8152600490fd5b604051632cff108b60e21b8152600490fd5b34610182576003196020368201126101825767ffffffffffffffff600435116101825760c09060043536030112610182576107aa612afa565b5f80806107bf60048035608481019101611eea565b9050156110aa5760246004350135926107d784612ba1565b15611098576060806040516107eb816119c5565b6107f3611f3f565b81525f60208201525f6040820152015261080b611f3f565b5061086b61086661084561083b61083561082f608460043501600435600401611eea565b90611f71565b80611f8c565b6040810190611fa1565b602061085e61082f608460043501600435600401611eea565b013591611fd7565b611d7f565b936001600160a01b036108ba6108666108a161089761083561082f608460043501600435600401611eea565b6060810190611fa1565b604061085e61082f608460043501600435600401611eea565b81604051976108c88961198d565b16875216602086015260408501526108ea608460043501600435600401611eea565b9490506001604051955f87520160051b85016040525f905f5b610917608460043501600435600401611eea565b9050811080611085575b15610ed25761093a608460043501600435600401611eea565b821015610ebe578160051b810135607e1982360301811215610182576080818301360312610182576040519161096f836119c5565b8181013567ffffffffffffffff81116101825761099190369084840101611bbe565b835280820160208181013590850152604080820135908501526060013567ffffffffffffffff8111610182576109ca9236920101611d64565b606082015280516001600160a01b036109ec6040830151602085015190612034565b5151166001600160a01b0385511614801590610e8a575b610e7857610a1b6020830151604084015190836134da565b610a2481612b3c565b91825f525f60205260405f2054155f14610a88575051604080513381526001600160a01b039092166020830152810191909152600191907fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f390606090a15b01610903565b9190610ab9602084979597015160408501519060608601519060405192610aae84611a11565b5f845233918661354c565b5f9491610b2257505051604080513381526001600160a01b03909216602083015281019190915260019291907f1e6fa9678edf81f9f25bbf308bde03ad3e110db1f429394b0915ba021532941490606090a15b8115610b1a575b5092610a82565b905088610b13565b610b3760608201516044600435013590612bc4565b15610b9157505051604080513381526001600160a01b03909216602083015281019190915260019291907fe3151dc8cb7a54ffc4baabd28c1f241c94d510b5e5b502491ac3cad6c16316d59080606081015b0390a1610b0c565b610b9e6040820151612ba1565b158015610e65575b15610bfc57505051604080513381526001600160a01b03909216602083015281019190915260019291907f500b713857325f9e6dcb52ae832eca9109d107ed1aae9cb4928b4c1e13f051aa908060608101610b89565b9250925050600196959691610c15606460043501612048565b15610dd25796610c8597610c9560408401516040880151610c368183613bb3565b15610dca5750925b610c8f848592610c78610c7260608a01516001600160e01b03601b918660e01d92828816810b928260e01d9216900b614583565b9061473e565b9d8e9260408d0151613c7e565b60408c0152613ca8565b99613ca8565b98610ca08484613cd2565b610caa8482613d30565b60405192338452608060208501526060610cd0845160808088015261010087019061209c565b93602081015160a0870152604081015160c0870152015192607f198582030160e0860152835180825260208201906020808260051b8501019601925f5b828110610d6c57505050505092806001979695937f194f1feb3b4d7076a2c272e774e792e0c48bb8c7aa1a9a3671c1cd6da9e6b4c193610d6796604084015260608301520390a180858c5101808d5260051b8c0152613e42565b610b0c565b9091929396602080610dbd600193601f198782030189528b51906001600160a01b0382511681526040610dac85840151606087850152606084019061211b565b920151906040818403910152611939565b9901950193929101610d0d565b905092610c3e565b610c8590610c956060840151610c8f610e10610c7260408801516001600160e01b0394601b90868360e01d9316820b91878260e01d9216900b614583565b60408a0151610e1f8183613bb3565b15610e5d5750915b829c8d916060890151908116155f14610e4e575060408801515b96879460408d0151613c7e565b610e589085613bda565b610e41565b905091610e27565b50610e736060820151613b90565b610ba6565b60405163936bb5ad60e01b8152600490fd5b506001600160a01b03610ea66060830151604085015190612034565b5151166001600160a01b036020860151161415610a03565b634e487b7160e01b5f52603260045260245ffd5b50919390610ee4606460043501612048565b1561107f57835b6004356004013590610efd8282613bb3565b6110615750508490610f1d856001600160a01b0360208701511633613471565b505060a46004350190610f358260043560040161214e565b905015159081611059575b50610fb8575b506001600160a01b03610f5c9293511633612beb565b50505b8351811015610f845780610f7e610f7860019387612034565b5161401b565b01610f5f565b5060409160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b90506001600160a01b03602084015116610fe26001600160a01b038551169260043560040161214e565b929091333b156101825761102a5f93604051958694859463691f9ed760e01b8652600486015260248501528960448501528a606485015260a0608485015260a4840191611d93565b038183335af190811561022c57859115610f4657905061104a91506119e1565b5f836001600160a01b03610f46565b905088610f40565b604492506040519163573b6f4160e01b835260048301526024820152fd5b84610eeb565b506110936040830151612ba1565b610921565b60405163315f9e2360e21b8152600490fd5b604051639c95219f60e01b8152600490fd5b3461018257602080600319360112610182576024816001600160a01b036110e16118ad565b16604051928380926370a0823160e01b82523060048301525afa90811561022c575f91611112575b50604051908152f35b90508181813d8311611138575b6111298183611a2d565b81010312610182575182611109565b503d61111f565b346101825761114d366118ed565b929161115a949194612afa565b611165838333612b6d565b61116e81612ba1565b15611292578160ff91611186856112499695336131a4565b6111908183613bb3565b1561128c575080935b6111a585828533613413565b917f8045c25080b0868951141ed0a91720bcad09a8364a2b3109ee1fd49c1f0bc8b860c06111d4898833613471565b97906001600160a01b0360405192338452169a8b6020840152856040840152886060840152608083015260a0820152a16040519660068852602088015260408701526060860152608085015260a08401521660c082015260e08101604052906040519160018352602083015260408201604052565b90806112755760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6112849261028f913691611e38565b80808061015c565b93611199565b50604051623a3a4d60e21b81523360048201526001600160a01b039190911660248201526044810191909152606490fd5b34610182576080366003190112610182576004356001600160a01b0390818116809103610182576112f26118c3565b6044359167ffffffffffffffff9160643583811161018257366023820112156101825780600401359384116101825736602485830101116101825761137f956020921693611341868587613334565b60405196879283926323e30c8b60e01b84523360048501528760248501528860448501525f606485015260a06084850152602460a485019201611d93565b03815f855af193841561022c575f946113eb575b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd984036113d2576113c7935030916133ad565b602060405160018152f35b604051630b6c58a960e31b815260048101859052602490fd5b9093506020813d602011611417575b8161140760209383611a2d565b8101031261018257519284611393565b3d91506113fa565b3461018257606036600319011261018257602061144e61143d6118ad565b6114456118c3565b604435916131a4565b604051908152f35b3461018257611464366118ed565b92809492611470612afa565b61147b828533612b6d565b61148481612ba1565b1561157057806114986114e7928633612beb565b9790957f7f9dfa19cf1cc2f806f2f860fbc9c056b601fb1afc0e9b843dfe5c63616268e660806040513381526001600160a01b038416998a60208301528560408301526060820152a133612c91565b939091856115155760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055005b6115649661028f956106659460ff93604051956005875260208701526040860152606085015260808401521660a082015260c08101604052906040519160018352602083015260408201604052565b8080808080808061015c565b506040516306dde9c360e41b81523360048201526001600160a01b03841660248201526044810191909152606490fd5b34610182576020366003190112610182576004355f525f6020526020600160405f205414604051908152f35b34610182576003196040368201126101825767ffffffffffffffff9060043582811161018257806004019160a082360391820112610182576024358481116101825761161c90369060040161187c565b9093611626612afa565b5f946001600160a01b03948561163b84611d7f565b1633036118075761165461164f3685611bbe565b612b3c565b805f525f60205260405f2096600188541461169b575b60208960017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556040519015158152f35b9091929394959697505f600198556040519633885282602089015260606040890152816116c7876118d9565b166060890152602484013590606219018112156101825783019060a06080890152806116f5600484016118d9565b16610100890152611708602483016118d9565b16610120880152604481013560221982360301811215610182570190602460048301359201988211610182578136038913610182577f09d18501db0080ca2d6cd7c17fa7255daff4b2d503ea93b76ff68b6752ea8e6387806106659560846117d061028f9a60209f61178f906117fa9f9a606061014061064e9d0152610160880191611d93565b6117c16117b66117a26044880185611db3565b605f198a8603810160a08c01529491611de8565b926064870190611db3565b918784030160c0880152611de8565b91013560e08301520390a13390919060405192600284526020840152604083015260608201604052565b828080808080808061166a565b60248661181385611d7f565b6040516335252be360e01b815291166004820152fd5b34610182576020366003190112610182576004359063ffffffff60e01b82168092036101825760209163e414309160e01b811490811561186b575b5015158152f35b6301ffc9a760e01b14905083611864565b9181601f840112156101825782359167ffffffffffffffff8311610182576020808501948460051b01011161018257565b600435906001600160a01b038216820361018257565b602435906001600160a01b038216820361018257565b35906001600160a01b038216820361018257565b906080600319830112610182576004356001600160a01b0381168103610182579160243591604435916064359067ffffffffffffffff8211610182576119359160040161187c565b9091565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60a0810190811067ffffffffffffffff82111761197957604052565b634e487b7160e01b5f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761197957604052565b6040810190811067ffffffffffffffff82111761197957604052565b6080810190811067ffffffffffffffff82111761197957604052565b67ffffffffffffffff811161197957604052565b60e0810190811067ffffffffffffffff82111761197957604052565b6020810190811067ffffffffffffffff82111761197957604052565b90601f8019910116810190811067ffffffffffffffff82111761197957604052565b92919267ffffffffffffffff82116119795760405191611a79601f8201601f191660200184611a2d565b829481845281830111610182578281602093845f960137010152565b9080601f8301121561018257816020611ab093359101611a4f565b90565b91906060838203126101825760405190611acc8261198d565b8193611ad7816118d9565b8352611ae5602082016118d9565b602084015260408101359167ffffffffffffffff831161018257604092611b0c9201611a95565b910152565b67ffffffffffffffff81116119795760051b60200190565b929192611b3582611b11565b604092611b456040519283611a2d565b819581835260208093019160061b84019381851161018257915b848310611b6e57505050505050565b8583830312610182578386918251611b85816119a9565b611b8e866118d9565b81528286013583820152815201920191611b5f565b9080601f8301121561018257816020611ab093359101611b29565b91909160a0818403126101825760405190611bd88261195d565b8193611be3826118d9565b835267ffffffffffffffff9160208101358381116101825782611c07918301611ab3565b602085015260408101358381116101825782611c24918301611ba3565b6040850152606081013592831161018257611c456080939284938301611ba3565b60608501520135910152565b909291611c5d84611b11565b916040611c6d6040519485611a2d565b839580855260208095019160059160051b8401948086116101825784935b868510611c9c575050505050505050565b67ffffffffffffffff90853582811161018257870190606082850312610182578451611cc78161198d565b611cd0836118d9565b81528a83013584811161018257830185601f8201121561018257803590611cf682611b11565b91611d0389519384611a2d565b8083528d808401918b1b83010191888311610182578e809101915b838310611d5457509150508201528583013593841161018257611d45858c95869501611a95565b86820152815201940193611c8b565b82358152918101918f9101611d1e565b9080601f8301121561018257816020611ab093359101611c51565b356001600160a01b03811681036101825790565b908060209392818452848401375f828201840152601f01601f1916010190565b9035601e198236030181121561018257016020813591019167ffffffffffffffff8211610182578160061b3603831361018257565b9190808252602080920192915f905b828210611e05575050505090565b909192936001906001600160a01b03611e1d876118d9565b16815285830135838201526040908101950193920190611df7565b90929192611e4581611b11565b91604091611e566040519485611a2d565b839581855260208095019160051b8301938185116101825783925b858410611e815750505050505050565b67ffffffffffffffff908435828111610182578601908382860312610182578351611eab816119a9565b82358481116101825786611ec0918501611ab3565b81528983013593841161018257611edb868b95869501611d64565b83820152815201930192611e71565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160051b3603831361018257565b60405190611f2d8261198d565b60606040835f81525f60208201520152565b60405190611f4c8261195d565b5f608083828152611f5b611f20565b6020820152606060408201526060808201520152565b9015610ebe57803590607e1981360301821215610182570190565b903590609e1981360301821215610182570190565b903590601e1981360301821215610182570180359067ffffffffffffffff821161018257602001918160061b3603831361018257565b9190811015610ebe5760061b0190565b805115610ebe5760200190565b805160011015610ebe5760400190565b805160021015610ebe5760600190565b805160031015610ebe5760800190565b805160041015610ebe5760a00190565b8051821015610ebe5760209160051b010190565b3580151581036101825790565b9081518082526020808093019301915f5b828110612074575050505090565b835180516001600160a01b031686528201518583015260409094019392810192600101612066565b906080806121126121006120ee60406001600160a01b0380895116885260208901519060a060208a01528082511660a08a015260208201511660c08901520151606060e0880152610100870190611939565b60408701518682036040880152612055565b60608601518582036060870152612055565b93015191015290565b9081518082526020808093019301915f5b82811061213a575050505090565b83518552938101939281019260010161212c565b903590601e1981360301821215610182570180359067ffffffffffffffff82116101825760200191813603831361018257565b903590605e1981360301821215610182570190565b6121ad61164f6121a68380611f8c565b3690611bbe565b5f525f602052600160405f20540361224d57806121cd8161223993611f8c565b6122316121ec6121f16020850135938460408701359384923690611bbe565b6134da565b6122096121fe8580611f8c565b946060810190611eea565b92906122296040519661221b88611a11565b5f88525f3681373690611bbe565b933691611c51565b9233926137f8565b604081015160609091015160019391925090565b505f905f905f90565b5f5b60808110612264575050565b606082820152602001612258565b5f5b82811061228057505050565b606082820152602001612274565b926001600160a01b038451166001600160a01b0383511614612ae8576001600160a01b036122c3606086015160643590612034565b5151166001600160a01b036122df604085015160843590612034565b51511614801590612aa8575b610e78576001600160a01b03612308604086015160443590612034565b5151166001600160a01b036123236064356060880151612034565b51511614612a965761233484612b3c565b805f525f60205260405f205415612a46575061234f82612b3c565b805f525f60205260405f2054156129f6575061240e907f6fa7f4c28634b0a9d6831401c45ae468195fb63aed07308935c35374ff5d9e39604051806123b26123a461012033845280602085015283018a61209c565b82810360408401528761209c565b6044356060830152606435608083015260843560a083015260a43560c083015260c43560e083015260e4356101008301520390a16001600160a01b0383511690604051916123ff83611a11565b5f8352606435604435886137f8565b905061264d6001600160a01b03855116936040519461242c86611a11565b5f865261243761350f565b50604051906124458261195d565b6004825261245560208301612256565b61245e86612b3c565b906001600160a01b0387511660405192600384526020840152604083015260608201526080810160405261249182611fe7565b5261249b81611fe7565b506040516124a88161198d565b6002815260403660208301376124bd82611ff4565b526124c781611ff4565b506125976124ee6001600160a01b036124e660843560408a0151612034565b515116614527565b6125326001600160a01b038851166001600160a01b0361251460843560408c0151612034565b515116602061252960843560408d0151612034565b510151916131a4565b906001600160a01b0361254b60843560408b0151612034565b51511660ff602061256260843560408d0151612034565b51015192169093929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b6125a082612004565b526125aa81612004565b506126346125c96001600160a01b036124e660a43560608a0151612034565b6126046001600160a01b038851166001600160a01b036125ef60a43560608c0151612034565b515116602061252960a43560608d0151612034565b906001600160a01b0361261d60a43560608b0151612034565b51511660ff602061256260a43560608d0151612034565b61263d82612014565b5261264781612014565b506142f5565b926126e35f6001600160a01b038551169260208601908151906001600160a01b036020818451169301511692868552306020526040808620915101516040519161269683611a11565b868352604051956126a6876119f5565b86526020860152604085015284606085015289608085015260a084015260c0830152604051808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936129d0575b50612702576040513d5f823e3d90fd5b908151600281106129b857506040602083015192015161272a61272488612024565b51612014565b516127358183613bb3565b156129b05750925b61275f8385919060405192600284526020840152604083015260608201604052565b61276888612004565b5261277287612004565b5060405196612780886119f5565b86885260a43560208901526040880194855260608801938452608088015260a087015260c08601526127b56040840151612ba1565b1591821561299c575b508115612987575b8115612976575b5061296457604051916127df836119c5565b5f83525f60208401525f60408401525f60608401526127fe8483614eee565b845260408401526128246128128386614eee565b60208601528060608601528451613c7e565b946128386020850151604086015190613c7e565b9361284287613b90565b8015612955575b6129435761290a61293c957fd9fa84dd790c969daa5c33d8050dc06b4a9b59d5b42e2be5f5e8ae20447f618d946128ec6129419a60a09661288b8a8851613cd2565b6128998c6020890151613cd2565b6128a78a6040890151613d30565b6128b58c6060890151613d30565b6128be8a61401b565b6128c78c61401b565b6001600160a01b036128e360c435926060606435910151612034565b51511633612c91565b50506001600160a01b036128e360e43592606060a435910151612034565b5050606060405191338352805160208401526020810151604084015260408101518284015201516080820152a1613e42565b613e42565b565b604051630d86822160e01b8152600490fd5b5061295f85613b90565b612849565b6040516321badf1f60e01b8152600490fd5b612981915051613b90565b5f6127cd565b90506129966060830151613b90565b906127c6565b6129a891925051612ba1565b15905f6127be565b90509261273d565b60249060405190630fbb8e5560e21b82526004820152fd5b9092506129ef91503d805f833e6129e78183611a2d565b810190612d55565b915f6126f2565b9151604080513381526001600160a01b039092166020830152810192909252507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f39250905080606081015b0390a1565b9351604080513381526001600160a01b039092166020830152810194909452507fb70c12fa453793fa6818ec07c91e74363a47aa6a6829dcd9533937fdf30314f392915081905060608101612a41565b604051631cd2f1c760e21b8152600490fd5b506001600160a01b03612ac2606084015160a43590612034565b5151166001600160a01b03612ade604087015160443590612034565b51511614156122eb565b604051630a98f1f360e21b8152600490fd5b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f006002815414612b2a5760029055565b604051633ee5aeb560e01b8152600490fd5b604051612b6781612b59602082019460208652604083019061209c565b03601f198101835282611a2d565b51902090565b909115612b78575050565b6040516305dbdfd960e41b81526001600160a01b03918216600482015291166024820152604490fd5b612bc0905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1290565b90612bc0916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b929192612bf782614216565b93612c0181613b90565b612c7f5784816001600160e01b03612c209360e01d9116601b0b615051565b9290809315612c56575b50829081612c3a575b5050509190565b612c4e926001600160a01b033092166133ad565b5f8181612c33565b9092505f198114612c6b57600101915f612c2a565b634e487b7160e01b5f52601160045260245ffd5b604051632eaefac360e21b8152600490fd5b93929193612c9e83613b90565b612d3c5784612cba57612cb2939450613471565b50505f905f90565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613ca8565b95612d0187613b90565b612d24575f97885260018252838820908852815282872091875252909320829055565b835163c5e12af560e01b815260048101889052602490fd5b60405163793a8f5560e01b815260048101849052602490fd5b919060408382031261018257825167ffffffffffffffff908181116101825784019082601f83011215610182578151602092612d9082611b11565b91612d9e6040519384611a2d565b808352848084019160051b830101918683116101825785809101915b838310612e2d5750505050948281015191821161018257019180601f84011215610182578251612de981611b11565b93612df76040519586611a2d565b818552838086019260051b820101928311610182578301905b828210612e1e575050505090565b81518152908301908301612e10565b8251815291810191869101612dba565b90808251908181526020809101926020808460051b8301019501935f915b848310612e6b5750505050505090565b9091929394958480612e89600193601f198682030187528a5161211b565b9801930193019194939290612e5b565b91906020928381526001600160a01b0382511684820152838201516040820152612ed3604083015160e06060840152610100830190611939565b9060608301516080820152612efa608084015192601f1993848483030160a0850152612e3d565b9260a081015193838382030160c08401528680865192838152019501905f5b818110612f3d57505050611ab094955060c060e0910151928285030191015261211b565b825187529588019591880191600101612f19565b90604082019082526020606081936040838201528551809452019301915f5b828110612f7e575050505090565b835185529381019392810192600101612f70565b916040805191612fa18361195d565b60048084526020612fb3818601612256565b5f5b8751811015612fe85780612fcb6001928a612034565b51612fd68289612034565b52612fe18188612034565b5001612fb5565b5092955092939093335f52308352855f2091865190613006826119a9565b61300e611f20565b825260608581930152875161302281611a11565b5f815288519161303183611a11565b5f83525f3681375f5b81518110156131975761304d8183612034565b5190888c8b84519189818401518d8d8251613075575b5050505050505050600191500161303a565b5f6130e497948197948c97946130a28c956001600160a01b039d8e81818d51169c0151169b0151906142f5565b948651996130af8b6119f5565b8a528901528488015286015260808501528a60a08501528b60c08501525180958194829363d04dfe2360e01b84528301612e99565b03915afa93841561318d578b915f9561316f575b50845161310d575b50908b8e89838d8d613063565b51015116803b156101825761313c925f918c8f84905180978195829463012c676d60e21b845233908401612f51565b03925af191821561316557600192613156575b8981613100565b61315f906119e1565b5f61314f565b8c513d5f823e3d90fd5b6131849195503d805f833e6129e78183611a2d565b9050935f6130f8565b8e513d5f823e3d90fd5b5050505050505050509050565b82156131d9576001600160a01b038091165f52600160205260405f2091165f5260205260405f20905f5260205260405f205490565b9091506131e582614527565b6001600160a01b03809316906040918251946370a0823160e01b86528416938460048701526020928387602481865afa9687156132fb575f97613305575b508361323c6132358361326c9a615206565b5090614991565b508651636eb1769f60e11b81526001600160a01b0390941660048501523060248501529297889081906044820190565b0381865afa9687156132fb575f976132ca575b5061323561329091611ab098615206565b5061329b8183613bb3565b156132c25750935b5f5260018252825f20905f528152815f20905f8052525f205490613ca8565b9050936132a3565b96508387813d83116132f4575b6132e18183611a2d565b810103126101825795519561323561327f565b503d6132d7565b85513d5f823e3d90fd5b96508387813d831161332d575b61331c8183611a2d565b810103126101825795519583613223565b503d613312565b6040519263a9059cbb60e01b5f526001600160a01b0380931660045260245260205f60448180855af160015f511481161561338e575b836040521561337857505050565b635274afe760e01b835216600482015260249150fd5b60018115166133a457813b15153d15161661336a565b833d5f823e3d90fd5b9092604051936323b872dd60e01b5f526001600160a01b0393848092166004521660245260445260205f60648180855af160015f51148116156133fd575b836040525f6060521561337857505050565b60018115166133a457813b15153d1516166133eb565b9392919361342083613b90565b612d3c578461343457612cb2939450612beb565b6001600160a01b039392919380911694855f52602060018152604092835f20961695865f528152825f20825f528152612cf7835f20549485613c7e565b9092919261347e81614216565b9361348881613b90565b6134c85784816001600160e01b036134a79360e01d9116601b0b615051565b508092816134b6575050509190565b6001600160a01b03612c4e9316613334565b604051632d1671a360e11b8152600490fd5b916135059060606134fa936001600160a01b039485916040880151612034565b515116940151612034565b51511614612a9657565b6040519061351c826119f5565b606060c083613529611f3f565b81525f60208201525f60408201525f838201528260808201525f60a08201520152565b9594919390869361355b61350f565b505f92604061368081519261356f8461195d565b60048452602093613581858201612256565b61364961358d8b612b3c565b8b6001600160a01b03998a9283835116895191600383528b830152898201528360609b168b8201526080810189526135c486611fe7565b526135ce85611fe7565b5087516135da8161198d565b6002815288368b8301376135ed86611ff4565b526135f785611ff4565b5060ff896125628a85019361363387613615816124e6858a51612034565b97511688613624848951612034565b51511685612529858a51612034565b9661363f828751612034565b5151169451612034565b61365282612004565b5261365c81612004565b50612634878b8d60ff896125628c85019361363387613615816124e6858a51612034565b946137005f868a511698869786889c0191825191888184511693015116928c855230895287808620915101518851916136b883611a11565b8683528951956136c7876119f5565b86528a86015288850152848a8501528b608085015260a084015260c08301528551808095819463d04dfe2360e01b835260048301612e99565b03915afa90815f915f936137da575b506137cd575050505f975b6002855110988915996137ba5782848701519601519061373c61272489612024565b51906137488284613bb3565b1590506137b25750925b6137748685919060405192600284526020840152604083015260608201604052565b61377d88612004565b5261378787612004565b5082519b6137948d6119f5565b8c528b0152890152870152608086015260a085015260c08401529190565b905092613752565b5050505050505050509150611ab061350f565b919998509450939661371a565b9092506137f191503d805f833e6129e78183611a2d565b915f61370f565b9495939592919261380761350f565b506040968751906138178261195d565b60048252602093613829858401612256565b61383289612b3c565b6001600160a01b038097818c51168d519360038552898501528d840152166060820152608081018b5261386484611fe7565b5261386e83611fe7565b50895161387a8161198d565b600281528a368783013761388d84611ff4565b5261389783611ff4565b508989019086818351906138aa91612034565b5151166138b690614527565b86888c511689848651906138c991612034565b51511682858751906138da91612034565b510151906138e7926131a4565b9289818651906138f691612034565b51511694519061390591612034565b5101519060ff1661393d929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b61394683612004565b5261395082612004565b5060608801858782519061396391612034565b51511661396f90614527565b868a5116878984519061398191612034565b515116878a85519061399291612034565b5101519061399f926131a4565b90868989818651906139b091612034565b5151169451906139bf91612034565b5101519060ff166139f7929190604051946005865260208601526040850152606084015260808301525f60a083015260c08201604052565b613a0083612014565b52613a0a82612014565b50613a14916142f5565b9183875116938188019283519183818451169301511693865f523084528a805f20915101518b5191613a4583611a11565b5f83528c5196613a54886119f5565b8752858701528b8601525f60608601526080850186905260a085015260c0840152885163d04dfe2360e01b81529283908190613a939060048301612e99565b03815a935f94fa91825f915f94613b72575b50613ab45788513d5f823e3d90fd5b97949596979194825196600288109788613b5b57508183850151940151613add61272487612024565b51613ae88183613bb3565b15613b535750925b613b128585919060405192600284526020840152604083015260608201604052565b613b1b87612004565b52613b2586612004565b5082519a613b328c6119f5565b8b528a01528801526060870152608086015260a085015260c0840152159190565b905092613af0565b602490835190630fbb8e5560e21b82526004820152fd5b909350613b8991503d805f833e6129e78183611a2d565b925f613aa5565b613baf905f60e01d906001600160e01b038160e01d9116601b0b614f51565b1390565b90613baf916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614fd2565b613c016001600160e01b0392838316601b0b9260e01d938160e01d9116601b0b8484614748565b90637ffffff58213613c51575b90613c1891614991565b9290921580613c49575b613c2b57505090565b6044925060405191638eba4d0760e01b835260048301526024820152fd5b508215613c22565b613c5b8282615631565b15613c0e57604483856040519163d556b11160e01b835260048301526024820152fd5b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614b97565b611ab091610c72916001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614d5b565b613d2c916080810182613cee613ce88351612024565b51612024565b52613d25613d1f6001600160a01b03809451511693613d16613d108551612024565b51611fe7565b51169251612024565b51612004565b5191613413565b5050565b90608081019180613d44613ce88551612014565b526001600160a01b03809251511691613d60613d108551612014565b5116613d6f613d1f8551612014565b519081613e0a57613d7f83613b90565b612d3c579183917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a41955f5260209060018252613dd5604094855f20835f528452855f20855f528452855f2054613ca8565b945f5260018252835f20905f528152825f20915f52525f20555b51604051918291338352604060208401526040830190612e3d565b91613e3b917f4cb6e22a3e7e651d7cf0376cff48f20f5007a54147777865be7f5f6c38c50f4a9593612a4195612c91565b5050613def565b60c0810151908151915f92613fb6575b50613ef76020918281510151926001600160a01b039081818187511696015116928660a082019485518252308452604097888320898686510151015160808601518b5191613e9f83611a11565b8683528c5193613eae85611a11565b8785528d5196613ebd886119f5565b8752898701528c86015260016060860152608085015260a084015260c08301528851808099819463d04dfe2360e01b835260048301612e99565b03915afa948515613fac578795613f8e575b508451613f1a575b50505050505050565b81905101510151169051813b15613f8a57918491849383613f4f965180978195829463012c676d60e21b845260048401612f51565b03925af1908115613f815750613f6a575b8080808080613f11565b613f7482916119e1565b613f7e5780613f60565b80fd5b513d84823e3d90fd5b8480fd5b613fa39195503d8089833e6129e78183611a2d565b9050935f613f09565b86513d89823e3d90fd5b6001600160a01b03602080845101510151169060a083015190823b1561018257613ff9925f928360405180968195829463012c676d60e21b845260048401612f51565b03925af1801561022c5715613e52576140139192506119e1565b5f905f613e52565b6080810161402c613d1f8251612014565b5191821561403957505050565b614053613d106001600160a01b0380935151169351612014565b5116815f5260209160018352604092835f20835f528152835f20855f528152835f2054936001600160e01b03851661408e575b505050505050565b6140b2955f9284845260018152828420868552815282842091845252812055613471565b5f808080614086565b81156140c5570490565b634e487b7160e01b5f52601260045260245ffd5b6040815110614121576020810151908051603f198101908111612c6b5760051c821161410d5760016020920160051b010190565b505060405161411b81611a11565b5f815290565b5060405161411b81611a11565b80511561413e57602001515f1a90565b505f90565b905f8091602081519101845af480806141c1575b156141775750506040513d81523d5f602083013e60203d82010160405290565b1561419e57604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b3d156141af576040513d5f823e3d90fd5b60405163d6bda27560e01b8152600490fd5b503d1515806141575750813b1515614157565b600411156141de57565b634e487b7160e01b5f52602160045260245ffd5b602090939291936001600160a01b036040820195168152614212836141d4565b0152565b61421e61571f565b6040805163b7bad1b160e01b81526001600160a01b0383166004820152909182826024815f73200e12d10bb0c5e4a17e7018f0f1161919bb93895af19283156142ec575f925f946142b7575b50614274836141d4565b6001831415806142a5575b6142895750505090565b5163ee07877f60e01b81529182916107259190600484016141f2565b506142af836141d4565b82151561427f565b908094506142db9293503d85116142e5575b6142d38183611a2d565b810190615027565b919091925f61426a565b503d6142c9565b513d5f823e3d90fd5b9080519161430283611b11565b9161431d60409461431586519586611a2d565b808552611b11565b601f19946020918601368684013783518351909590801561451c5760016143739101965b600197889101019761436a6143558a611b11565b9961436286519b8c611a2d565b808b52611b11565b01848901612272565b85805f96845160028152338782015230868201526060810186526143968b611fe7565b526143a08a611fe7565b505f925b6144d8575b50505083516143bc575b50505050505090565b858095989796929801816143d08289612034565b526143db8188612034565b505f925b6143ee575b50859697506143b3565b84518310156144d3576001600160a01b036144658161440d8689612034565b5151168661441b878a612034565b51015187815160051b9101207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f52601c52603c5f208c61445c888b612034565b5101519161517d565b156144bb57868098999a92819261447c878a612034565b5151166144898787612034565b520193856144978289612034565b5101516144a4868c612034565b526144af858b612034565b500192909897966143df565b8951630a57f30960e31b815260048101859052602490fd5b6143e4565b90919681518810156145135782809101976144f38184612034565b516144fe8a8d612034565b52614509898c612034565b50019190816143a4565b968291506143a9565b506143735f96614341565b61452f61571f565b60408051630782d7e160e01b81526001600160a01b03831660048201529091828260248173200e12d10bb0c5e4a17e7018f0f1161919bb93895afa9283156142ec575f925f946142b75750614274836141d4565b9091939284158215175f1461459d5750505090505f905f90565b82810192600160fd1b8082019083011760fe1c6146d4575b50506145c0816152f6565b936145ca816152f6565b946145d58682615316565b909182156146c5575f9083986f0785ee10d5da46d900f436a0000000008086116146b7575b50670de0b6b3a7640000808b116146a8575b50633b9aca00808b11614699575b50612710808b1161468b575b5098805b61467a57508190611935989982600a0a9109960195817fcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd0a93838211900382610100031b9203901c170291615329565b60019290920191600a90048061462a565b60049a04998a930192614626565b600991939a049901915f61461a565b601291939a049901915f61460c565b85049950602592505f6145fa565b50929050611935949550615329565b5f8212156147285780841361471a575b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb28413156145b557909250611935939491615234565b90925061193593949161529b565b808412156146e457909250611935939491615234565b613c188282614991565b9290918061476e576044848460405191637a97930f60e01b835260048301526024820152fd5b90919280155f1461478357505050505f905f90565b61479c93614790916153e3565b929194909384926153e3565b90939192846147aa886152f6565b916147b4866152f6565b947f161bcca7119915b50764b4abe86529797775a5f171951000000000000000000094604c9186881061495b575b030191600160ff1b98838a018112155f14614928575050035b5f955f82128061491f575b614901575b5f8112806148ef575b6148d15786820103966001600160ff1b03881490816148c7575b50806148be575b806148b5575b61489757509061484b929161558f565b915f811361485e575b5061193593615329565b9091604c821361488c5761487591600a0a906140bb565b908115614882575f614854565b505050505f905f90565b50505050505f905f90565b876044916040519163d556b11160e01b835260048301526024820152fd5b505f851261483b565b50828414614835565b905088145f61482e565b604489836040519163d556b11160e01b835260048301526024820152fd5b50806001600160ff1b03018213614814565b95508087018613156149195786818703015b9561480b565b5f614913565b505f8113614806565b89985090920390506001600160ff1b038190038701821361494c57018601946147fb565b5050505050505050505f905f90565b7f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee80000000000000000009650604b92506147e2565b81156140c5570590565b8082601b82810b8314614b86577d90e40fbeea1d3a4abc8955e946fe31cdcf66f634e10000000000000000008405614b32575b8380820b03614b2157507b199999999999999999999999999999999999999999999999999999987b0ccccccccccccccccccccccccccccccccccccccccccccccccccccccc84011115614ad2575b838060030b03614a56575b808413614a3a5750506001600160e01b036001925b60e01b91161791565b8303600a0a80156140c5576001600160e01b0391071592614a31565b92915f841315614aa6575090614a6c8383615631565b614a8857637ffffffe1901600a0a810290637fffffff92614a1c565b506044916040519163d556b11160e01b835260048301526024820152fd5b637fffffff19928303906043821361488c57614ac591600a0a90614987565b9182156148825792614a1c565b5f198401808060030b14614ae65750614a11565b90506001600160e01b039293507b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff915060e01b9260ff1d181617905f90565b600190940193600a909305926149c4565b937f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee8000000000000000000840515614b73576305f5e100600894058094819201955b9150506149c4565b620186a060059405809481920195614b6b565b5082614a1157505050505f90600190565b919291600160ff1b8401614baf57611935935061564a565b90611935935f0391614d5b565b919291600160ff1b9190801580614d49575090614bd8916153e3565b9490929091905f868585858282138015614d40575b614d23575b505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614cee575b505081019182821860ff1c1115614ce657826001600160ff1b0314614cc857905f600192135f14614c9957600a9004915b01925b81158117614c5d57509190565b80614c76575b508015614c6e579190565b505f91508190565b9192614c8c9203600160ff1b01600a0a90614987565b600160ff1b91905f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614c4d565b604490836040519163d556b11160e01b835260048301526024820152fd5b509092614c50565b8107614cfb575b80614c1c565b60ff1d600117015f614cf5565b505050919350614d16579190565b60018160ff1d1790039190565b5f9a50909750909550600160ff1b94509250905086808080614bf2565b50835f12614bed565b15614d545750509190565b9350919050565b9392919384158115818117614eac57505090614d76916153e3565b9194908295614d87829582946153e3565b8096929491969387868482138015614ea3575b614e8a575b5050505050508682841860ff1c94860391039081604c038111614d085701600a0a808205919084614e70575b505081019182821860ff1c1115614e6857826001600160ff1b0314614cc857905f600192135f14614e3957600a9004915b01925b81158117614e0c57509190565b80614e1c57508015614c6e579190565b600160ff1b93614e339291038401600a0a90614987565b5f614c63565b600a60037fe6666666666666666666666666666666666666666666666666666666666666679201040191614dfc565b509092614dff565b8107614e7d575b80614dcb565b60ff1d600117015f614e77565b929b5098509196509450925090505f8080808080614d9f565b50858412614d9a565b9395939092919015614ec2575050614c6e579190565b945092915050565b600881511061413e576008015167ffffffffffffffff1667ff0a89c674ee78741490565b9160408301926040614f28610c72606087519401938451906001600160e01b0390818360e01d9316601b0b918160e01d9116601b0b614583565b94519301614f37815186612bc4565b614f3f575050565b909350611ab091925051925183613bda565b92915f9060018184145f87128715171717614fcb575f92808213614fbd575b03604c81135f821217614fb157600a0a9084614f8f8382029384614987565b14614fa457505015614fa0575f9190565b5f90565b9093509015611ab0579190565b505015614fa0575f9190565b5f9560019450925090614f70565b5050505f90565b93929190918083145f83125f87121883158715171717615021575f928082136150145703604c81135f821217614fb157600a0a9084614f8f8382029384614987565b9194600193509190614f70565b50919050565b919082604091031261018257815160048110156101825760209092015160ff811681036101825790565b91925f831215615079576044838360405191634a7d166b60e01b835260048301526024820152fd5b91928361508b57505090505f90600190565b60ff8116820191808312615153575f8312156150c3575050604c198112614c6e575f03600a0a916150bc83826140bb565b9283021490565b909293915f81135f1461514957604d811361511e57600a0a9283156140c557835f190483116150f55750500290600190565b60405163c849483b60e01b815260048101849052602481019290925260ff166044820152606490fd5b5060405163c849483b60e01b81526004810192909252602482015260ff919091166044820152606490fd5b5050905090600190565b60405163c849483b60e01b815260048101869052602481019190915260ff82166044820152606490fd5b9091813b6151b85761518f9192615788565b50615199816141d4565b1591826151a557505090565b6001600160a01b03918216911614919050565b6020918160645f935160405192630b135d3f60e11b9788855260048501526040602485015286820190604485015e8281018201859052601f01601f191601915afa905f5114601f3d11161690565b9060ff165f03916001600160ff1b0382115f1461522c57600a6001818404940192061590565b909190600190565b909392915f615244918184614583565b9490945f8483019182019412159081615291575b8115615287575b5061526957505090565b604492506040519163d556b11160e01b835260048301526024820152fd5b905083125f61525f565b8281129150615258565b6152b093600160fe1b90810193920190614583565b9081815f8212156152e7575050604b198212612cb2576152d5915f03600a0a90614987565b90816152df575f90565b600160ff1b90565b93600160ff1b90910192509050565b5f811215611ab057600160ff1b9080820361530f575090565b90505f0390565b905f198183099102908180821091030391565b92939291905f81841812156153be576001600160ff1b0392838311156153a857600160ff1b9383850361535e57505050509190565b90919293508514615378575050600a600191045f03920190565b604051630ed8062160e21b8152600481019190915260248101919091526044810182905260648101849052608490fd5b5090915050600160ff1b8114612c6b575f039190565b90916001600160ff1b0380841115612c33578514615378575050600a60019104920190565b919091801561558557827f0235fadd81c2822bb3f07877973d50f28bf22a31be8ee800000000000000000080830515615493575b507f19999999999999999999999999999999999999999999999999999999999999997f0ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc830110615484575b831361546e5791905f90565b919060018060ff1b926001600160ff1b03030190565b9290600a02905f190192615462565b6f4b3b4ca85a86c47a098a22400000000080840515615573575b507728c87cb5c89a2571ebfdcb54864ada834a0000000000000083051561555c575b7b097edd871cfda3a5697758bf0e3cbb5ac5741c640000000000000000830515615548575b7e3899162693736ac531a5a58f1fbb4b746504382ca7e400000000000000000083051561553857820515615529575b5f615417565b9290600a02905f190192615523565b93916064029160011901936154f4565b93916402540be400029160091901936154f4565b9391678ac7230489e80000029160121901936154cf565b6025198301955092909202915f6154ad565b505f915081908190565b90915f19838309928083029283808610950394808603958487101561560d5714615605579082910960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505091500490565b60648386866040519263362ced0960e11b8452600484015260248301526044820152fd5b611ab091905f811215615645575f036157c2565b6157c2565b909291600160ff1b918281016156dc57508084146156d2578084139182156156ca578185035b604c8111156156b95750505f915b156156aa57507f8000000000000000000000000000000000000000000000000000000000000001019190565b92506001600160ff1b03039190565b600a0a9081156140c557049161567e565b848203615670565b505090505f905f90565b936156e992945f03614bbc565b809391809281146156fd575b50505f039190565b915092506001600160ff1b038314614cc857600a600191059201915f806156f5565b73200e12d10bb0c5e4a17e7018f0f1161919bb9389803b15801561575d575b6157455750565b602490604051906373e6d7b360e01b82526004820152fd5b507f1de7d717526cba131d684e312dedbf0852adef9cced9e36798ae4937f7145d41813f141561573e565b81519190604183036157b8576157b19250602082015190606060408401519301515f1a90615851565b9192909190565b50505f9160029190565b90637ffffff581131561584b57637ffffffe1981019060438213615844575f82121561581857637fffffff91505f0301600a0a7b8000000000000000000000000000000000000000000000000000000202111590565b50600a0a80156140c5577b80000000000000000000000000000000000000000000000000000001041090565b5050151590565b50505f90565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158c8579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa1561022c575f516001600160a01b038116156158be57905f905f90565b505f906001905f90565b5050505f91600391905600000000000000000000000000000000000000000000000000200e12d10bb0c5e4a17e7018f0f1161919bb93890000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000044b608060405234801561000f575f80fd5b506004361061004a575f3560e01c80630782d7e11461004e57806354636d2b14610078578063b7bad1b11461009d578063f5c36eaf146100b0575b5f80fd5b61006161005c366004610363565b6100c3565b60405161006f929190610403565b60405180910390f35b61008b610086366004610363565b6100d8565b60405160ff909116815260200161006f565b6100616100ab366004610363565b6100e9565b61008b6100be366004610363565b6100f5565b5f806100cf5f84610100565b91509150915091565b5f6100e35f836101f0565b92915050565b5f806100cf5f84610281565b5f6100e35f83610356565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526020838152604080832081518083019092525460ff8082161515835261010090910416818301527f313ce56700000000000000000000000000000000000000000000000000000000808452839283908190816004818a5afa915060203d1015610182575f91505b811561019857505f5160ff811115610198575f91505b816101af57505050602001516003925090506101e9565b83516101c3575f955093506101e992505050565b836020015160ff1681146101d85760026101db565b60015b846020015195509550505050505b9250929050565b5f805f6101fd8585610281565b909250905060018260038111156102165761021661039d565b1415801561023557505f8260038111156102325761023261039d565b14155b156102795783826040517fee07877f000000000000000000000000000000000000000000000000000000008152600401610270929190610421565b60405180910390fd5b949350505050565b5f805f8061028f8686610100565b90925090505f8260038111156102a7576102a761039d565b0361034b576040805180820182526001815260ff838116602080840191825273ffffffffffffffffffffffffffffffffffffffff8a165f908152908b9052939093209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009094169015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff161761010093909116929092029190911790555b909590945092505050565b5f805f6101fd8585610100565b5f60208284031215610373575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610396575f80fd5b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600481106103ff577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b9052565b6040810161041182856103ca565b60ff831660208301529392505050565b73ffffffffffffffffffffffffffffffffffffffff831681526040810161039660208301846103ca560000000000000000000000000000000000000000000000000000000000000000006e2d0e71d900474b262e545bc4c98b71ab368d2100000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000003d486080604052600436106100d65760003560e01c80638456cb591161007f5780639a1f3406116100595780639a1f340614610200578063cd0fb7a714610220578063f2fde38b14610260578063fa461e331461028057600080fd5b80638456cb59146101ad5780638da5cb5b146101c257806393b3774c146101ed57600080fd5b80632c8958f6116100b05780632c8958f6146100f95780636b2ace871461013f578063715018a61461019857600080fd5b8063046f7da2146100e257806323a69e75146100f95780632646478b1461011957600080fd5b366100dd57005b600080fd5b3480156100ee57600080fd5b506100f76102a0565b005b34801561010557600080fd5b506100f7610114366004613579565b6103a8565b61012c6101273660046136f5565b6103ba565b6040519081526020015b60405180910390f35b34801561014b57600080fd5b506101737f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610136565b3480156101a457600080fd5b506100f7610564565b3480156101b957600080fd5b506100f7610578565b3480156101ce57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610173565b61012c6101fb36600461377c565b61067b565b34801561020c57600080fd5b506100f761021b36600461382f565b61089a565b34801561022c57600080fd5b5061025061023b366004613868565b60016020526000908152604090205460ff1681565b6040519015158152602001610136565b34801561026c57600080fd5b506100f761027b366004613868565b6108f8565b34801561028c57600080fd5b506100f761029b366004613579565b6109af565b60005473ffffffffffffffffffffffffffffffffffffffff163314806102d557503360009081526001602052604090205460ff165b610366576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c6567656420757365720000000000000000000000000000000060648201526084015b60405180910390fd5b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6103b4848484846109af565b50505050565b60025460009074010000000000000000000000000000000000000000900460ff16600114610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff166001146104cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055610519878787878787610b5d565b9050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790559695505050505050565b61056c6111a3565b6105766000611224565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314806105ad57503360009081526001602052604090205460ff165b610639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f52503a2063616c6c6572206973206e6f7420746865206f776e6572206f72206160448201527f2070726976696c65676564207573657200000000000000000000000000000000606482015260840161035d565b600280547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167502000000000000000000000000000000000000000000179055565b60025460009074010000000000000000000000000000000000000000900460ff16600114610705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973206c6f636b65640000000000000000604482015260640161035d565b6002547501000000000000000000000000000000000000000000900460ff1660011461078d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f526f75746550726f636573736f72206973207061757365640000000000000000604482015260640161035d565b600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674020000000000000000000000000000000000000000179055604051600090819073ffffffffffffffffffffffffffffffffffffffff8c16908b908381818185875af1925050503d8060008114610826576040519150601f19603f3d011682016040523d82523d6000602084013e61082b565b606091505b50915091508161083d57805181602001fd5b61084b898989898989610b5d565b92505050600280547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905598975050505050505050565b6108a26111a3565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6109006111a3565b73ffffffffffffffffffffffffffffffffffffffff81166109a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035d565b6109ac81611224565b50565b60025473ffffffffffffffffffffffffffffffffffffffff163314610a56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a2063616c6c2066726f6d20756e6b6e6f776e20736f757263650000606482015260840161035d565b6000808513610a655783610a67565b845b905060008113610af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f526f75746550726f636573736f722e756e697377617056335377617043616c6c60448201527f6261636b3a206e6f7420706f73697469766520616d6f756e7400000000000000606482015260840161035d565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001660011790556000610b3283850185613868565b9050610b5573ffffffffffffffffffffffffffffffffffffffff82163384611299565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610c24576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa158015610bfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1f919061388c565b610c27565b60005b9050600073ffffffffffffffffffffffffffffffffffffffff871673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610cf1576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528816906370a0823190602401602060405180830381865afa158015610cc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cec919061388c565b610d0a565b8473ffffffffffffffffffffffffffffffffffffffff16315b905087600080610d2e87604080518082019091528181528151909101602082015290565b90505b805160208201511115610e84576000610d508280516001018051915290565b90508060ff1660011415610d7a576000610d6983611372565b905083610d74578094505b50610e73565b8060ff1660021415610d9557610d90828d611437565b610e73565b8060ff1660031415610dac576000610d6983611457565b8060ff1660041415610dc157610d908261147d565b8060ff1660051415610dd657610d90826114a3565b8060ff1660061415610dec57610d908d836115a8565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f723a20556e6b6e6f776e20636f6d6d616e642060448201527f636f646500000000000000000000000000000000000000000000000000000000606482015260840161035d565b610e7c836138d4565b925050610d31565b506000905073ffffffffffffffffffffffffffffffffffffffff8b1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14610f4d576040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff8c16906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f48919061388c565b610f50565b60005b905083610f5d8b8361390d565b1015610feb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f526f75746550726f636573736f723a204d696e696d616c20696e70757420626160448201527f6c616e63652076696f6c6174696f6e0000000000000000000000000000000000606482015260840161035d565b600073ffffffffffffffffffffffffffffffffffffffff8a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146110b3576040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301528b16906370a0823190602401602060405180830381865afa15801561108a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ae919061388c565b6110cc565b8773ffffffffffffffffffffffffffffffffffffffff16315b90506110d8898561390d565b81101561111e576110e98482613925565b6040517f963b34a500000000000000000000000000000000000000000000000000000000815260040161035d91815260200190565b6111288482613925565b6040805173ffffffffffffffffffffffffffffffffffffffff8b81168252602082018790529181018c905260608101839052919750808c1691908e169033907f2db5ddd0b42bdbca0d69ea16f234a870a485854ae0d91f16643d6f317d8b89949060800160405180910390a450505050509695505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161035d565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261136d9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261163b565b505050565b6000806113858380516014018051915290565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190602401602060405180830381865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611416919061388c565b91508115611425576001820391505b61143183308385611747565b50919050565b60006114498380516014018051915290565b905061136d83338385611747565b47611478823073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee84611747565b919050565b600061148f8280516014018051915290565b905061149f8260008360006117a2565b5050565b60006114b58280516014018051915290565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301523060248301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561154d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611571919061388c565b9050801561159c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b61136d83308484611747565b60006115ba8280516020018051915290565b905060006115ce8380516020018051915290565b905060006115e28480516001018051915290565b905060006115f68580516020018051915290565b9050600061160a8680516020018051915290565b905061163273ffffffffffffffffffffffffffffffffffffffff8816333088888888886118d6565b50505050505050565b600061169d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611b569092919063ffffffff16565b80519091501561136d57808060200190518101906116bb919061393c565b61136d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161035d565b60006117598580516001018051915290565b905060005b8160ff16811015610b5557600061177b8780516002018051915290565b61ffff8082168602049485900394909150611798888888846117a2565b505060010161175e565b60006117b48580516001018051915290565b905060ff81166117cf576117ca85858585611b6d565b6118cf565b8060ff16600114156117e7576117ca85858585611f22565b8060ff16600214156117ff576117ca85858585612162565b8060ff1660031415611817576117ca85858585612410565b8060ff166004141561182f576117ca85858585612a98565b8060ff1660051415611847576117ca85858585612c26565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f526f75746550726f636573736f723a20556e6b6e6f776e20706f6f6c2074797060448201527f6500000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b5050505050565b6040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152600091908a1690637ecebe0090602401602060405180830381865afa158015611946573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196a919061388c565b6040517fd505accf00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e401600060405180830381600087803b158015611a0457600080fd5b505af1158015611a18573d6000803e3d6000fd5b50506040517f7ecebe0000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b81166004830152600093508c169150637ecebe0090602401602060405180830381865afa158015611a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aaf919061388c565b9050611abc82600161390d565b8114611b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f742073756363656560448201527f6400000000000000000000000000000000000000000000000000000000000000606482015260840161035d565b50505050505050505050565b6060611b6584846000856131e1565b949350505050565b6000611b7f8580516014018051915290565b90506000611b938680516001018051915290565b90506000611ba78780516014018051915290565b90506000611bbb8880516003018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8716301415611c0157611bfc73ffffffffffffffffffffffffffffffffffffffff87168587611299565b611c41565b73ffffffffffffffffffffffffffffffffffffffff8716331415611c4157611c4173ffffffffffffffffffffffffffffffffffffffff87163386886132fa565b6000808573ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb39190613977565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600082118015611ce85750600081115b611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f57726f6e6720706f6f6c20726573657276657300000000000000000000000000604482015260640161035d565b6000808660ff16600114611d63578284611d66565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa158015611dda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfe919061388c565b611e089190613925565b98506000611e1986620f42406139c7565b611e289062ffffff168b6139eb565b9050600081611e3a85620f42406139eb565b611e44919061390d565b611e4e84846139eb565b611e589190613a28565b90506000808a60ff16600114611e7057826000611e74565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8d169063022c0d9f90611ede90859085908f9060248101613ad9565b600060405180830381600087803b158015611ef857600080fd5b505af1158015611f0c573d6000803e3d6000fd5b5050505050505050505050505050505050505050565b6000611f348580516014018051915290565b9050600080611f498780516001018051915290565b60ff161190506000611f618780516014018051915290565b905073ffffffffffffffffffffffffffffffffffffffff8616331415611fa357611fa373ffffffffffffffffffffffffffffffffffffffff86163330876132fa565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915563128acb088284878161201757612012600173fffd8963efd1fc6a506488495d951d5263988d26613b14565b612027565b6120276401000276a36001613b41565b6040805173ffffffffffffffffffffffffffffffffffffffff8d166020820152016040516020818303038152906040526040518663ffffffff1660e01b8152600401612077959493929190613b79565b60408051808303816000875af1158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190613bc0565b505060025473ffffffffffffffffffffffffffffffffffffffff16600114611632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f526f75746550726f636573736f722e73776170556e6956333a20756e6578706560448201527f6374656400000000000000000000000000000000000000000000000000000000606482015260840161035d565b60006121748580516001018051915290565b905060006121888680516014018051915290565b9050600180831614156122575760006121a78780516014018051915290565b905060028316612213578073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121f957600080fd5b505af115801561220d573d6000803e3d6000fd5b50505050505b73ffffffffffffffffffffffffffffffffffffffff821630146122515761225173ffffffffffffffffffffffffffffffffffffffff82168386611299565b50610b55565b600282166123205773ffffffffffffffffffffffffffffffffffffffff851633141561229f5761229f73ffffffffffffffffffffffffffffffffffffffff85163330866132fa565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff851690632e1a7d4d90602401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b505050505b60008173ffffffffffffffffffffffffffffffffffffffff168460405160006040518083038185875af1925050503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b5050905080611632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f526f75746550726f636573736f722e777261704e61746976653a204e6174697660448201527f6520746f6b656e207472616e73666572206661696c6564000000000000000000606482015260840161035d565b60006124228580516001018051915290565b905060006124368680516014018051915290565b905060ff8216156128315773ffffffffffffffffffffffffffffffffffffffff85163014156124a5576124a073ffffffffffffffffffffffffffffffffffffffff85167f000000000000000000000000000000000000000000000000000000000000000085611299565b61275b565b73ffffffffffffffffffffffffffffffffffffffff8516331415612505576124a073ffffffffffffffffffffffffffffffffffffffff8516337f0000000000000000000000000000000000000000000000000000000000000000866132fa565b6040517f4ffe34db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f00000000000000000000000000000000000000000000000000000000000000001690634ffe34db906024016040805180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613c04565b516040517fdf23b45b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301526fffffffffffffffffffffffffffffffff909216917f0000000000000000000000000000000000000000000000000000000000000000169063df23b45b90602401606060405180830381865afa158015612656573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061267a9190613c77565b60409081015190517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526fffffffffffffffffffffffffffffffff909216918716906370a0823190602401602060405180830381865afa158015612720573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612744919061388c565b61274e919061390d565b6127589190613925565b92505b6040517f02b9446c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830181905290831660448301526064820185905260006084830152906302b9446c9060a40160408051808303816000875af1158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a9190613bc0565b5050610b55565b73ffffffffffffffffffffffffffffffffffffffff851615612908576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528681166024830152306044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b1580156128eb57600080fd5b505af11580156128ff573d6000803e3d6000fd5b505050506129c1565b6040517ff7888aec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa15801561299a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129be919061388c565b92505b6040517f97da6d3000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152306024830152828116604483015260006064830152608482018590527f000000000000000000000000000000000000000000000000000000000000000016906397da6d309060a40160408051808303816000875af1158015612a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8e9190613bc0565b5050505050505050565b6000612aaa8580516014018051915290565b85516020808201805190920101875290915073ffffffffffffffffffffffffffffffffffffffff851615612b91576040517ff18d03cc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015286811660248301528381166044830152606482018590527f0000000000000000000000000000000000000000000000000000000000000000169063f18d03cc90608401600060405180830381600087803b158015612b7857600080fd5b505af1158015612b8c573d6000803e3d6000fd5b505050505b6040517f627dd56a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063627dd56a90612be3908490600401613ce3565b6020604051808303816000875af1158015612c02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611632919061388c565b6000612c388580516014018051915290565b90506000612c4c8680516001018051915290565b90506000612c608780516001018051915290565b60000b90506000612c778880516001018051915290565b60000b90506000612c8e8980516014018051915290565b90506000612ca28a80516014018051915290565b9050600073ffffffffffffffffffffffffffffffffffffffff891673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612d8b576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124908a9060840160206040518083038185885af1158015612d5f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d84919061388c565b905061306e565b73ffffffffffffffffffffffffffffffffffffffff8a16331415612dcb57612dcb73ffffffffffffffffffffffffffffffffffffffff8a1633308b6132fa565b612dec73ffffffffffffffffffffffffffffffffffffffff8a16888a613358565b5060ff8616612e9f576040517f3df02124000000000000000000000000000000000000000000000000000000008152600f86810b600483015285900b6024820152604481018990526000606482015273ffffffffffffffffffffffffffffffffffffffff881690633df02124906084016020604051808303816000875af1158015612e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d84919061388c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015612f0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f30919061388c565b6040517f3df02124000000000000000000000000000000000000000000000000000000008152600f88810b600483015287900b6024820152604481018b90526000606482015290915073ffffffffffffffffffffffffffffffffffffffff891690633df0212490608401600060405180830381600087803b158015612fb457600080fd5b505af1158015612fc8573d6000803e3d6000fd5b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000925073ffffffffffffffffffffffffffffffffffffffff861691506370a0823190602401602060405180830381865afa158015613039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305d919061388c565b90506130698282613925565b925050505b73ffffffffffffffffffffffffffffffffffffffff831630146131d45773ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156131b35760008373ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114613117576040519150601f19603f3d011682016040523d82523d6000602084013e61311c565b606091505b50509050806131ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f526f75746550726f636573736f722e7377617043757276653a204e617469766560448201527f20746f6b656e207472616e73666572206661696c656400000000000000000000606482015260840161035d565b506131d4565b6131d473ffffffffffffffffffffffffffffffffffffffff83168483611299565b5050505050505050505050565b606082471015613273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161035d565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161329c9190613cf6565b60006040518083038185875af1925050503d80600081146132d9576040519150601f19603f3d011682016040523d82523d6000602084013e6132de565b606091505b50915091506132ef87838387613389565b979650505050505050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526103b49085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016112eb565b6000613365848484613426565b80611b65575061337784846000613426565b8015611b655750611b65848484613426565b6060831561341c5782516134155773ffffffffffffffffffffffffffffffffffffffff85163b613415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035d565b5081611b65565b611b658383613535565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000179052915160009283928392918816916134bf9190613cf6565b6000604051808303816000865af19150503d80600081146134fc576040519150601f19603f3d011682016040523d82523d6000602084013e613501565b606091505b509150915081801561352b57508051158061352b57508080602001905181019061352b919061393c565b9695505050505050565b8151156135455781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035d9190613ce3565b6000806000806060858703121561358f57600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156135b557600080fd5b818701915087601f8301126135c957600080fd5b8135818111156135d857600080fd5b8860208285010111156135ea57600080fd5b95989497505060200194505050565b73ffffffffffffffffffffffffffffffffffffffff811681146109ac57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261365b57600080fd5b813567ffffffffffffffff808211156136765761367661361b565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156136bc576136bc61361b565b816040528381528660208588010111156136d557600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060c0878903121561370e57600080fd5b8635613719816135f9565b9550602087013594506040870135613730816135f9565b9350606087013592506080870135613747816135f9565b915060a087013567ffffffffffffffff81111561376357600080fd5b61376f89828a0161364a565b9150509295509295509295565b600080600080600080600080610100898b03121561379957600080fd5b88356137a4816135f9565b97506020890135965060408901356137bb816135f9565b95506060890135945060808901356137d2816135f9565b935060a0890135925060c08901356137e9816135f9565b915060e089013567ffffffffffffffff81111561380557600080fd5b6138118b828c0161364a565b9150509295985092959890939650565b80151581146109ac57600080fd5b6000806040838503121561384257600080fd5b823561384d816135f9565b9150602083013561385d81613821565b809150509250929050565b60006020828403121561387a57600080fd5b8135613885816135f9565b9392505050565b60006020828403121561389e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613906576139066138a5565b5060010190565b60008219821115613920576139206138a5565b500190565b600082821015613937576139376138a5565b500390565b60006020828403121561394e57600080fd5b815161388581613821565b80516dffffffffffffffffffffffffffff8116811461147857600080fd5b60008060006060848603121561398c57600080fd5b61399584613959565b92506139a360208501613959565b9150604084015163ffffffff811681146139bc57600080fd5b809150509250925092565b600062ffffff838116908316818110156139e3576139e36138a5565b039392505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a2357613a236138a5565b500290565b600082613a5e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60005b83811015613a7e578181015183820152602001613a66565b838111156103b45750506000910152565b60008151808452613aa7816020860160208601613a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff8316604082015260806060820152600061352b6080830184613a8f565b600073ffffffffffffffffffffffffffffffffffffffff838116908316818110156139e3576139e36138a5565b600073ffffffffffffffffffffffffffffffffffffffff808316818516808303821115613b7057613b706138a5565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a060808301526132ef60a0830184613a8f565b60008060408385031215613bd357600080fd5b505080516020909101519092909150565b80516fffffffffffffffffffffffffffffffff8116811461147857600080fd5b600060408284031215613c1657600080fd5b6040516040810181811067ffffffffffffffff82111715613c3957613c3961361b565b604052613c4583613be4565b8152613c5360208401613be4565b60208201529392505050565b805167ffffffffffffffff8116811461147857600080fd5b600060608284031215613c8957600080fd5b6040516060810181811067ffffffffffffffff82111715613cac57613cac61361b565b604052613cb883613c5f565b8152613cc660208401613c5f565b6020820152613cd760408401613be4565b60408201529392505050565b6020815260006138856020830184613a8f565b60008251613d08818460208701613a63565b919091019291505056fea26469706673582212201ff294929b57776d43429e47ba13e7bb550e4a27be6afbadf8c8a0d6ad6324b364736f6c634300080a0033000000000000000000000000000000000000000000000000"; diff --git a/subgraph/abis/Raindex.json b/subgraph/abis/Raindex.json index 6972bfecb9..4be3cfe2a3 100644 --- a/subgraph/abis/Raindex.json +++ b/subgraph/abis/Raindex.json @@ -1593,6 +1593,31 @@ ], "anonymous": false }, + { + "type": "event", + "name": "OrderCalculateReverted", + "inputs": [ + { + "name": "sender", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "owner", + "type": "address", + "indexed": false, + "internalType": "address" + }, + { + "name": "orderHash", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + } + ], + "anonymous": false + }, { "type": "event", "name": "OrderExceedsMaxRatio", diff --git a/subgraph/generated/Raindex/Raindex.ts b/subgraph/generated/Raindex/Raindex.ts index d47fc40b23..b4bd2d1d3f 100644 --- a/subgraph/generated/Raindex/Raindex.ts +++ b/subgraph/generated/Raindex/Raindex.ts @@ -388,6 +388,32 @@ export class MetaV1_2__Params { } } +export class OrderCalculateReverted extends ethereum.Event { + get params(): OrderCalculateReverted__Params { + return new OrderCalculateReverted__Params(this); + } +} + +export class OrderCalculateReverted__Params { + _event: OrderCalculateReverted; + + constructor(event: OrderCalculateReverted) { + this._event = event; + } + + get sender(): Address { + return this._event.parameters[0].value.toAddress(); + } + + get owner(): Address { + return this._event.parameters[1].value.toAddress(); + } + + get orderHash(): Bytes { + return this._event.parameters[2].value.toBytes(); + } +} + export class OrderExceedsMaxRatio extends ethereum.Event { get params(): OrderExceedsMaxRatio__Params { return new OrderExceedsMaxRatio__Params(this); diff --git a/test/concrete/raindex/RaindexV6.clear.calculateRevert.t.sol b/test/concrete/raindex/RaindexV6.clear.calculateRevert.t.sol new file mode 100644 index 0000000000..7da605ccdb --- /dev/null +++ b/test/concrete/raindex/RaindexV6.clear.calculateRevert.t.sol @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {RaindexV6FreshTakeOrderTest} from "test/util/abstract/RaindexV6FreshTakeOrderTest.sol"; +import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; +import {OrderV4, ClearConfigV2, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + +/// A clear cannot drop one side, so a reverting calculate eval reverts +/// `clear3` with the eval's own revert data. +contract RaindexV6ClearCalculateRevertTest is RaindexV6FreshTakeOrderTest { + address internal alice = address(uint160(uint256(keccak256("alice.rain.test")))); + address internal bob = address(uint160(uint256(keccak256("bob.rain.test")))); + + function checkClearReverts(bytes memory aliceExpression, bytes memory bobExpression, bytes memory err) internal { + OrderV4 memory aliceOrder = LibTestTakeOrder.addOrderWithExpression( + vm, alice, aliceExpression, address(iToken0), bytes32(uint256(1)), address(iToken1), bytes32(uint256(1)) + ); + OrderV4 memory bobOrder = LibTestTakeOrder.addOrderWithExpression( + vm, bob, bobExpression, address(iToken1), bytes32(uint256(1)), address(iToken0), bytes32(uint256(1)) + ); + + vm.expectRevert(err); + iRaindex.clear3( + aliceOrder, bobOrder, ClearConfigV2(0, 0, 0, 0, 0, 0), new SignedContextV1[](0), new SignedContextV1[](0) + ); + } + + function testClearAliceCalculateRevertReverts() external { + checkClearReverts(":ensure(0 \"alice calc\"),_ _:1 1;:;", "_ _:1 1;:;", "alice calc"); + } + + function testClearBobCalculateRevertReverts() external { + checkClearReverts("_ _:1 1;:;", ":ensure(0 \"bob calc\"),_ _:1 1;:;", "bob calc"); + } +} diff --git a/test/concrete/raindex/RaindexV6.quote.calculateRevert.t.sol b/test/concrete/raindex/RaindexV6.quote.calculateRevert.t.sol new file mode 100644 index 0000000000..dc71807718 --- /dev/null +++ b/test/concrete/raindex/RaindexV6.quote.calculateRevert.t.sol @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {RaindexV6FreshTakeOrderTest} from "test/util/abstract/RaindexV6FreshTakeOrderTest.sol"; +import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; +import {OrderV4, QuoteV2, SignedContextV1} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; + +/// `quote2` surfaces a reverting calculate eval as the eval's own revert data. +contract RaindexV6QuoteCalculateRevertTest is RaindexV6FreshTakeOrderTest { + function testQuoteCalculateRevertReverts() external { + OrderV4 memory order = LibTestTakeOrder.addOrderWithExpression( + vm, + address(uint160(uint256(keccak256("alice.rain.test")))), + ":ensure(0 \"calc\"),_ _:1 1;:;", + address(iToken0), + bytes32(uint256(1)), + address(iToken1), + bytes32(uint256(1)) + ); + + vm.expectRevert(bytes("calc")); + iRaindex.quote2(QuoteV2(order, 0, 0, new SignedContextV1[](0))); + } +} diff --git a/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol index b7e05dad3a..7de4a9b454 100644 --- a/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol +++ b/test/concrete/raindex/RaindexV6.takeOrder.badStack.t.sol @@ -2,20 +2,20 @@ // SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd pragma solidity =0.8.25; -import {RaindexV6ExternalRealTest} from "test/util/abstract/RaindexV6ExternalRealTest.sol"; +import {RaindexV6FreshTakeOrderTest} from "test/util/abstract/RaindexV6FreshTakeOrderTest.sol"; import {LibTestAddOrder} from "test/util/lib/LibTestAddOrder.sol"; import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; import {OrderConfigV4, OrderV4, TaskV2, TakeOrdersConfigV5} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; -import {UnsupportedCalculateOutputs} from "../../../src/error/ErrRaindexV6.sol"; - -contract RaindexV6TakeOrderBadStackTest is RaindexV6ExternalRealTest { - function checkBadStack( - address alice, - address bob, - OrderConfigV4 memory config, - bytes memory rainString, - uint256 badStackHeight - ) internal { +import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; +import {LibOrder} from "../../../src/lib/LibOrder.sol"; +import {Vm} from "forge-std-1.17.0/src/Test.sol"; + +contract RaindexV6TakeOrderBadStackTest is RaindexV6FreshTakeOrderTest { + using LibDecimalFloat for Float; + + function checkBadStackSkips(address alice, address bob, OrderConfigV4 memory config, bytes memory rainString) + internal + { LibTestAddOrder.conformConfig(config, iInterpreter, iStore); config.evaluable.bytecode = iParserV2.parse2(rainString); @@ -30,18 +30,30 @@ contract RaindexV6TakeOrderBadStackTest is RaindexV6ExternalRealTest { vm.prank(alice); iRaindex.addOrder4(config, new TaskV2[](0)); + vm.recordLogs(); vm.prank(bob); - vm.expectRevert(abi.encodeWithSelector(UnsupportedCalculateOutputs.selector, badStackHeight)); - iRaindex.takeOrders4(takeOrdersConfig); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeOrdersConfig); + assertTrue(totalTakerInput.isZero(), "totalTakerInput"); + assertTrue(totalTakerOutput.isZero(), "totalTakerOutput"); + + Vm.Log[] memory logs = vm.getRecordedLogs(); + assertEq(logs.length, 1, "only OrderCalculateReverted emitted"); + assertEq(logs[0].emitter, address(iRaindex), "emitter"); + assertEq( + logs[0].topics[0], + keccak256("OrderCalculateReverted(address,address,bytes32)"), + "event is OrderCalculateReverted" + ); + assertEq(logs[0].data, abi.encode(bob, alice, LibOrder.hash(order)), "event data"); } /// forge-config: default.fuzz.runs = 100 - function testTakeOrderBadStackEmptyStack(address alice, address bob, OrderConfigV4 memory config) external { - checkBadStack(alice, bob, config, ":;:;", 0); + function testTakeOrderEmptyCalculateStackSkips(address alice, address bob, OrderConfigV4 memory config) external { + checkBadStackSkips(alice, bob, config, ":;:;"); } /// forge-config: default.fuzz.runs = 100 - function testTakeOrderBadStackOneStack(address alice, address bob, OrderConfigV4 memory config) external { - checkBadStack(alice, bob, config, "_:1;:;", 1); + function testTakeOrderOneItemCalculateStackSkips(address alice, address bob, OrderConfigV4 memory config) external { + checkBadStackSkips(alice, bob, config, "_:1;:;"); } } diff --git a/test/concrete/raindex/RaindexV6.takeOrder.calculateRevert.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.calculateRevert.t.sol new file mode 100644 index 0000000000..795a2422e2 --- /dev/null +++ b/test/concrete/raindex/RaindexV6.takeOrder.calculateRevert.t.sol @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; +import {RaindexV6FreshTakeOrderTest} from "test/util/abstract/RaindexV6FreshTakeOrderTest.sol"; +import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; +import { + OrderV4, + TakeOrderConfigV4, + TakeOrdersConfigV5, + TaskV2, + SignedContextV1 +} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; +import {LibNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; +import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {LibOrder} from "../../../src/lib/LibOrder.sol"; +import {Vm} from "forge-std-1.17.0/src/Test.sol"; + +/// A `takeOrders4` order whose calculate eval reverts, or returns too short a +/// stack, is skipped with `OrderCalculateReverted` and makes no state change; +/// later orders still take, and handle-IO reverts still revert the batch. +contract RaindexV6TakeOrderCalculateRevertTest is RaindexV6FreshTakeOrderTest { + using LibDecimalFloat for Float; + + address internal alice = address(uint160(uint256(keccak256("alice.rain.test")))); + address internal bob = address(uint160(uint256(keccak256("bob.rain.test")))); + + bytes32 internal constant VAULT_ID = bytes32(uint256(0x01)); + + function addOrder(bytes memory expression) internal returns (OrderV4 memory) { + return LibTestTakeOrder.addOrderWithExpression( + vm, alice, expression, address(iToken0), VAULT_ID, address(iToken1), VAULT_ID + ); + } + + function depositOutput() internal { + vm.mockCall( + address(iToken1), + abi.encodeWithSelector(IERC20.transferFrom.selector, alice, address(iRaindex)), + abi.encode(true) + ); + vm.prank(alice); + iRaindex.deposit4(address(iToken1), VAULT_ID, LibDecimalFloat.packLossless(10, 0), new TaskV2[](0)); + } + + function mockTakerTransfers() internal { + vm.mockCall( + address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector, bob, uint256(1e18)), abi.encode(true) + ); + vm.mockCall( + address(iToken0), + abi.encodeWithSelector(IERC20.transferFrom.selector, bob, address(iRaindex), uint256(1e18)), + abi.encode(true) + ); + } + + function takeConfig(OrderV4 memory first, OrderV4 memory second) internal pure returns (TakeOrdersConfigV5 memory) { + TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](2); + orders[0] = TakeOrderConfigV4(first, 0, 0, new SignedContextV1[](0)); + orders[1] = TakeOrderConfigV4(second, 0, 0, new SignedContextV1[](0)); + return LibTestTakeOrder.defaultTakeConfig(orders); + } + + function checkSkippedThenTaken(bytes memory skippedExpression) internal { + depositOutput(); + mockTakerTransfers(); + OrderV4 memory skipped = addOrder(skippedExpression); + OrderV4 memory taken = addOrder("_ _:1 1;:;"); + + vm.recordLogs(); + vm.prank(bob); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(takeConfig(skipped, taken)); + + Vm.Log[] memory logs = vm.getRecordedLogs(); + uint256 found; + for (uint256 i = 0; i < logs.length; i++) { + if (logs[i].topics[0] == keccak256("OrderCalculateReverted(address,address,bytes32)")) { + assertEq(logs[i].emitter, address(iRaindex), "emitter"); + assertEq(logs[i].data, abi.encode(bob, alice, LibOrder.hash(skipped)), "event data"); + found++; + } + } + assertEq(found, 1, "one OrderCalculateReverted"); + + assertTrue(totalTakerInput.eq(LibDecimalFloat.packLossless(1, 0)), "totalTakerInput"); + assertTrue(totalTakerOutput.eq(LibDecimalFloat.packLossless(1, 0)), "totalTakerOutput"); + assertTrue( + iRaindex.vaultBalance2(alice, address(iToken1), VAULT_ID).eq(LibDecimalFloat.packLossless(9, 0)), + "alice output vault" + ); + assertTrue( + iRaindex.vaultBalance2(alice, address(iToken0), VAULT_ID).eq(LibDecimalFloat.packLossless(1, 0)), + "alice input vault" + ); + } + + function testCalculateRevertSkipsOrderAndLaterOrderTakes() external { + checkSkippedThenTaken(":ensure(0 \"calc\"),_ _:1 1;:;"); + } + + function testShortCalculateStackSkipsOrderAndLaterOrderTakes() external { + checkSkippedThenTaken("_:1;:;"); + } + + function testSkippedCalculateWritesNothingToStore() external { + checkSkippedThenTaken(":set(0x07 0x09);:;"); + assertEq( + iStore.get( + LibNamespace.qualifyNamespace(StateNamespace.wrap(uint256(uint160(alice))), address(iRaindex)), + bytes32(uint256(7)) + ), + bytes32(0) + ); + } + + function testTakenCalculateWritesReachStore() external { + depositOutput(); + mockTakerTransfers(); + OrderV4 memory order = addOrder("_ _:1 1,:set(0x07 0x09);:;"); + + vm.prank(bob); + iRaindex.takeOrders4(LibTestTakeOrder.defaultTakeConfig(LibTestTakeOrder.wrapSingle(order))); + + assertEq( + iStore.get( + LibNamespace.qualifyNamespace(StateNamespace.wrap(uint256(uint160(alice))), address(iRaindex)), + bytes32(uint256(7)) + ), + bytes32(uint256(9)) + ); + } + + function testHandleIORevertAfterSkippedCalculateRevertsBatch() external { + depositOutput(); + mockTakerTransfers(); + OrderV4 memory skipped = addOrder(":ensure(0 \"calc\"),_ _:1 1;:;"); + OrderV4 memory reverting = addOrder("_ _:1 1;:ensure(0 \"handle\");"); + + vm.prank(bob); + vm.expectRevert(bytes("handle")); + iRaindex.takeOrders4(takeConfig(skipped, reverting)); + } +} diff --git a/test/concrete/raindex/RaindexV6.takeOrder.skippedOrder.t.sol b/test/concrete/raindex/RaindexV6.takeOrder.skippedOrder.t.sol new file mode 100644 index 0000000000..1a8cd3c380 --- /dev/null +++ b/test/concrete/raindex/RaindexV6.takeOrder.skippedOrder.t.sol @@ -0,0 +1,259 @@ +// SPDX-License-Identifier: LicenseRef-DCL-1.0 +// SPDX-FileCopyrightText: Copyright (c) 2020 Rain Open Source Software Ltd +pragma solidity =0.8.25; + +import {IERC20} from "@openzeppelin-contracts-5.7.0/token/ERC20/IERC20.sol"; +import {SafeCast} from "@openzeppelin-contracts-5.7.0/utils/math/SafeCast.sol"; +import {RaindexV6FreshTakeOrderTest} from "test/util/abstract/RaindexV6FreshTakeOrderTest.sol"; +import {LibTestTakeOrder} from "test/util/lib/LibTestTakeOrder.sol"; +import { + IRaindexV6, + OrderV4, + TakeOrderConfigV4, + TakeOrdersConfigV5, + TaskV2, + SignedContextV1 +} from "raindex-interface-0.1.8/src/interface/IRaindexV6.sol"; +import {Float, LibDecimalFloat} from "rain-math-float-0.3.10/src/lib/LibDecimalFloat.sol"; +import {LibNamespace} from "rainlang-interface-0.2.13/src/lib/ns/LibNamespace.sol"; +import {StateNamespace} from "rainlang-interface-0.2.13/src/interface/IInterpreterV4.sol"; +import {LibOrder} from "../../../src/lib/LibOrder.sol"; +import {Vm} from "forge-std-1.17.0/src/Test.sol"; + +/// A `takeOrders4` order skipped for any reason, at any position in the batch, +/// never runs its handle-io and never moves its vaults, while every taken order +/// in the same batch still runs its handle-io. +contract RaindexV6TakeOrderSkippedOrderTest is RaindexV6FreshTakeOrderTest { + using LibDecimalFloat for Float; + + uint8 internal constant TAKEN = 0; + uint8 internal constant CALCULATE_REVERT = 1; + uint8 internal constant SHORT_STACK = 2; + uint8 internal constant EXCEEDS_MAX_RATIO = 3; + uint8 internal constant ZERO_AMOUNT = 4; + uint8 internal constant NOT_FOUND = 5; + uint8 internal constant KIND_COUNT = 6; + + address internal alice = address(uint160(uint256(keccak256("alice.rain.test")))); + address internal bob = address(uint160(uint256(keccak256("bob.rain.test")))); + + function vaultId(uint256 i) internal pure returns (bytes32) { + return bytes32(i + 1); + } + + function takenKey(uint256 i) internal pure returns (bytes32) { + return bytes32(0x100 + i); + } + + function skippedKey(uint256 i) internal pure returns (bytes32) { + return bytes32(0x200 + i); + } + + function aliceStore(bytes32 key) internal view returns (bytes32) { + return + iStore.get( + LibNamespace.qualifyNamespace(StateNamespace.wrap(uint256(uint160(alice))), address(iRaindex)), key + ); + } + + function setHandle(bytes32 key) internal pure returns (bytes memory) { + return bytes(string.concat(":set(", vm.toString(key), " 0x01);")); + } + + function expression(uint8 kind, uint256 i, bool ensureHandle) internal pure returns (bytes memory) { + if (kind == TAKEN) { + return bytes.concat("_ _:1 1;", setHandle(takenKey(i))); + } + bytes memory handle = ensureHandle ? bytes(":ensure(0 \"handle ran\");") : setHandle(skippedKey(i)); + if (kind == CALCULATE_REVERT) { + return bytes.concat(":ensure(0 \"calc\"),_ _:1 1;", handle); + } else if (kind == SHORT_STACK) { + return bytes.concat("_:1;", handle); + } else if (kind == EXCEEDS_MAX_RATIO) { + return bytes.concat("_ _:1 2;", handle); + } else if (kind == ZERO_AMOUNT) { + return bytes.concat("_ _:0 1;", handle); + } else { + return bytes.concat("_ _:1 1;", handle); + } + } + + function skipEvent(uint8 kind) internal pure returns (bytes32) { + if (kind == CALCULATE_REVERT || kind == SHORT_STACK) { + return keccak256("OrderCalculateReverted(address,address,bytes32)"); + } else if (kind == EXCEEDS_MAX_RATIO) { + return IRaindexV6.OrderExceedsMaxRatio.selector; + } else if (kind == ZERO_AMOUNT) { + return IRaindexV6.OrderZeroAmount.selector; + } else { + return IRaindexV6.OrderNotFound.selector; + } + } + + function isSkipEvent(bytes32 topic) internal pure returns (bool) { + return topic == keccak256("OrderCalculateReverted(address,address,bytes32)") + || topic == IRaindexV6.OrderExceedsMaxRatio.selector || topic == IRaindexV6.OrderZeroAmount.selector + || topic == IRaindexV6.OrderNotFound.selector; + } + + function mockTokens() internal { + vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); + vm.mockCall(address(iToken0), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transfer.selector), abi.encode(true)); + vm.mockCall(address(iToken1), abi.encodeWithSelector(IERC20.transferFrom.selector), abi.encode(true)); + } + + function addOrders(uint8[] memory kinds, bool ensureHandle) internal returns (TakeOrderConfigV4[] memory) { + TakeOrderConfigV4[] memory orders = new TakeOrderConfigV4[](kinds.length); + for (uint256 i = 0; i < kinds.length; i++) { + vm.prank(alice); + iRaindex.deposit4(address(iToken1), vaultId(i), LibDecimalFloat.packLossless(10, 0), new TaskV2[](0)); + OrderV4 memory order = LibTestTakeOrder.addOrderWithExpression( + vm, + alice, + expression(kinds[i], i, ensureHandle), + address(iToken0), + vaultId(i), + address(iToken1), + vaultId(i) + ); + if (kinds[i] == NOT_FOUND) { + vm.prank(alice); + iRaindex.removeOrder3(order, new TaskV2[](0)); + } + orders[i] = TakeOrderConfigV4(order, 0, 0, new SignedContextV1[](0)); + } + return orders; + } + + function countLogs(Vm.Log[] memory logs, bytes32 topic, bytes memory data) internal view returns (uint256) { + uint256 found; + for (uint256 j = 0; j < logs.length; j++) { + if ( + logs[j].emitter == address(iRaindex) && logs[j].topics[0] == topic + && keccak256(logs[j].data) == keccak256(data) + ) { + found++; + } + } + return found; + } + + function checkBatch(uint8[] memory kinds, bool ensureHandle) internal { + mockTokens(); + TakeOrderConfigV4[] memory orders = addOrders(kinds, ensureHandle); + TakeOrdersConfigV5 memory config = LibTestTakeOrder.defaultTakeConfig(orders); + config.maximumIORatio = LibDecimalFloat.packLossless(15, -1); + + vm.recordLogs(); + vm.prank(bob); + (Float totalTakerInput, Float totalTakerOutput) = iRaindex.takeOrders4(config); + Vm.Log[] memory logs = vm.getRecordedLogs(); + + uint256 takenCount; + for (uint256 i = 0; i < kinds.length; i++) { + checkOrder(kinds[i], i, orders[i].order, logs); + if (kinds[i] == TAKEN) { + takenCount++; + } + } + + uint256 skipEvents; + for (uint256 j = 0; j < logs.length; j++) { + if (logs[j].emitter == address(iRaindex) && isSkipEvent(logs[j].topics[0])) { + skipEvents++; + } + } + assertEq(skipEvents, kinds.length - takenCount, "skip event count"); + + Float expected = LibDecimalFloat.packLossless(SafeCast.toInt256(takenCount), 0); + assertTrue(totalTakerInput.eq(expected), "totalTakerInput"); + assertTrue(totalTakerOutput.eq(expected), "totalTakerOutput"); + } + + function checkOrder(uint8 kind, uint256 i, OrderV4 memory order, Vm.Log[] memory logs) internal view { + Float output = iRaindex.vaultBalance2(alice, address(iToken1), vaultId(i)); + Float input = iRaindex.vaultBalance2(alice, address(iToken0), vaultId(i)); + if (kind == TAKEN) { + assertTrue(output.eq(LibDecimalFloat.packLossless(9, 0)), "taken output vault"); + assertTrue(input.eq(LibDecimalFloat.packLossless(1, 0)), "taken input vault"); + assertEq(aliceStore(takenKey(i)), bytes32(uint256(1)), "taken handle-io set"); + } else { + assertTrue(output.eq(LibDecimalFloat.packLossless(10, 0)), "skipped output vault"); + assertTrue(input.isZero(), "skipped input vault"); + assertEq(aliceStore(skippedKey(i)), bytes32(0), "skipped handle-io set"); + assertEq( + countLogs(logs, skipEvent(kind), abi.encode(bob, alice, LibOrder.hash(order))), 1, "one skip event" + ); + } + } + + function checkBothHandles(uint8[] memory kinds) internal { + uint256 snapshot = vm.snapshotState(); + checkBatch(kinds, true); + vm.revertToState(snapshot); + checkBatch(kinds, false); + } + + function checkEveryPosition(uint8 kind) internal { + for (uint256 position = 0; position < 3; position++) { + uint8[] memory kinds = new uint8[](3); + kinds[position] = kind; + uint256 snapshot = vm.snapshotState(); + checkBothHandles(kinds); + vm.revertToState(snapshot); + } + } + + function testCalculateRevertSkippedAtAnyPositionRunsNoHandleIO() external { + checkEveryPosition(CALCULATE_REVERT); + } + + function testShortStackSkippedAtAnyPositionRunsNoHandleIO() external { + checkEveryPosition(SHORT_STACK); + } + + function testExceedsMaxRatioSkippedAtAnyPositionRunsNoHandleIO() external { + checkEveryPosition(EXCEEDS_MAX_RATIO); + } + + function testZeroAmountSkippedAtAnyPositionRunsNoHandleIO() external { + checkEveryPosition(ZERO_AMOUNT); + } + + function testNotFoundSkippedAtAnyPositionRunsNoHandleIO() external { + checkEveryPosition(NOT_FOUND); + } + + function testEverySkipCauseInOneBatchRunsNoHandleIO() external { + uint8[] memory kinds = new uint8[](8); + kinds[0] = CALCULATE_REVERT; + kinds[1] = TAKEN; + kinds[2] = SHORT_STACK; + kinds[3] = EXCEEDS_MAX_RATIO; + kinds[4] = TAKEN; + kinds[5] = ZERO_AMOUNT; + kinds[6] = NOT_FOUND; + kinds[7] = CALCULATE_REVERT; + checkBothHandles(kinds); + } + + function testAllSkippedBatchRunsNoHandleIO() external { + uint8[] memory kinds = new uint8[](5); + kinds[0] = CALCULATE_REVERT; + kinds[1] = SHORT_STACK; + kinds[2] = EXCEEDS_MAX_RATIO; + kinds[3] = ZERO_AMOUNT; + kinds[4] = NOT_FOUND; + checkBothHandles(kinds); + } + + function testFuzzSkippedOrdersRunNoHandleIO(uint256 length, uint256 seed, bool ensureHandle) external { + length = bound(length, 1, 6); + uint8[] memory kinds = new uint8[](length); + for (uint256 i = 0; i < length; i++) { + kinds[i] = uint8(uint256(keccak256(abi.encode(seed, i))) % KIND_COUNT); + } + checkBatch(kinds, ensureHandle); + } +} diff --git a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol index 64b2bc5bef..36fddf3f46 100644 --- a/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol +++ b/test/util/concrete/RaindexV6CalculateOrderIOHarness.sol @@ -23,7 +23,10 @@ contract RaindexV6CalculateOrderIOHarness is RaindexV6, IRaindexV6CalculateOrder address counterparty, SignedContextV1[] memory signedContext ) external view returns (OrderIOCalculationV4 memory) { - return calculateOrderIO(order, inputIOIndex, outputIOIndex, counterparty, signedContext, new bytes32[](0)); + (, OrderIOCalculationV4 memory orderIOCalculation) = calculateOrderIO( + order, inputIOIndex, outputIOIndex, counterparty, signedContext, new bytes32[](0), false + ); + return orderIOCalculation; } /// Persist the token's decimals into the TOFU store via the mutating read,