{"matchId":"28724044","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-05-09T11:49:41Z","creationBytecode":{"onchainBytecode":"0x60806040523461002757610011610036565b61001961002c565b615a6661030e8239615a6690f35b610032565b60405190565b5f80fd5b61003e610040565b565b6100486100de565b6100506101e4565b565b90565b90565b90565b61006f61006a61007492610052565b610058565b610055565b90565b610081600161005b565b90565b5f1b90565b906100955f1991610084565b9181191691161790565b6100b36100ae6100b892610055565b610058565b610055565b90565b90565b906100d36100ce6100da9261009f565b6100bb565b8254610089565b9055565b6100f86100e9610077565b680100000000000000006100be565b565b60401c90565b60ff1690565b610112610117916100fa565b610100565b90565b6101249054610106565b90565b5f0190565b5f1c90565b60018060401b031690565b61014861014d9161012c565b610131565b90565b61015a905461013c565b90565b60018060401b031690565b9061017960018060401b0391610084565b9181191691161790565b61019761019261019c9261015d565b610058565b61015d565b90565b90565b906101b76101b26101be92610183565b61019f565b8254610168565b9055565b6101cb9061015d565b9052565b91906101e2905f602085019401906101c2565b565b6101ec61029c565b6101f75f820161011a565b610280576102065f8201610150565b61021e61021860018060401b0361015d565b9161015d565b03610227575b50565b61023a905f60018060401b0391016101a2565b60018060401b036102777fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29161026e61002c565b918291826101cf565b0390a15f610224565b5f63f92ee8a960e01b81528061029860048201610127565b0390fd5b6102a46102f9565b90565b5f90565b90565b90565b6102c56102c06102ca926102ab565b610084565b6102ae565b90565b6102f67ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102b1565b90565b6103016102a7565b5061030a6102cd565b9056fe60806040526004361015610013575b6115e9565b61001d5f3561029c565b8063011e1167146102975780631710abaa14610292578063187ac4cb1461028d5780631dbd1da7146102885780631f0e8a12146102835780631f7daf0f1461027e57806330eff5dd1461027957806333eeb1471461027457806334759ca71461026f578063429a82081461026a578063439fab9114610265578063441a3e701461026057806346a577ed1461025b5780634780404d1461025657806354f3ea7f14610251578063556cf28b1461024c578063582b9044146102475780635837397114610242578063701f9fae1461023d5780637feaf0571461023857806386aeb4451461023357806387ec36e31461022e578063988760b0146102295780639a0fa042146102245780639cec9aaa1461021f578063b8ad077d1461021a578063b937f8f714610215578063bea8418714610210578063ccefe7b01461020b578063dd7202d814610206578063e2d8efd014610201578063e6fb8119146101fc578063e8a91f30146101f7578063e9f5a4a8146101f2578063ec3161b0146101ed578063ed3914d4146101e8578063ee4d01bf146101e3578063f405f17a146101de578063f637d950146101d95763ffa1ad740361000e576115b4565b61143c565b61139c565b61134a565b6112da565b611268565b611233565b6111ef565b611197565b61113f565b6110b4565b61107f565b610ff2565b610f48565b610edb565b610e83565b610df8565b610da0565b610d3c565b610d08565b610c8d565b610c54565b610baa565b610b52565b610ae2565b610a57565b61098c565b610919565b610890565b61082f565b610774565b610704565b610679565b61061d565b610592565b61053a565b6104e2565b610468565b6103ef565b61033f565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f9103126102ba57565b6102ac565b90565b60018060a01b031690565b90565b6102e46102df6102e9926102bf565b6102cd565b6102c2565b90565b6102f5906102d0565b90565b610303610eee6102ec565b90565b61030e6102f8565b90565b61031a906102c2565b90565b61032690610311565b9052565b919061033d905f6020850194019061031d565b565b3461036f5761034f3660046102b0565b61036b61035a610306565b6103626102a2565b9182918261032a565b0390f35b6102a8565b90565b90565b61038e61038961039392610374565b6102cd565b610377565b90565b6103bf7f01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb061037a565b90565b6103ca610396565b90565b6103d690610377565b9052565b91906103ed905f602085019401906103cd565b565b3461041f576103ff3660046102b0565b61041b61040a6103c2565b6104126102a2565b918291826103da565b0390f35b6102a8565b1c90565b60018060a01b031690565b6104439060086104489302610424565b610428565b90565b906104569154610433565b90565b61046560275f9061044b565b90565b34610498576104783660046102b0565b610494610483610459565b61048b6102a2565b9182918261032a565b0390f35b6102a8565b5f80fd5b6104aa81610377565b036104b157565b5f80fd5b905035906104c2826104a1565b565b906020828203126104dd576104da915f016104b5565b90565b6102ac565b346105125761050e6104fd6104f83660046104c4565b6116c1565b6105056102a2565b9182918261032a565b0390f35b6102a8565b73ce5a537d4da620de59efa6f74a0a065732600c7190565b610537610517565b90565b3461056a5761054a3660046102b0565b61056661055561052f565b61055d6102a2565b9182918261032a565b0390f35b6102a8565b73941f54cb53dc1478cb126a2ba8a83b2130419db590565b61058f61056f565b90565b346105c2576105a23660046102b0565b6105be6105ad610587565b6105b56102a2565b9182918261032a565b0390f35b6102a8565b90565b6105de6105d96105e3926105c7565b6102cd565b610377565b90565b61060f7f01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df26105ca565b90565b61061a6105e6565b90565b3461064d5761062d3660046102b0565b610649610638610612565b6106406102a2565b918291826103da565b0390f35b6102a8565b151590565b61066090610652565b9052565b9190610677905f60208501940190610657565b565b346106a9576106893660046102b0565b6106a561069461174f565b61069c6102a2565b91829182610664565b0390f35b6102a8565b90565b6106c56106c06106ca926106ae565b6102cd565b610377565b90565b6106f67f0348958c1322d3fc34f89b91b0b6473594725847184ee590e990bb70ef322b166106b1565b90565b6107016106cd565b90565b34610734576107143660046102b0565b61073061071f6106f9565b6107276102a2565b918291826103da565b0390f35b6102a8565b90565b61075061074b61075592610739565b6102cd565b610377565b90565b6107666401c16b450061073c565b90565b610771610758565b90565b346107a4576107843660046102b0565b6107a061078f610769565b6107976102a2565b918291826103da565b0390f35b6102a8565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156107ef5781359167ffffffffffffffff83116107ea5760200192600183028401116107e557565b6107b1565b6107ad565b6107a9565b90602082820312610825575f82013567ffffffffffffffff81116108205761081c92016107b5565b9091565b61049d565b6102ac565b5f0190565b3461085e576108486108423660046107f4565b90611f42565b6108506102a2565b8061085a8161082a565b0390f35b6102a8565b919060408382031261088b578061087f610888925f86016104b5565b936020016104b5565b90565b6102ac565b346108bf576108a96108a3366004610863565b906120ec565b6108b16102a2565b806108bb8161082a565b0390f35b6102a8565b90565b6108db6108d66108e0926108c4565b6102cd565b610377565b90565b61090b7eb59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e49586108c7565b90565b6109166108e3565b90565b34610949576109293660046102b0565b61094561093461090e565b61093c6102a2565b918291826103da565b0390f35b6102a8565b90565b61096561096061096a9261094e565b6102cd565b610377565b90565b61097e6703b2c201ffc2e880610951565b90565b61098961096d565b90565b346109bc5761099c3660046102b0565b6109b86109a7610981565b6109af6102a2565b918291826103da565b0390f35b6102a8565b60018060a01b031690565b6109dc9060086109e19302610424565b6109c1565b90565b906109ef91546109cc565b90565b6109fe60285f906109e4565b90565b610a15610a10610a1a926102c2565b6102cd565b6102c2565b90565b610a2690610a01565b90565b610a3290610a1d565b90565b610a3e90610a29565b9052565b9190610a55905f60208501940190610a35565b565b34610a8757610a673660046102b0565b610a83610a726109f2565b610a7a6102a2565b91829182610a42565b0390f35b6102a8565b90565b610aa3610a9e610aa892610a8c565b6102cd565b610377565b90565b610ad47f07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753610a8f565b90565b610adf610aab565b90565b34610b1257610af23660046102b0565b610b0e610afd610ad7565b610b056102a2565b918291826103da565b0390f35b6102a8565b90565b610b2e610b29610b3392610b17565b6102cd565b610377565b90565b610b44641d1a94a200610b1a565b90565b610b4f610b36565b90565b34610b8257610b623660046102b0565b610b7e610b6d610b47565b610b756102a2565b918291826103da565b0390f35b6102a8565b73216e8577b504ac3db213edd261e47fffbb35424890565b610ba7610b87565b90565b34610bda57610bba3660046102b0565b610bd6610bc5610b9f565b610bcd6102a2565b9182918261032a565b0390f35b6102a8565b909182601f83011215610c195781359167ffffffffffffffff8311610c14576020019260608302840111610c0f57565b6107b1565b6107ad565b6107a9565b90602082820312610c4f575f82013567ffffffffffffffff8111610c4a57610c469201610bdf565b9091565b61049d565b6102ac565b610c68610c62366004610c1e565b90612509565b610c706102a2565b80610c7a8161082a565b0390f35b610c8a60255f9061044b565b90565b34610cbd57610c9d3660046102b0565b610cb9610ca8610c7e565b610cb06102a2565b9182918261032a565b0390f35b6102a8565b919091604081840312610d0357610cdb835f83016104b5565b92602082013567ffffffffffffffff8111610cfe57610cfa92016107b5565b9091565b61049d565b6102ac565b34610d3757610d21610d1b366004610cc2565b91612515565b610d296102a2565b80610d338161082a565b0390f35b6102a8565b610d473660046102b0565b610d4f61267d565b610d576102a2565b80610d618161082a565b0390f35b90565b610d7c610d77610d8192610d65565b6102cd565b610377565b90565b610d926436b7176e00610d68565b90565b610d9d610d84565b90565b34610dd057610db03660046102b0565b610dcc610dbb610d95565b610dc36102a2565b918291826103da565b0390f35b6102a8565b73bc6eeb5111fea2b5e9b2bc534bbcbca9568999a490565b610df5610dd5565b90565b34610e2857610e083660046102b0565b610e24610e13610ded565b610e1b6102a2565b9182918261032a565b0390f35b6102a8565b90565b610e44610e3f610e4992610e2d565b6102cd565b610377565b90565b610e757f07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc610e30565b90565b610e80610e4c565b90565b34610eb357610e933660046102b0565b610eaf610e9e610e78565b610ea66102a2565b918291826103da565b0390f35b6102a8565b73409f85d2207796b543b8abdb6a0e2490bb1483d190565b610ed8610eb8565b90565b34610f0b57610eeb3660046102b0565b610f07610ef6610ed0565b610efe6102a2565b9182918261032a565b0390f35b6102a8565b90565b610f23906008610f289302610424565b610f10565b90565b90610f369154610f13565b90565b610f45600d5f90610f2b565b90565b34610f7857610f583660046102b0565b610f74610f63610f39565b610f6b6102a2565b918291826103da565b0390f35b6102a8565b610f8681610311565b03610f8d57565b5f80fd5b90503590610f9e82610f7d565b565b91606083830312610fed57610fb7825f8501610f91565b92610fc583602083016104b5565b92604082013567ffffffffffffffff8111610fe857610fe492016107b5565b9091565b61049d565b6102ac565b346110245761100e611005366004610fa0565b92919091612b2f565b6110166102a2565b806110208161082a565b0390f35b6102a8565b90565b61104061103b61104592611029565b6102cd565b610377565b90565b6110717f052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b43461102c565b90565b61107c611048565b90565b346110af5761108f3660046102b0565b6110ab61109a611074565b6110a26102a2565b918291826103da565b0390f35b6102a8565b346110e4576110e06110cf6110ca3660046104c4565b612d3a565b6110d76102a2565b918291826103da565b0390f35b6102a8565b90565b6111006110fb611105926110e9565b6102cd565b610377565b90565b6111317f025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca016110ec565b90565b61113c611108565b90565b3461116f5761114f3660046102b0565b61116b61115a611134565b6111626102a2565b918291826103da565b0390f35b6102a8565b7310cbbbb225bbea137ac01f0f6d91cdb126bccaa690565b611194611174565b90565b346111c7576111a73660046102b0565b6111c36111b261118c565b6111ba6102a2565b9182918261032a565b0390f35b6102a8565b735ebb994ebc1c44815fbf2fa61a6e1f8368dcb0c790565b6111ec6111cc565b90565b3461121f576111ff3660046102b0565b61121b61120a6111e4565b6112126102a2565b9182918261032a565b0390f35b6102a8565b61123060265f9061044b565b90565b34611263576112433660046102b0565b61125f61124e611224565b6112566102a2565b9182918261032a565b0390f35b6102a8565b346112995761129561128461127e366004610863565b90612d8e565b61128c6102a2565b918291826103da565b0390f35b6102a8565b90565b6112b56112b06112ba9261129e565b6102cd565b610377565b90565b6112cc650474dec268006112a1565b90565b6112d76112bd565b90565b3461130a576112ea3660046102b0565b6113066112f56112cf565b6112fd6102a2565b918291826103da565b0390f35b6102a8565b90565b61132661132161132b9261130f565b6102cd565b610377565b90565b61133c64590ec6d100611312565b90565b61134761132e565b90565b3461137a5761135a3660046102b0565b61137661136561133f565b61136d6102a2565b918291826103da565b0390f35b6102a8565b61138e650474dec268006112a1565b90565b61139961137f565b90565b346113cc576113ac3660046102b0565b6113c86113b7611391565b6113bf6102a2565b918291826103da565b0390f35b6102a8565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61141261141b60209361142093611409816113d1565b938480936113d5565b958691016113de565b6113e9565b0190565b6114399160208201915f8184039101526113f3565b90565b3461146c576114686114576114523660046104c4565b612f74565b61145f6102a2565b91829182611424565b0390f35b6102a8565b634e487b7160e01b5f52604160045260245ffd5b9061148f906113e9565b810190811067ffffffffffffffff8211176114a957604052565b611471565b906114c16114ba6102a2565b9283611485565b565b67ffffffffffffffff81116114e1576114dd6020916113e9565b0190565b611471565b906114f86114f3836114c3565b6114ae565b918252565b5f7f537461726b45782d494d582d4d6967726174696f6e2d312e302e300000000000910152565b61152e601b6114e6565b9061153b602083016114fd565b565b611545611524565b90565b61155061153d565b90565b61155b611548565b90565b5190565b60209181520190565b61158a611593602093611598936115818161155e565b93848093611562565b958691016113de565b6113e9565b0190565b6115b19160208201915f81840391015261156b565b90565b346115e4576115c43660046102b0565b6115e06115cf611553565b6115d76102a2565b9182918261159c565b0390f35b6102a8565b5f80fd5b5f90565b61160561160061160a92610377565b6102cd565b610377565b90565b90611617906115f1565b5f5260205260405f2090565b5f1c90565b61163461163991611623565b610428565b90565b6116469054611628565b90565b90565b61166061165b61166592611649565b6102cd565b6102c2565b90565b6116719061164c565b90565b90565b61168b61168661169092611674565b6102cd565b610377565b90565b6116a260018060a01b03611677565b90565b6116b96116b46116be92610377565b6102cd565b6102c2565b90565b6116c96115ed565b506116de6116d96018839061160d565b61163c565b806116f96116f36116ee5f611668565b610311565b91610311565b0361174657508061171b6117158361170f611693565b16610377565b91610377565b145f146117375761172e611733916116a5565b610a1d565b5b90565b506117415f611668565b611734565b905090565b5f90565b61175761174b565b505f90565b90565b67ffffffffffffffff1690565b61178061177b6117859261175c565b6102cd565b61175f565b90565b60401c90565b60ff1690565b6117a06117a591611788565b61178e565b90565b6117b29054611794565b90565b67ffffffffffffffff1690565b6117ce6117d391611623565b6117b5565b90565b6117e090546117c2565b90565b5f1b90565b906117fb67ffffffffffffffff916117e3565b9181191691161790565b61181961181461181e9261175f565b6102cd565b61175f565b90565b90565b9061183961183461184092611805565b611821565b82546117e8565b9055565b60401b90565b9061185e68ff000000000000000091611844565b9181191691161790565b61187190610652565b90565b90565b9061188c61188761189392611868565b611874565b825461184a565b9055565b6118a09061175f565b9052565b91906118b7905f60208501940190611897565b565b906118c4600261176c565b916118cd612faf565b906118d95f83016117a8565b801561196a575b61194e576119139261190a916118f8865f8601611824565b61190560015f8601611877565b611a98565b5f809101611877565b6119497fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916119406102a2565b918291826118a4565b0390a1565b5f63f92ee8a960e01b8152806119666004820161082a565b0390fd5b506119765f83016117d6565b6119886119828661175f565b9161175f565b10156118e0565b90611999906115f1565b5f5260205260405f2090565b906119af906115f1565b5f5260205260405f2090565b6119c76119cc91611623565b610f10565b90565b6119d990546119bb565b90565b634e487b7160e01b5f52601160045260245ffd5b6119ff611a0591939293610377565b92610377565b8201809211611a1057565b6119dc565b90611a215f19916117e3565b9181191691161790565b90565b90611a43611a3e611a4a926115f1565b611a2b565b8254611a15565b9055565b90611a5f60018060a01b03916117e3565b9181191691161790565b611a7290610a1d565b90565b90565b90611a8d611a88611a9492611a69565b611a75565b8254611a4e565b9055565b5050611ae1611aa561137f565b611adb611acc611abe6008611ab8610aab565b9061198f565b611ac66106cd565b906119a5565b91611ad6836119cf565b6119f0565b90611a2e565b611b28611aec610b36565b611b22611b13611b056008611aff610396565b9061198f565b611b0d6106cd565b906119a5565b91611b1d836119cf565b6119f0565b90611a2e565b611b6f611b33610758565b611b69611b5a611b4c6008611b46611048565b9061198f565b611b546106cd565b906119a5565b91611b64836119cf565b6119f0565b90611a2e565b611bb6611b7a6112bd565b611bb0611ba1611b936008611b8d610e4c565b9061198f565b611b9b6106cd565b906119a5565b91611bab836119cf565b6119f0565b90611a2e565b611bfd611bc161132e565b611bf7611be8611bda6008611bd46108e3565b9061198f565b611be26106cd565b906119a5565b91611bf2836119cf565b6119f0565b90611a2e565b611c44611c0861096d565b611c3e611c2f611c216008611c1b611108565b9061198f565b611c296106cd565b906119a5565b91611c39836119cf565b6119f0565b90611a2e565b611c8b611c4f610d84565b611c85611c76611c686008611c626105e6565b9061198f565b611c706106cd565b906119a5565b91611c80836119cf565b6119f0565b90611a2e565b611ca6611ca16018611c9b610aab565b9061160d565b61163c565b611cc0611cba611cb55f611668565b610311565b91610311565b14611f1a575b611ce1611cdc6018611cd6610396565b9061160d565b61163c565b611cfb611cf5611cf05f611668565b610311565b91610311565b14611ef2575b611d1c611d176018611d11611048565b9061160d565b61163c565b611d36611d30611d2b5f611668565b610311565b91610311565b14611eca575b611d57611d526018611d4c610e4c565b9061160d565b61163c565b611d71611d6b611d665f611668565b610311565b91610311565b14611ea2575b611d92611d8d6018611d876108e3565b9061160d565b61163c565b611dac611da6611da15f611668565b610311565b91610311565b14611e7a575b611dcd611dc86018611dc2611108565b9061160d565b61163c565b611de7611de1611ddc5f611668565b610311565b91610311565b14611e52575b611e08611e036018611dfd6105e6565b9061160d565b61163c565b611e22611e1c611e175f611668565b610311565b91610311565b14611e2a575b565b611e4d611e35610dd5565b611e486018611e426105e6565b9061160d565b611a78565b611e28565b611e75611e5d61056f565b611e706018611e6a611108565b9061160d565b611a78565b611ded565b611e9d611e85610517565b611e986018611e926108e3565b9061160d565b611a78565b611db2565b611ec5611ead610eb8565b611ec06018611eba610e4c565b9061160d565b611a78565b611d77565b611eed611ed5611174565b611ee86018611ee2611048565b9061160d565b611a78565b611d3c565b611f15611efd610b87565b611f106018611f0a610396565b9061160d565b611a78565b611d01565b611f3d611f256111cc565b611f386018611f32610aab565b9061160d565b611a78565b611cc6565b90611f4c916118b9565b565b611f5790610a01565b90565b611f6390611f4e565b90565b5f7f4e4f4e5f46554e4749424c455f41535345545f54595045000000000000000000910152565b611f9a6017602092611562565b611fa381611f66565b0190565b611fbc9060208101905f818303910152611f8d565b90565b15611fc657565b611fce6102a2565b62461bcd60e51b815280611fe460048201611fa7565b0390fd5b611ffc611ff761200192611649565b6102cd565b610377565b90565b5f7f4e4f5f50454e44494e475f5749544844524157414c0000000000000000000000910152565b6120386015602092611562565b61204181612004565b0190565b61205a9060208101905f81830391015261202b565b90565b1561206457565b61206c6102a2565b62461bcd60e51b81528061208260048201612045565b0390fd5b61208f90610a1d565b90565b61209b90612086565b9052565b909594926120ea946120d96120e3926120cf6080966120c560a088019c5f8901906103cd565b60208701906103cd565b60408501906103cd565b60608301906103cd565b0190612092565b565b906120fe6120f98361303c565b611f5a565b61210f61210a836130e6565b611fbf565b6121c182936121756121356121306121296008859061198f565b88906119a5565b6119cf565b956121528761214c6121465f611fe8565b91610377565b1161205d565b61217061215e5f611fe8565b9161216b6008869061198f565b6119a5565b611a2e565b612181838587916133f4565b9161218d848690613697565b947fb7477a7b93b2addc5272bbd7ad0986ef1c0d0bd265f26c3dc4bbe42727c2ac0c956121b86102a2565b9586958661209f565b0390a1565b906121d8916121d36136df565b612205565b6121e0613754565b565b156121e957565b5f636e7e1ba960e11b8152806122016004820161082a565b0390fd5b906122349161222f3361222961222361221e602761163c565b610311565b91610311565b146121e2565b61230d565b565b5090565b1561224157565b5f635091728960e01b8152806122596004820161082a565b0390fd5b60016122699101610377565b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015612290576060020190565b61226c565b3561229f81610f7d565b90565b356122ac816104a1565b90565b156122b657565b5f63dd3bd7d760e01b8152806122ce6004820161082a565b0390fd5b6122db90610a01565b90565b6122e7906122d2565b90565b156122f157565b5f631733f9d760e01b8152806123096004820161082a565b0390fd5b9061233461231c838390612236565b61232e6123285f611fe8565b91610377565b1161223a565b61233d5f611fe8565b916123475f611fe8565b5b8061236561235f61235a858790612236565b610377565b91610377565b10156124e857612468906123855f61237f85878591612280565b01612295565b61239c602061239686888691612280565b016122a2565b6123c16123b660406123b0888a8891612280565b016122a2565b9291929788906119f0565b966123df886123d86123d234610377565b91610377565b11156122af565b816123f96123f36123ee6102f8565b610311565b91610311565b145f1461246d5761240b915082613a31565b612415602661163c565b339061245f61244d6124477f680cdeb18e0632eaae1727127d3005efb3ea5dba23e34446c9e94cf2cf5f557793611a69565b93611a69565b936124566102a2565b918291826103da565b0390a35b61225d565b612348565b6124839061247a836122de565b90849091613854565b61248d602661163c565b33916124e06124ce6124c86124c27fbaffede578523e7bb616324498f96acc5cd38e6c6168c976d67866fb78ea958d94611a69565b94611a69565b94611a69565b946124d76102a2565b918291826103da565b0390a4612463565b505050612507906125016124fb34610377565b91610377565b146122ea565b565b90612513916121c6565b565b9091612525923392909192612b2f565b565b61252f6136df565b612537612541565b61253f613754565b565b6125663361256061255a612555602761163c565b610311565b91610311565b146121e2565b61256e6125dd565b565b61257c61258191611623565b6109c1565b90565b61258e9054612570565b90565b5f80fd5b60e01b90565b5f9103126125a557565b6102ac565b9160206125cb9294936125c460408201965f8301906103cd565b019061031d565b565b6125d56102a2565b3d5f823e3d90fd5b6125ef6125ea6028612584565b610a29565b63168b5ab73491909190612603600d6119cf565b903393813b15612678575f9361262a9161263561261e6102a2565b97889687958694612595565b8452600484016125aa565b03925af1801561267357612647575b50565b612666905f3d811161266c575b61265e8183611485565b81019061259b565b5f612644565b503d612654565b6125cd565b612591565b612685612527565b565b5f7f494e56414c49445f535441524b5f4b4559000000000000000000000000000000910152565b6126bb6011602092611562565b6126c481612687565b0190565b6126dd9060208101905f8183039101526126ae565b90565b156126e757565b6126ef6102a2565b62461bcd60e51b815280612705600482016126c8565b0390fd5b90565b61272061271b61272592612709565b6102cd565b610377565b90565b61273f600167080000000000001160c01b0161270c565b90565b5f7f494e56414c49445f4554485f4144445245535300000000000000000000000000910152565b6127766013602092611562565b61277f81612742565b0190565b6127989060208101905f818303910152612769565b90565b156127a257565b6127aa6102a2565b62461bcd60e51b8152806127c060048201612783565b0390fd5b5f7f535441524b5f4b45595f554e415641494c41424c450000000000000000000000910152565b6127f86015602092611562565b612801816127c4565b0190565b61281a9060208101905f8183039101526127eb565b90565b1561282457565b61282c6102a2565b62461bcd60e51b81528061284260048201612805565b0390fd5b5090565b90565b61286161285c6128669261284a565b6102cd565b610377565b90565b5f7f494e56414c49445f535441524b5f5349474e41545552455f4c454e4754480000910152565b61289d601e602092611562565b6128a681612869565b0190565b6128bf9060208101905f818303910152612890565b90565b156128c957565b6128d16102a2565b62461bcd60e51b8152806128e7600482016128aa565b0390fd5b5f80fd5b67ffffffffffffffff811161290d576129096020916113e9565b0190565b611471565b90825f939282370152565b9092919261293261292d826128ef565b6114ae565b9381855260208501908284011161294e5761294c92612912565b565b6128eb565b61295e91369161291d565b90565b9050519061296e826104a1565b565b90916060828403126129a5576129a261298b845f8501612961565b936129998160208601612961565b93604001612961565b90565b6102ac565b905090565b5f7f55736572526567697374726174696f6e3a000000000000000000000000000000910152565b6129e2601180926129aa565b6129eb816129af565b0190565b60601b90565b6129fe906129ef565b90565b612a0a906129f5565b90565b612a19612a1e91610311565b612a01565b9052565b90565b612a31612a3691610377565b612a22565b9052565b601460209392612a56612a4f612a5e946129d6565b8092612a0d565b018092612a25565b0190565b60200190565b612a74612a7991611623565b6115f1565b90565b90565b612a93612a8e612a9892612a7c565b6102cd565b610377565b90565b612ac47f0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f612a7f565b90565b634e487b7160e01b5f52601260045260245ffd5b612ae7612aed91610377565b91610377565b908115612af8570690565b612ac7565b604090612b26612b2d9496959396612b1c60608401985f85019061031d565b60208301906103cd565b019061031d565b565b91612c15612c8d9294612c2b92612b5987612b52612b4c5f611fe8565b91610377565b14156126e0565b612b7c87612b76612b70612b6b612728565b610377565b91610377565b106126e0565b612ba186612b9a612b94612b8f5f611668565b610311565b91610311565b141561279b565b612bd8612bb8612bb360188a9061160d565b61163c565b612bd2612bcc612bc75f611668565b610311565b91610311565b1461281d565b612be9612be488613b7a565b6126e0565b612c10612bf7828490612846565b612c0a612c04606061284d565b91610377565b146128c2565b612953565b6020612c20826113d1565b818301019101612970565b90612c84612c7686612c5e8991612c4f612c436102a2565b93849260208401612a3a565b60208201810382520382611485565b612c70612c6a826113d1565b91612a62565b20612a68565b612c7e612a9b565b90612adb565b92869293613fb8565b612ca281612c9d6018859061160d565b611a78565b903391612cdb7fcab1cf17c190e4e2195a7b8f7b362023246fa774390432b4704ab6b29d56b07b93612cd26102a2565b93849384612afd565b0390a1565b5f90565b90612cee906115f1565b5f5260205260405f2090565b612d06612d0b91611623565b61178e565b90565b612d189054612cfa565b90565b90565b612d32612d2d612d3792612d1b565b6102cd565b610377565b90565b612d42612ce0565b50612d60612d5a612d5560158490612ce4565b612d0e565b15610652565b5f14612d755750612d716001612d1e565b905b565b612d83612d889160166119a5565b6119cf565b90612d73565b612db7612db2612dbd93612da0612ce0565b50612dad8194600861198f565b6119a5565b6119cf565b90613697565b90565b606090565b5f7f41535345545f545950455f4e4f545f5245474953544552454400000000000000910152565b612df96019602092611562565b612e0281612dc5565b0190565b612e1b9060208101905f818303910152612dec565b90565b15612e2557565b612e2d6102a2565b62461bcd60e51b815280612e4360048201612e06565b0390fd5b90612e51906115f1565b5f5260205260405f2090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015612e91575b6020831014612e8c57565b612e5d565b91607f1691612e81565b60209181520190565b5f5260205f2090565b905f9291805490612ec7612ec083612e71565b8094612e9b565b916001811690815f14612f1e5750600114612ee2575b505050565b612eef9192939450612ea4565b915f925b818410612f0657505001905f8080612edd565b60018160209295939554848601520191019290612ef3565b92949550505060ff19168252151560200201905f8080612edd565b90612f4391612ead565b90565b90612f66612f5f92612f566102a2565b93848092612f39565b0383611485565b565b612f7190612f46565b90565b612fa7612fac91612f83612dc0565b50612fa0612f9b612f9660158490612ce4565b612d0e565b612e1e565b6014612e47565b612f68565b90565b612fb76142a4565b90565b5f7f555345525f554e52454749535445524544000000000000000000000000000000910152565b612fee6011602092611562565b612ff781612fba565b0190565b6130109060208101905f818303910152612fe1565b90565b1561301a57565b6130226102a2565b62461bcd60e51b81528061303860048201612ffb565b0390fd5b61304e906130486115ed565b506116c1565b906130748261306d6130676130625f611668565b610311565b91610311565b1415613013565b565b63ffffffff60e01b1690565b61308b90613076565b90565b6130b77f8322fff276cdf3f5716784c2e78b276d0d5cf1781fe7a7984e8bff96f75632c6613082565b90565b6130e37ff47261b06eedbfce68afd46d0f3c27c60b03faad319eaf33103611cf8f6456ad613082565b90565b6130f8906130f261174b565b506142bc565b8061311261310c61310761308e565b613076565b91613076565b1490811561311f575b5090565b905061313a61313461312f6130ba565b613076565b91613076565b145f61311b565b5f7f494e56414c49445f524543495049454e54000000000000000000000000000000910152565b6131756011602092611562565b61317e81613141565b0190565b6131979060208101905f818303910152613168565b90565b156131a157565b6131a96102a2565b62461bcd60e51b8152806131bf60048201613182565b0390fd5b5f7f554e535550504f525445445f544f4b454e5f5459504500000000000000000000910152565b6131f76016602092611562565b613200816131c3565b0190565b6132199060208101905f8183039101526131ea565b90565b61322590610a01565b90565b6132319061321c565b90565b61323d90610a1d565b90565b61324990610a1d565b90565b9060208282031261326557613262915f01612961565b90565b6102ac565b63ffffffff1690565b61328761328261328c9261326a565b612595565b613076565b90565b613298906102c2565b90565b6132a49061328f565b9052565b9160206132c99294936132c260408201965f83019061329b565b01906103cd565b565b5f7f554e444552464c4f570000000000000000000000000000000000000000000000910152565b6132ff6009602092611562565b613308816132cb565b0190565b6133219060208101905f8183039101526132f2565b90565b1561332b57565b6133336102a2565b62461bcd60e51b8152806133496004820161330c565b0390fd5b61335c61336291939293610377565b92610377565b820391821161336d57565b6119dc565b5f7f494e434f52524543545f414d4f554e545f5452414e5346455252454400000000910152565b6133a6601c602092611562565b6133af81613372565b0190565b6133c89060208101905f818303910152613399565b90565b156133d257565b6133da6102a2565b62461bcd60e51b8152806133f0600482016133b3565b0390fd5b909161341b8261341461340e6134095f611668565b610311565b91612086565b141561319a565b613426838290613697565b90613430846142d9565b5f146135fd576134486134425f611fe8565b91610377565b146135f85761345961349f93614448565b61346281613228565b602061346d82613234565b6370a082319061349461347f30613240565b926134886102a2565b998a9485938493612595565b83526004830161032a565b03915afa9081156135f35761350460209360046134fe6135099561353b9a5f916135c6575b50986134f06134d663a9059cbb613273565b918a906134e16102a2565b9586948c8601908152016132a8565b888201810382520382611485565b906145da565b613234565b6370a082319061353061351b30613240565b926135246102a2565b97889485938493612595565b83526004830161032a565b03915afa80156135c15761357f61358a9261358492613590965f91613593575b506135798161357261356c89610377565b91610377565b1115613324565b9461334d565b610377565b91610377565b146133cb565b5b565b6135b4915060203d81116135ba575b6135ac8183611485565b81019061324c565b5f61355b565b503d6135a2565b6125cd565b6135e69150883d81116135ec575b6135de8183611485565b81019061324c565b5f6134c4565b503d6135d4565b6125cd565b505050565b90919261360990614308565b5f146136405761362161361b5f611fe8565b91610377565b1461363c5761363261363792612086565b614419565b613591565b5050565b6136486102a2565b62461bcd60e51b81528061365e60048201613204565b0390fd5b61367161367791939293610377565b92610377565b91613683838202610377565b92818404149015171561369257565b6119dc565b906136ad6136b3926136a7612ce0565b50612d3a565b90613662565b90565b6136ca6136c56136cf9261175c565b6102cd565b610377565b90565b6136dc60026136b6565b90565b6136f1680100000000000000006119cf565b61370a6137046136ff6136d2565b610377565b91610377565b1461372b5761372961371a6136d2565b68010000000000000000611a2e565b565b5f633ee5aeb560e01b8152806137436004820161082a565b0390fd5b6137516001612d1e565b90565b61376e61375f613747565b68010000000000000000611a2e565b565b61377990610a1d565b90565b1561378357565b5f63e6c4247b60e01b81528061379b6004820161082a565b0390fd5b156137a657565b5f63162908e360e11b8152806137be6004820161082a565b0390fd5b6137cb90610a1d565b90565b156137d557565b5f6312d5633960e31b8152806137ed6004820161082a565b0390fd5b6137fa90610a01565b90565b613806906137f1565b90565b61381290610a1d565b90565b61381e90613770565b9052565b60409061384b613852949695939661384160608401985f850190613815565b602083019061031d565b01906103cd565b565b91909161388461386382613770565b61387d6138776138725f611668565b610311565b91610311565b141561377c565b6138a08361389a6138945f611fe8565b91610377565b1161379f565b6138e060206138ae83613770565b6370a08231906138d56138c0306137c2565b926138c96102a2565b95869485938493612595565b83526004830161032a565b03915afa8015613a095761390f915f916139db575b5061390861390286610377565b91610377565b10156137ce565b61393461392361391e83613770565b613228565b61392d602561163c565b8591614691565b61394e613949613944602561163c565b6137fd565b613809565b9163f213159c90929092613962602661163c565b9490823b156139d6575f946139936139889361397c6102a2565b98899788968795612595565b855260048501613822565b03925af180156139d1576139a5575b50565b6139c4905f3d81116139ca575b6139bc8183611485565b81019061259b565b5f6139a2565b503d6139b2565b6125cd565b612591565b6139fc915060203d8111613a02575b6139f48183611485565b81019061324c565b5f6138f5565b503d6139ea565b6125cd565b916020613a2f929493613a2860408201965f83019061031d565b01906103cd565b565b90613a4e82613a48613a425f611fe8565b91610377565b1161379f565b613a7e613a5a306137c2565b31613a77613a71613a6c8686906119f0565b610377565b91610377565b10156137ce565b613a98613a93613a8e602561163c565b6137fd565b613809565b91613aa863e041043292826119f0565b92919291613ab6602661163c565b9193813b15613b2a575f93613adc91613ae7613ad06102a2565b97889687958694612595565b845260048401613a0e565b03925af18015613b2557613af9575b50565b613b18905f3d8111613b1e575b613b108183611485565b81019061259b565b5f613af6565b503d613b06565b6125cd565b612591565b90565b613b46613b41613b4b92613b2f565b6102cd565b610377565b90565b613b777f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b613b8261174b565b508081613b8d612728565b918215613bea570981613b9e612728565b918215613be5570990613baf612728565b918215613be05708613bbf613b4e565b613bc7612728565b908115613bdb57613bd8920861476f565b90565b612ac7565b612ac7565b612ac7565b612ac7565b5f7f6d736748617368206f7574206f662072616e6765000000000000000000000000910152565b613c236014602092611562565b613c2c81613bef565b0190565b613c459060208101905f818303910152613c16565b90565b15613c4f57565b613c576102a2565b62461bcd60e51b815280613c6d60048201613c30565b0390fd5b5f7f73206f7574206f662072616e6765000000000000000000000000000000000000910152565b613ca5600e602092611562565b613cae81613c71565b0190565b613cc79060208101905f818303910152613c98565b90565b15613cd157565b613cd96102a2565b62461bcd60e51b815280613cef60048201613cb2565b0390fd5b90565b613d0a613d05613d0f92613cf3565b6102cd565b610377565b90565b613d1c60fb613cf6565b90565b1b90565b613d4290613d3c613d36613d4794610377565b91610377565b90613d1f565b610377565b90565b5f7f72206f7574206f662072616e6765000000000000000000000000000000000000910152565b613d7e600e602092611562565b613d8781613d4a565b0190565b613da09060208101905f818303910152613d71565b90565b15613daa57565b613db26102a2565b62461bcd60e51b815280613dc860048201613d8b565b0390fd5b5f7f77206f7574206f662072616e6765000000000000000000000000000000000000910152565b613e00600e602092611562565b613e0981613dcc565b0190565b613e229060208101905f818303910152613df3565b90565b15613e2c57565b613e346102a2565b62461bcd60e51b815280613e4a60048201613e0d565b0390fd5b613e65600167080000000000001160c01b0161270c565b90565b613e917f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b90565b613eab613ea6613eb092613e94565b6102cd565b610377565b90565b613edc7f01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca613e97565b90565b90565b613ef6613ef1613efb92613edf565b6102cd565b610377565b90565b613f267e5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f613ee2565b90565b613f336001612d1e565b90565b5f7f494e56414c49445f535441524b5f5349474e4154555245000000000000000000910152565b613f6a6017602092611562565b613f7381613f36565b0190565b613f8c9060208101905f818303910152613f5d565b90565b15613f9657565b613f9e6102a2565b62461bcd60e51b815280613fb460048201613f77565b0390fd5b90929161401f90613fec613fd484613fce612a9b565b90612adb565b613fe6613fe086610377565b91610377565b14613c48565b6001614000613ffa83610377565b91612d1e565b11158061422c575b61401190613cca565b614019612a9b565b90614849565b91600161403461402e86610377565b91612d1e565b1115806141f3575b61404590613da3565b600161405961405385610377565b91612d1e565b1115806141ba575b61406a90613e25565b8081614074613e4e565b9182156141b5570981614085613e4e565b9182156141b05709928586614098613e4e565b9182156141ab570993826140aa613e4e565b9182156141a65708936140bb613e68565b966140c4613e4e565b9384156141a15761415861413a61419397614101614175966140fb6140f561419f9f9b61418c9c6141999f08610377565b91610377565b146126e0565b614109612ce0565b50614112612ce0565b5061411b613eb3565b614123613efe565b61412b613f29565b91614134613e4e565b9361494c565b929092938a9190614149613f29565b91614152613e4e565b9361494c565b919091909291614166613f29565b9261416f613e4e565b94614993565b61417d613f29565b91614186613e4e565b9361494c565b5092610377565b91610377565b14613f8f565b565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b5061406a836141eb6141e56141e060016141db6141d5613d12565b91612d1e565b613d23565b610377565b91610377565b109050614061565b506140458461422461421e614219600161421461420e613d12565b91612d1e565b613d23565b610377565b91610377565b10905061403c565b506140118161424a61424461423f612a9b565b610377565b91610377565b109050614008565b5f90565b90565b90565b61427061426b61427592614256565b6117e3565b614259565b90565b6142a17ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061425c565b90565b6142ac614252565b506142b5614278565b90565b5f90565b6142d16142d6916142cb6142b8565b50612f74565b614a91565b90565b6142eb906142e561174b565b506142bc565b6143046142fe6142f96130ba565b613076565b91613076565b1490565b61431a9061431461174b565b506142bc565b61433361432d61432861308e565b613076565b91613076565b1490565b905090565b6143475f8092614337565b0190565b6143549061433c565b90565b90614369614364836128ef565b6114ae565b918252565b3d5f146143895761437e3d614357565b903d5f602084013e5b565b614391612dc0565b90614387565b5f7f4554485f5452414e534645525f4641494c454400000000000000000000000000910152565b6143cb6013602092611562565b6143d481614397565b0190565b6143ed9060208101905f8183039101526143be565b90565b156143f757565b6143ff6102a2565b62461bcd60e51b815280614415600482016143d8565b0390fd5b5f614446928192906144296102a2565b90816144348161434b565b03925af161444061436e565b506143f0565b565b61445d614462916144576115ed565b50612f74565b614b1f565b90565b5f7f4241445f544f4b454e5f41444452455353000000000000000000000000000000910152565b6144996011602092611562565b6144a281614465565b0190565b6144bb9060208101905f81830391015261448c565b90565b156144c557565b6144cd6102a2565b62461bcd60e51b8152806144e3600482016144a6565b0390fd5b90565b156144f25750565b614513906144fe6102a2565b91829162461bcd60e51b83526004830161159c565b0390fd5b61452081610652565b0361452757565b5f80fd5b9050519061453882614517565b565b9060208282031261455357614550915f0161452b565b90565b6102ac565b5f7f544f4b454e5f4f5045524154494f4e5f4641494c454400000000000000000000910152565b61458c6016602092611562565b61459581614558565b0190565b6145ae9060208101905f81830391015261457f565b90565b156145b857565b6145c06102a2565b62461bcd60e51b8152806145d660048201614599565b0390fd5b5f9182916145ef6145ea82614b50565b6144be565b9082602082019151925af161461561460561436e565b9161460f836144e7565b906144ea565b61461e816113d1565b61463061462a5f611fe8565b91610377565b11614639575b50565b61465661465b91602061464b826113d1565b81830101910161453a565b6145b1565b5f614636565b61466a90611fe8565b9052565b91602061468f92949361468860408201965f83019061031d565b0190614661565b565b90916146d46004916146c563095ea7b36146ac879391613273565b926146b56102a2565b9586946020860190815201613a0e565b60208201810382520382611485565b906146e96146e3828490614b79565b15610652565b6146f3575b505050565b61474060046147459461473b849161472c63095ea7b36147135f91613273565b9261471c6102a2565b968794602086019081520161466e565b60208201810382520383611485565b614c1b565b614c1b565b5f80806146ee565b61475961475f91610377565b91610377565b90811561476a570490565b612ac7565b61477761174b565b506147c36147bd6147b86001936147b26147a2614792612728565b61479c6001612d1e565b9061334d565b6147ac60026136b6565b9061474d565b90614e06565b610377565b91612d1e565b1490565b5f7f496e76616c6964206e756d626572000000000000000000000000000000000000910152565b6147fb600e602092611562565b614804816147c7565b0190565b61481d9060208101905f8183039101526147ee565b90565b1561482757565b61482f6102a2565b62461bcd60e51b81528061484560048201614808565b0390fd5b614851612ce0565b508061486561485f5f611fe8565b91610377565b141580614931575b80614911575b61487c90614820565b6148855f611fe8565b61488f6001612d1e565b8390614899612ce0565b505b836148ae6148a85f611fe8565b91610377565b14614909576148be82859061474d565b81939186829188908115614904576148d793099061334d565b918680156148ff576148f8936148f292089495809492613662565b9061334d565b929161489b565b612ac7565b612ac7565b505091505090565b5061487c826149286149225f611fe8565b91610377565b14159050614873565b508061494561493f84610377565b91610377565b141561486d565b9161498d94939161497f9361495f612ce0565b50614968612ce0565b509091600193926149798795612d1e565b92614e8f565b929190929092909192614fa9565b91909190565b92909493916149a0612ce0565b506149a9612ce0565b506149b35f611fe8565b506149bd5f611fe8565b506149c75f611fe8565b50836149db6149d583610377565b91610377565b145f14614a595750849084918215614a545708614a006149fa5f611fe8565b91610377565b145f14614a2357505050505f90614a20614a1a5f93611fe8565b92611fe8565b90565b614a4e93614a3f9260019291614a398694612d1e565b9161586c565b92919290925b92909192614fa9565b91909190565b612ac7565b915093614a4e94614a879391906001939091600190614a81614a7b8997612d1e565b92612d1e565b9461514d565b9291929092614a45565b602090614a9c6142b8565b50015163ffffffff60e01b1690565b90565b614ac2614abd614ac792614aab565b6102cd565b610377565b90565b614ad46020614aae565b90565b90565b614aee614ae9614af392614ad7565b6102cd565b610377565b90565b614b006004614ada565b90565b614b1c614b0e614aca565b614b16614af6565b906119f0565b90565b614b48614b4d91614b2e6115ed565b50614b37614b03565b90614b40612ce0565b5001516116a5565b610a1d565b90565b614b5861174b565b50614b61612ce0565b503b614b75614b6f5f611fe8565b91610377565b1190565b905f602091614b8661174b565b50614b8f61174b565b50614b98612ce0565b50614ba1612ce0565b50828151910182855af13d915f51919283614bbd575b50505090565b90919250614bd3614bcd5f611fe8565b91610377565b145f14614c0157614be49150613234565b3b614bf7614bf15f611fe8565b91610377565b115b5f8080614bb7565b50614c15614c0f6001612d1e565b91610377565b14614bf9565b905f602091614c28612ce0565b50614c31612ce0565b50828151910182855af115614cc4573d5f5190614c56614c505f611fe8565b91610377565b145f14614caa5750614c6781613234565b3b614c7a614c745f611fe8565b91610377565b145b614c835750565b614c8f614ca691613234565b5f918291635274afe760e01b83526004830161032a565b0390fd5b614cbd614cb76001612d1e565b91610377565b1415614c7c565b6040513d5f823e3d90fd5b90565b614ce6614ce1614ceb92614ccf565b6102cd565b6102c2565b90565b614cf790614cd2565b90565b60ff1690565b614d14614d0f614d1992614aab565b6102cd565b614cfa565b90565b614d2590614d00565b9052565b9194614d71614d7b92989795614d6760a096614d5d614d829a614d5360c08a019e5f8b0190614d1c565b6020890190614d1c565b6040870190614d1c565b60608501906103cd565b60808301906103cd565b01906103cd565b565b5f7f4649454c445f504f575f4641494c454400000000000000000000000000000000910152565b614db86010602092611562565b614dc181614d84565b0190565b614dda9060208101905f818303910152614dab565b90565b15614de457565b614dec6102a2565b62461bcd60e51b815280614e0260048201614dc5565b0390fd5b5f8091614e8c93614e15612ce0565b50614e5c614e236005614cee565b92614e4d602091602094602091614e38612728565b92614e416102a2565b97889660208801614d29565b60208201810382520382611485565b602081019051915afa614e76614e7061436e565b91614ddd565b6020614e81826113d1565b81830101910161324c565b90565b9493929194614e9c612ce0565b50614ea5612ce0565b50614eae612ce0565b5080614ec2614ebc5f611fe8565b91610377565b14614f9b579590614ed25f611fe8565b95614edc5f611fe8565b93614ee76001612d1e565b985b80614efc614ef65f611fe8565b91610377565b14614f8a5780614f0c6001612d1e565b16614f1f614f195f611fe8565b91610377565b03614f5c575b90614f3e614f4a9392614f3860026136b6565b9061474d565b9391908791899361586c565b97919794909792979197949094614ee9565b97614f3e95829a614f4a9493614f7a93929187908692938d9561514d565b9a91969096999192935050614f25565b505050509250929050919291929190565b509150939150919291929190565b91614fcb9094939194614fba612ce0565b50614fc3612ce0565b508290614849565b918283839182156150095709908183918215615004570994929082918215614fff570990918215614ffa570990565b612ac7565b612ac7565b612ac7565b612ac7565b67ffffffffffffffff81116150235760200290565b611471565b6150346150399161500e565b6114ae565b90565b369037565b9061505f61504e83615028565b92615059849161500e565b9061503c565b565b61506b6004615041565b90565b50600490565b9061507e8261506e565b81101561508c576020020190565b61226c565b9061509b90610377565b9052565b6150a99051610377565b90565b90565b6150c36150be6150c8926150ac565b6102cd565b610377565b90565b5f7f557365206a6163446f75626c652066756e6374696f6e20696e73746561640000910152565b6150ff601e602092611562565b615108816150cb565b0190565b6151219060208101905f8183039101526150f2565b90565b1561512b57565b6151336102a2565b62461bcd60e51b8152806151496004820161510c565b0390fd5b92969495969390919361515e612ce0565b50615167612ce0565b50615170612ce0565b508361518461517e5f611fe8565b91610377565b1480615833575b61582457806151a261519c5f611fe8565b91610377565b148061580a575b6157fb576151b5615061565b9285868a9081156157f6576151dd92096151d8866151d25f611fe8565b90615074565b615091565b856151f96151f4866151ee5f611fe8565b90615074565b61509f565b8a9081156157f15761521f920961521a866152146001612d1e565b90615074565b615091565b87888a9081156157ec5761524792096152428661523c60026136b6565b90615074565b615091565b8761526461525f8661525960026136b6565b90615074565b61509f565b8a9081156157e75761528a92096152858661527f60036150af565b90615074565b615091565b6152946004615028565b946152b16152ac866152a660026136b6565b90615074565b61509f565b8a9081156157e2576152c692095f8701615091565b6152e26152dd856152d760036150af565b90615074565b61509f565b899081156157dd576152f8920960208601615091565b9061531461530f846153095f611fe8565b90615074565b61509f565b90889283156157d8576153499361534493615333920960408701615091565b9261533e6001612d1e565b90615074565b61509f565b869081156157d35761535f920960608301615091565b9361537b615376866153705f611fe8565b90615074565b61509f565b6153a86153a261539d6153988961539260026136b6565b90615074565b61509f565b610377565b91610377565b1415801561577d575b6153ba90615124565b6153c2615061565b936153df6153da876153d460026136b6565b90615074565b61509f565b615404836153fe6153f98a6153f35f611fe8565b90615074565b61509f565b9061334d565b839081156157785761542992086154248761541e5f611fe8565b90615074565b615091565b6154456154408761543a60036150af565b90615074565b61509f565b61546b836154656154608a61545a6001612d1e565b90615074565b61509f565b9061334d565b8390811561577357615491920861548c876154866001612d1e565b90615074565b615091565b6154ac6154a7866154a15f611fe8565b90615074565b61509f565b6154c76154c2876154bc5f611fe8565b90615074565b61509f565b8390811561576e576154ed92096154e8876154e260026136b6565b90615074565b615091565b615509615504866154fe60026136b6565b90615074565b61509f565b61552461551f876155195f611fe8565b90615074565b61509f565b839081156157695761554a92096155458761553f60036150af565b90615074565b615091565b6155666155618661555b6001612d1e565b90615074565b61509f565b61558261557d876155776001612d1e565b90615074565b61509f565b8391821561576457096155b1836155ab6155a6896155a060036150af565b90615074565b61509f565b9061334d565b8391821561575f5708826002906155d96155d48a6155ce5f611fe8565b90615074565b61509f565b6155f56155f08a6155ea60026136b6565b90615074565b61509f565b8691821561575a57098590811561575557615612615619946136b6565b099061334d565b8391821561575057089561563f61563a876156346001612d1e565b90615074565b61509f565b61565a6156558361564f5f611fe8565b90615074565b61509f565b6156766156718961566b60026136b6565b90615074565b61509f565b8591821561574b570961568a858a9061334d565b859182156157465708849182156157415709906156ba6156b585926156af6001612d1e565b90615074565b61509f565b906156d76156d2896156cc60036150af565b90615074565b61509f565b8590811561573c576156ea93099061334d565b90838015615737576157109261570b9208966157055f611fe8565b90615074565b61509f565b92908291821561573257099091821561572d570992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b506153ba61579d615798876157926001612d1e565b90615074565b61509f565b6157ca6157c46157bf6157ba8a6157b460036150af565b90615074565b61509f565b610377565b91610377565b141590506153b1565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b50509350909350919291929190565b508161581e6158185f611fe8565b91610377565b146151a9565b93509495505050919291929190565b50826158476158415f611fe8565b91610377565b1461518b565b90565b61586461585f6158699261584d565b6102cd565b610377565b90565b9492949390919361587b612ce0565b50615884612ce0565b5061588d612ce0565b50846158a161589b5f611fe8565b91610377565b14615a2357808183918215615a1e570995838484918215615a19570991868785918215615a145709906004908486918215615a0f570985918215615a0a576158e890614ada565b099760039085918215615a05576158fe906150af565b0991908085918215615a005709849182156159fb5709839182156159f65708958687849182156159f1570983829083869081156159ec5761594093089061334d565b849182156159e75708969061595684899061334d565b849182156159e25708839182156159dd5709908260089180859182156159d85709849081156159d35761598b61599294615850565b099061334d565b829182156159ce57089360029290829182156159c95709909182156159c4576159ba906136b6565b0992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b919394505091929192919056fea26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","recompiledBytecode":"0x60806040523461002757610011610036565b61001961002c565b615a6661030e8239615a6690f35b610032565b60405190565b5f80fd5b61003e610040565b565b6100486100de565b6100506101e4565b565b90565b90565b90565b61006f61006a61007492610052565b610058565b610055565b90565b610081600161005b565b90565b5f1b90565b906100955f1991610084565b9181191691161790565b6100b36100ae6100b892610055565b610058565b610055565b90565b90565b906100d36100ce6100da9261009f565b6100bb565b8254610089565b9055565b6100f86100e9610077565b680100000000000000006100be565b565b60401c90565b60ff1690565b610112610117916100fa565b610100565b90565b6101249054610106565b90565b5f0190565b5f1c90565b60018060401b031690565b61014861014d9161012c565b610131565b90565b61015a905461013c565b90565b60018060401b031690565b9061017960018060401b0391610084565b9181191691161790565b61019761019261019c9261015d565b610058565b61015d565b90565b90565b906101b76101b26101be92610183565b61019f565b8254610168565b9055565b6101cb9061015d565b9052565b91906101e2905f602085019401906101c2565b565b6101ec61029c565b6101f75f820161011a565b610280576102065f8201610150565b61021e61021860018060401b0361015d565b9161015d565b03610227575b50565b61023a905f60018060401b0391016101a2565b60018060401b036102777fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29161026e61002c565b918291826101cf565b0390a15f610224565b5f63f92ee8a960e01b81528061029860048201610127565b0390fd5b6102a46102f9565b90565b5f90565b90565b90565b6102c56102c06102ca926102ab565b610084565b6102ae565b90565b6102f67ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102b1565b90565b6103016102a7565b5061030a6102cd565b9056fe60806040526004361015610013575b6115e9565b61001d5f3561029c565b8063011e1167146102975780631710abaa14610292578063187ac4cb1461028d5780631dbd1da7146102885780631f0e8a12146102835780631f7daf0f1461027e57806330eff5dd1461027957806333eeb1471461027457806334759ca71461026f578063429a82081461026a578063439fab9114610265578063441a3e701461026057806346a577ed1461025b5780634780404d1461025657806354f3ea7f14610251578063556cf28b1461024c578063582b9044146102475780635837397114610242578063701f9fae1461023d5780637feaf0571461023857806386aeb4451461023357806387ec36e31461022e578063988760b0146102295780639a0fa042146102245780639cec9aaa1461021f578063b8ad077d1461021a578063b937f8f714610215578063bea8418714610210578063ccefe7b01461020b578063dd7202d814610206578063e2d8efd014610201578063e6fb8119146101fc578063e8a91f30146101f7578063e9f5a4a8146101f2578063ec3161b0146101ed578063ed3914d4146101e8578063ee4d01bf146101e3578063f405f17a146101de578063f637d950146101d95763ffa1ad740361000e576115b4565b61143c565b61139c565b61134a565b6112da565b611268565b611233565b6111ef565b611197565b61113f565b6110b4565b61107f565b610ff2565b610f48565b610edb565b610e83565b610df8565b610da0565b610d3c565b610d08565b610c8d565b610c54565b610baa565b610b52565b610ae2565b610a57565b61098c565b610919565b610890565b61082f565b610774565b610704565b610679565b61061d565b610592565b61053a565b6104e2565b610468565b6103ef565b61033f565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f9103126102ba57565b6102ac565b90565b60018060a01b031690565b90565b6102e46102df6102e9926102bf565b6102cd565b6102c2565b90565b6102f5906102d0565b90565b610303610eee6102ec565b90565b61030e6102f8565b90565b61031a906102c2565b90565b61032690610311565b9052565b919061033d905f6020850194019061031d565b565b3461036f5761034f3660046102b0565b61036b61035a610306565b6103626102a2565b9182918261032a565b0390f35b6102a8565b90565b90565b61038e61038961039392610374565b6102cd565b610377565b90565b6103bf7f01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb061037a565b90565b6103ca610396565b90565b6103d690610377565b9052565b91906103ed905f602085019401906103cd565b565b3461041f576103ff3660046102b0565b61041b61040a6103c2565b6104126102a2565b918291826103da565b0390f35b6102a8565b1c90565b60018060a01b031690565b6104439060086104489302610424565b610428565b90565b906104569154610433565b90565b61046560275f9061044b565b90565b34610498576104783660046102b0565b610494610483610459565b61048b6102a2565b9182918261032a565b0390f35b6102a8565b5f80fd5b6104aa81610377565b036104b157565b5f80fd5b905035906104c2826104a1565b565b906020828203126104dd576104da915f016104b5565b90565b6102ac565b346105125761050e6104fd6104f83660046104c4565b6116c1565b6105056102a2565b9182918261032a565b0390f35b6102a8565b73ce5a537d4da620de59efa6f74a0a065732600c7190565b610537610517565b90565b3461056a5761054a3660046102b0565b61056661055561052f565b61055d6102a2565b9182918261032a565b0390f35b6102a8565b73941f54cb53dc1478cb126a2ba8a83b2130419db590565b61058f61056f565b90565b346105c2576105a23660046102b0565b6105be6105ad610587565b6105b56102a2565b9182918261032a565b0390f35b6102a8565b90565b6105de6105d96105e3926105c7565b6102cd565b610377565b90565b61060f7f01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df26105ca565b90565b61061a6105e6565b90565b3461064d5761062d3660046102b0565b610649610638610612565b6106406102a2565b918291826103da565b0390f35b6102a8565b151590565b61066090610652565b9052565b9190610677905f60208501940190610657565b565b346106a9576106893660046102b0565b6106a561069461174f565b61069c6102a2565b91829182610664565b0390f35b6102a8565b90565b6106c56106c06106ca926106ae565b6102cd565b610377565b90565b6106f67f0348958c1322d3fc34f89b91b0b6473594725847184ee590e990bb70ef322b166106b1565b90565b6107016106cd565b90565b34610734576107143660046102b0565b61073061071f6106f9565b6107276102a2565b918291826103da565b0390f35b6102a8565b90565b61075061074b61075592610739565b6102cd565b610377565b90565b6107666401c16b450061073c565b90565b610771610758565b90565b346107a4576107843660046102b0565b6107a061078f610769565b6107976102a2565b918291826103da565b0390f35b6102a8565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156107ef5781359167ffffffffffffffff83116107ea5760200192600183028401116107e557565b6107b1565b6107ad565b6107a9565b90602082820312610825575f82013567ffffffffffffffff81116108205761081c92016107b5565b9091565b61049d565b6102ac565b5f0190565b3461085e576108486108423660046107f4565b90611f42565b6108506102a2565b8061085a8161082a565b0390f35b6102a8565b919060408382031261088b578061087f610888925f86016104b5565b936020016104b5565b90565b6102ac565b346108bf576108a96108a3366004610863565b906120ec565b6108b16102a2565b806108bb8161082a565b0390f35b6102a8565b90565b6108db6108d66108e0926108c4565b6102cd565b610377565b90565b61090b7eb59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e49586108c7565b90565b6109166108e3565b90565b34610949576109293660046102b0565b61094561093461090e565b61093c6102a2565b918291826103da565b0390f35b6102a8565b90565b61096561096061096a9261094e565b6102cd565b610377565b90565b61097e6703b2c201ffc2e880610951565b90565b61098961096d565b90565b346109bc5761099c3660046102b0565b6109b86109a7610981565b6109af6102a2565b918291826103da565b0390f35b6102a8565b60018060a01b031690565b6109dc9060086109e19302610424565b6109c1565b90565b906109ef91546109cc565b90565b6109fe60285f906109e4565b90565b610a15610a10610a1a926102c2565b6102cd565b6102c2565b90565b610a2690610a01565b90565b610a3290610a1d565b90565b610a3e90610a29565b9052565b9190610a55905f60208501940190610a35565b565b34610a8757610a673660046102b0565b610a83610a726109f2565b610a7a6102a2565b91829182610a42565b0390f35b6102a8565b90565b610aa3610a9e610aa892610a8c565b6102cd565b610377565b90565b610ad47f07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753610a8f565b90565b610adf610aab565b90565b34610b1257610af23660046102b0565b610b0e610afd610ad7565b610b056102a2565b918291826103da565b0390f35b6102a8565b90565b610b2e610b29610b3392610b17565b6102cd565b610377565b90565b610b44641d1a94a200610b1a565b90565b610b4f610b36565b90565b34610b8257610b623660046102b0565b610b7e610b6d610b47565b610b756102a2565b918291826103da565b0390f35b6102a8565b73216e8577b504ac3db213edd261e47fffbb35424890565b610ba7610b87565b90565b34610bda57610bba3660046102b0565b610bd6610bc5610b9f565b610bcd6102a2565b9182918261032a565b0390f35b6102a8565b909182601f83011215610c195781359167ffffffffffffffff8311610c14576020019260608302840111610c0f57565b6107b1565b6107ad565b6107a9565b90602082820312610c4f575f82013567ffffffffffffffff8111610c4a57610c469201610bdf565b9091565b61049d565b6102ac565b610c68610c62366004610c1e565b90612509565b610c706102a2565b80610c7a8161082a565b0390f35b610c8a60255f9061044b565b90565b34610cbd57610c9d3660046102b0565b610cb9610ca8610c7e565b610cb06102a2565b9182918261032a565b0390f35b6102a8565b919091604081840312610d0357610cdb835f83016104b5565b92602082013567ffffffffffffffff8111610cfe57610cfa92016107b5565b9091565b61049d565b6102ac565b34610d3757610d21610d1b366004610cc2565b91612515565b610d296102a2565b80610d338161082a565b0390f35b6102a8565b610d473660046102b0565b610d4f61267d565b610d576102a2565b80610d618161082a565b0390f35b90565b610d7c610d77610d8192610d65565b6102cd565b610377565b90565b610d926436b7176e00610d68565b90565b610d9d610d84565b90565b34610dd057610db03660046102b0565b610dcc610dbb610d95565b610dc36102a2565b918291826103da565b0390f35b6102a8565b73bc6eeb5111fea2b5e9b2bc534bbcbca9568999a490565b610df5610dd5565b90565b34610e2857610e083660046102b0565b610e24610e13610ded565b610e1b6102a2565b9182918261032a565b0390f35b6102a8565b90565b610e44610e3f610e4992610e2d565b6102cd565b610377565b90565b610e757f07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc610e30565b90565b610e80610e4c565b90565b34610eb357610e933660046102b0565b610eaf610e9e610e78565b610ea66102a2565b918291826103da565b0390f35b6102a8565b73409f85d2207796b543b8abdb6a0e2490bb1483d190565b610ed8610eb8565b90565b34610f0b57610eeb3660046102b0565b610f07610ef6610ed0565b610efe6102a2565b9182918261032a565b0390f35b6102a8565b90565b610f23906008610f289302610424565b610f10565b90565b90610f369154610f13565b90565b610f45600d5f90610f2b565b90565b34610f7857610f583660046102b0565b610f74610f63610f39565b610f6b6102a2565b918291826103da565b0390f35b6102a8565b610f8681610311565b03610f8d57565b5f80fd5b90503590610f9e82610f7d565b565b91606083830312610fed57610fb7825f8501610f91565b92610fc583602083016104b5565b92604082013567ffffffffffffffff8111610fe857610fe492016107b5565b9091565b61049d565b6102ac565b346110245761100e611005366004610fa0565b92919091612b2f565b6110166102a2565b806110208161082a565b0390f35b6102a8565b90565b61104061103b61104592611029565b6102cd565b610377565b90565b6110717f052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b43461102c565b90565b61107c611048565b90565b346110af5761108f3660046102b0565b6110ab61109a611074565b6110a26102a2565b918291826103da565b0390f35b6102a8565b346110e4576110e06110cf6110ca3660046104c4565b612d3a565b6110d76102a2565b918291826103da565b0390f35b6102a8565b90565b6111006110fb611105926110e9565b6102cd565b610377565b90565b6111317f025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca016110ec565b90565b61113c611108565b90565b3461116f5761114f3660046102b0565b61116b61115a611134565b6111626102a2565b918291826103da565b0390f35b6102a8565b7310cbbbb225bbea137ac01f0f6d91cdb126bccaa690565b611194611174565b90565b346111c7576111a73660046102b0565b6111c36111b261118c565b6111ba6102a2565b9182918261032a565b0390f35b6102a8565b735ebb994ebc1c44815fbf2fa61a6e1f8368dcb0c790565b6111ec6111cc565b90565b3461121f576111ff3660046102b0565b61121b61120a6111e4565b6112126102a2565b9182918261032a565b0390f35b6102a8565b61123060265f9061044b565b90565b34611263576112433660046102b0565b61125f61124e611224565b6112566102a2565b9182918261032a565b0390f35b6102a8565b346112995761129561128461127e366004610863565b90612d8e565b61128c6102a2565b918291826103da565b0390f35b6102a8565b90565b6112b56112b06112ba9261129e565b6102cd565b610377565b90565b6112cc650474dec268006112a1565b90565b6112d76112bd565b90565b3461130a576112ea3660046102b0565b6113066112f56112cf565b6112fd6102a2565b918291826103da565b0390f35b6102a8565b90565b61132661132161132b9261130f565b6102cd565b610377565b90565b61133c64590ec6d100611312565b90565b61134761132e565b90565b3461137a5761135a3660046102b0565b61137661136561133f565b61136d6102a2565b918291826103da565b0390f35b6102a8565b61138e650474dec268006112a1565b90565b61139961137f565b90565b346113cc576113ac3660046102b0565b6113c86113b7611391565b6113bf6102a2565b918291826103da565b0390f35b6102a8565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61141261141b60209361142093611409816113d1565b938480936113d5565b958691016113de565b6113e9565b0190565b6114399160208201915f8184039101526113f3565b90565b3461146c576114686114576114523660046104c4565b612f74565b61145f6102a2565b91829182611424565b0390f35b6102a8565b634e487b7160e01b5f52604160045260245ffd5b9061148f906113e9565b810190811067ffffffffffffffff8211176114a957604052565b611471565b906114c16114ba6102a2565b9283611485565b565b67ffffffffffffffff81116114e1576114dd6020916113e9565b0190565b611471565b906114f86114f3836114c3565b6114ae565b918252565b5f7f537461726b45782d494d582d4d6967726174696f6e2d312e302e300000000000910152565b61152e601b6114e6565b9061153b602083016114fd565b565b611545611524565b90565b61155061153d565b90565b61155b611548565b90565b5190565b60209181520190565b61158a611593602093611598936115818161155e565b93848093611562565b958691016113de565b6113e9565b0190565b6115b19160208201915f81840391015261156b565b90565b346115e4576115c43660046102b0565b6115e06115cf611553565b6115d76102a2565b9182918261159c565b0390f35b6102a8565b5f80fd5b5f90565b61160561160061160a92610377565b6102cd565b610377565b90565b90611617906115f1565b5f5260205260405f2090565b5f1c90565b61163461163991611623565b610428565b90565b6116469054611628565b90565b90565b61166061165b61166592611649565b6102cd565b6102c2565b90565b6116719061164c565b90565b90565b61168b61168661169092611674565b6102cd565b610377565b90565b6116a260018060a01b03611677565b90565b6116b96116b46116be92610377565b6102cd565b6102c2565b90565b6116c96115ed565b506116de6116d96018839061160d565b61163c565b806116f96116f36116ee5f611668565b610311565b91610311565b0361174657508061171b6117158361170f611693565b16610377565b91610377565b145f146117375761172e611733916116a5565b610a1d565b5b90565b506117415f611668565b611734565b905090565b5f90565b61175761174b565b505f90565b90565b67ffffffffffffffff1690565b61178061177b6117859261175c565b6102cd565b61175f565b90565b60401c90565b60ff1690565b6117a06117a591611788565b61178e565b90565b6117b29054611794565b90565b67ffffffffffffffff1690565b6117ce6117d391611623565b6117b5565b90565b6117e090546117c2565b90565b5f1b90565b906117fb67ffffffffffffffff916117e3565b9181191691161790565b61181961181461181e9261175f565b6102cd565b61175f565b90565b90565b9061183961183461184092611805565b611821565b82546117e8565b9055565b60401b90565b9061185e68ff000000000000000091611844565b9181191691161790565b61187190610652565b90565b90565b9061188c61188761189392611868565b611874565b825461184a565b9055565b6118a09061175f565b9052565b91906118b7905f60208501940190611897565b565b906118c4600261176c565b916118cd612faf565b906118d95f83016117a8565b801561196a575b61194e576119139261190a916118f8865f8601611824565b61190560015f8601611877565b611a98565b5f809101611877565b6119497fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916119406102a2565b918291826118a4565b0390a1565b5f63f92ee8a960e01b8152806119666004820161082a565b0390fd5b506119765f83016117d6565b6119886119828661175f565b9161175f565b10156118e0565b90611999906115f1565b5f5260205260405f2090565b906119af906115f1565b5f5260205260405f2090565b6119c76119cc91611623565b610f10565b90565b6119d990546119bb565b90565b634e487b7160e01b5f52601160045260245ffd5b6119ff611a0591939293610377565b92610377565b8201809211611a1057565b6119dc565b90611a215f19916117e3565b9181191691161790565b90565b90611a43611a3e611a4a926115f1565b611a2b565b8254611a15565b9055565b90611a5f60018060a01b03916117e3565b9181191691161790565b611a7290610a1d565b90565b90565b90611a8d611a88611a9492611a69565b611a75565b8254611a4e565b9055565b5050611ae1611aa561137f565b611adb611acc611abe6008611ab8610aab565b9061198f565b611ac66106cd565b906119a5565b91611ad6836119cf565b6119f0565b90611a2e565b611b28611aec610b36565b611b22611b13611b056008611aff610396565b9061198f565b611b0d6106cd565b906119a5565b91611b1d836119cf565b6119f0565b90611a2e565b611b6f611b33610758565b611b69611b5a611b4c6008611b46611048565b9061198f565b611b546106cd565b906119a5565b91611b64836119cf565b6119f0565b90611a2e565b611bb6611b7a6112bd565b611bb0611ba1611b936008611b8d610e4c565b9061198f565b611b9b6106cd565b906119a5565b91611bab836119cf565b6119f0565b90611a2e565b611bfd611bc161132e565b611bf7611be8611bda6008611bd46108e3565b9061198f565b611be26106cd565b906119a5565b91611bf2836119cf565b6119f0565b90611a2e565b611c44611c0861096d565b611c3e611c2f611c216008611c1b611108565b9061198f565b611c296106cd565b906119a5565b91611c39836119cf565b6119f0565b90611a2e565b611c8b611c4f610d84565b611c85611c76611c686008611c626105e6565b9061198f565b611c706106cd565b906119a5565b91611c80836119cf565b6119f0565b90611a2e565b611ca6611ca16018611c9b610aab565b9061160d565b61163c565b611cc0611cba611cb55f611668565b610311565b91610311565b14611f1a575b611ce1611cdc6018611cd6610396565b9061160d565b61163c565b611cfb611cf5611cf05f611668565b610311565b91610311565b14611ef2575b611d1c611d176018611d11611048565b9061160d565b61163c565b611d36611d30611d2b5f611668565b610311565b91610311565b14611eca575b611d57611d526018611d4c610e4c565b9061160d565b61163c565b611d71611d6b611d665f611668565b610311565b91610311565b14611ea2575b611d92611d8d6018611d876108e3565b9061160d565b61163c565b611dac611da6611da15f611668565b610311565b91610311565b14611e7a575b611dcd611dc86018611dc2611108565b9061160d565b61163c565b611de7611de1611ddc5f611668565b610311565b91610311565b14611e52575b611e08611e036018611dfd6105e6565b9061160d565b61163c565b611e22611e1c611e175f611668565b610311565b91610311565b14611e2a575b565b611e4d611e35610dd5565b611e486018611e426105e6565b9061160d565b611a78565b611e28565b611e75611e5d61056f565b611e706018611e6a611108565b9061160d565b611a78565b611ded565b611e9d611e85610517565b611e986018611e926108e3565b9061160d565b611a78565b611db2565b611ec5611ead610eb8565b611ec06018611eba610e4c565b9061160d565b611a78565b611d77565b611eed611ed5611174565b611ee86018611ee2611048565b9061160d565b611a78565b611d3c565b611f15611efd610b87565b611f106018611f0a610396565b9061160d565b611a78565b611d01565b611f3d611f256111cc565b611f386018611f32610aab565b9061160d565b611a78565b611cc6565b90611f4c916118b9565b565b611f5790610a01565b90565b611f6390611f4e565b90565b5f7f4e4f4e5f46554e4749424c455f41535345545f54595045000000000000000000910152565b611f9a6017602092611562565b611fa381611f66565b0190565b611fbc9060208101905f818303910152611f8d565b90565b15611fc657565b611fce6102a2565b62461bcd60e51b815280611fe460048201611fa7565b0390fd5b611ffc611ff761200192611649565b6102cd565b610377565b90565b5f7f4e4f5f50454e44494e475f5749544844524157414c0000000000000000000000910152565b6120386015602092611562565b61204181612004565b0190565b61205a9060208101905f81830391015261202b565b90565b1561206457565b61206c6102a2565b62461bcd60e51b81528061208260048201612045565b0390fd5b61208f90610a1d565b90565b61209b90612086565b9052565b909594926120ea946120d96120e3926120cf6080966120c560a088019c5f8901906103cd565b60208701906103cd565b60408501906103cd565b60608301906103cd565b0190612092565b565b906120fe6120f98361303c565b611f5a565b61210f61210a836130e6565b611fbf565b6121c182936121756121356121306121296008859061198f565b88906119a5565b6119cf565b956121528761214c6121465f611fe8565b91610377565b1161205d565b61217061215e5f611fe8565b9161216b6008869061198f565b6119a5565b611a2e565b612181838587916133f4565b9161218d848690613697565b947fb7477a7b93b2addc5272bbd7ad0986ef1c0d0bd265f26c3dc4bbe42727c2ac0c956121b86102a2565b9586958661209f565b0390a1565b906121d8916121d36136df565b612205565b6121e0613754565b565b156121e957565b5f636e7e1ba960e11b8152806122016004820161082a565b0390fd5b906122349161222f3361222961222361221e602761163c565b610311565b91610311565b146121e2565b61230d565b565b5090565b1561224157565b5f635091728960e01b8152806122596004820161082a565b0390fd5b60016122699101610377565b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015612290576060020190565b61226c565b3561229f81610f7d565b90565b356122ac816104a1565b90565b156122b657565b5f63dd3bd7d760e01b8152806122ce6004820161082a565b0390fd5b6122db90610a01565b90565b6122e7906122d2565b90565b156122f157565b5f631733f9d760e01b8152806123096004820161082a565b0390fd5b9061233461231c838390612236565b61232e6123285f611fe8565b91610377565b1161223a565b61233d5f611fe8565b916123475f611fe8565b5b8061236561235f61235a858790612236565b610377565b91610377565b10156124e857612468906123855f61237f85878591612280565b01612295565b61239c602061239686888691612280565b016122a2565b6123c16123b660406123b0888a8891612280565b016122a2565b9291929788906119f0565b966123df886123d86123d234610377565b91610377565b11156122af565b816123f96123f36123ee6102f8565b610311565b91610311565b145f1461246d5761240b915082613a31565b612415602661163c565b339061245f61244d6124477f680cdeb18e0632eaae1727127d3005efb3ea5dba23e34446c9e94cf2cf5f557793611a69565b93611a69565b936124566102a2565b918291826103da565b0390a35b61225d565b612348565b6124839061247a836122de565b90849091613854565b61248d602661163c565b33916124e06124ce6124c86124c27fbaffede578523e7bb616324498f96acc5cd38e6c6168c976d67866fb78ea958d94611a69565b94611a69565b94611a69565b946124d76102a2565b918291826103da565b0390a4612463565b505050612507906125016124fb34610377565b91610377565b146122ea565b565b90612513916121c6565b565b9091612525923392909192612b2f565b565b61252f6136df565b612537612541565b61253f613754565b565b6125663361256061255a612555602761163c565b610311565b91610311565b146121e2565b61256e6125dd565b565b61257c61258191611623565b6109c1565b90565b61258e9054612570565b90565b5f80fd5b60e01b90565b5f9103126125a557565b6102ac565b9160206125cb9294936125c460408201965f8301906103cd565b019061031d565b565b6125d56102a2565b3d5f823e3d90fd5b6125ef6125ea6028612584565b610a29565b63168b5ab73491909190612603600d6119cf565b903393813b15612678575f9361262a9161263561261e6102a2565b97889687958694612595565b8452600484016125aa565b03925af1801561267357612647575b50565b612666905f3d811161266c575b61265e8183611485565b81019061259b565b5f612644565b503d612654565b6125cd565b612591565b612685612527565b565b5f7f494e56414c49445f535441524b5f4b4559000000000000000000000000000000910152565b6126bb6011602092611562565b6126c481612687565b0190565b6126dd9060208101905f8183039101526126ae565b90565b156126e757565b6126ef6102a2565b62461bcd60e51b815280612705600482016126c8565b0390fd5b90565b61272061271b61272592612709565b6102cd565b610377565b90565b61273f600167080000000000001160c01b0161270c565b90565b5f7f494e56414c49445f4554485f4144445245535300000000000000000000000000910152565b6127766013602092611562565b61277f81612742565b0190565b6127989060208101905f818303910152612769565b90565b156127a257565b6127aa6102a2565b62461bcd60e51b8152806127c060048201612783565b0390fd5b5f7f535441524b5f4b45595f554e415641494c41424c450000000000000000000000910152565b6127f86015602092611562565b612801816127c4565b0190565b61281a9060208101905f8183039101526127eb565b90565b1561282457565b61282c6102a2565b62461bcd60e51b81528061284260048201612805565b0390fd5b5090565b90565b61286161285c6128669261284a565b6102cd565b610377565b90565b5f7f494e56414c49445f535441524b5f5349474e41545552455f4c454e4754480000910152565b61289d601e602092611562565b6128a681612869565b0190565b6128bf9060208101905f818303910152612890565b90565b156128c957565b6128d16102a2565b62461bcd60e51b8152806128e7600482016128aa565b0390fd5b5f80fd5b67ffffffffffffffff811161290d576129096020916113e9565b0190565b611471565b90825f939282370152565b9092919261293261292d826128ef565b6114ae565b9381855260208501908284011161294e5761294c92612912565b565b6128eb565b61295e91369161291d565b90565b9050519061296e826104a1565b565b90916060828403126129a5576129a261298b845f8501612961565b936129998160208601612961565b93604001612961565b90565b6102ac565b905090565b5f7f55736572526567697374726174696f6e3a000000000000000000000000000000910152565b6129e2601180926129aa565b6129eb816129af565b0190565b60601b90565b6129fe906129ef565b90565b612a0a906129f5565b90565b612a19612a1e91610311565b612a01565b9052565b90565b612a31612a3691610377565b612a22565b9052565b601460209392612a56612a4f612a5e946129d6565b8092612a0d565b018092612a25565b0190565b60200190565b612a74612a7991611623565b6115f1565b90565b90565b612a93612a8e612a9892612a7c565b6102cd565b610377565b90565b612ac47f0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f612a7f565b90565b634e487b7160e01b5f52601260045260245ffd5b612ae7612aed91610377565b91610377565b908115612af8570690565b612ac7565b604090612b26612b2d9496959396612b1c60608401985f85019061031d565b60208301906103cd565b019061031d565b565b91612c15612c8d9294612c2b92612b5987612b52612b4c5f611fe8565b91610377565b14156126e0565b612b7c87612b76612b70612b6b612728565b610377565b91610377565b106126e0565b612ba186612b9a612b94612b8f5f611668565b610311565b91610311565b141561279b565b612bd8612bb8612bb360188a9061160d565b61163c565b612bd2612bcc612bc75f611668565b610311565b91610311565b1461281d565b612be9612be488613b7a565b6126e0565b612c10612bf7828490612846565b612c0a612c04606061284d565b91610377565b146128c2565b612953565b6020612c20826113d1565b818301019101612970565b90612c84612c7686612c5e8991612c4f612c436102a2565b93849260208401612a3a565b60208201810382520382611485565b612c70612c6a826113d1565b91612a62565b20612a68565b612c7e612a9b565b90612adb565b92869293613fb8565b612ca281612c9d6018859061160d565b611a78565b903391612cdb7fcab1cf17c190e4e2195a7b8f7b362023246fa774390432b4704ab6b29d56b07b93612cd26102a2565b93849384612afd565b0390a1565b5f90565b90612cee906115f1565b5f5260205260405f2090565b612d06612d0b91611623565b61178e565b90565b612d189054612cfa565b90565b90565b612d32612d2d612d3792612d1b565b6102cd565b610377565b90565b612d42612ce0565b50612d60612d5a612d5560158490612ce4565b612d0e565b15610652565b5f14612d755750612d716001612d1e565b905b565b612d83612d889160166119a5565b6119cf565b90612d73565b612db7612db2612dbd93612da0612ce0565b50612dad8194600861198f565b6119a5565b6119cf565b90613697565b90565b606090565b5f7f41535345545f545950455f4e4f545f5245474953544552454400000000000000910152565b612df96019602092611562565b612e0281612dc5565b0190565b612e1b9060208101905f818303910152612dec565b90565b15612e2557565b612e2d6102a2565b62461bcd60e51b815280612e4360048201612e06565b0390fd5b90612e51906115f1565b5f5260205260405f2090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015612e91575b6020831014612e8c57565b612e5d565b91607f1691612e81565b60209181520190565b5f5260205f2090565b905f9291805490612ec7612ec083612e71565b8094612e9b565b916001811690815f14612f1e5750600114612ee2575b505050565b612eef9192939450612ea4565b915f925b818410612f0657505001905f8080612edd565b60018160209295939554848601520191019290612ef3565b92949550505060ff19168252151560200201905f8080612edd565b90612f4391612ead565b90565b90612f66612f5f92612f566102a2565b93848092612f39565b0383611485565b565b612f7190612f46565b90565b612fa7612fac91612f83612dc0565b50612fa0612f9b612f9660158490612ce4565b612d0e565b612e1e565b6014612e47565b612f68565b90565b612fb76142a4565b90565b5f7f555345525f554e52454749535445524544000000000000000000000000000000910152565b612fee6011602092611562565b612ff781612fba565b0190565b6130109060208101905f818303910152612fe1565b90565b1561301a57565b6130226102a2565b62461bcd60e51b81528061303860048201612ffb565b0390fd5b61304e906130486115ed565b506116c1565b906130748261306d6130676130625f611668565b610311565b91610311565b1415613013565b565b63ffffffff60e01b1690565b61308b90613076565b90565b6130b77f8322fff276cdf3f5716784c2e78b276d0d5cf1781fe7a7984e8bff96f75632c6613082565b90565b6130e37ff47261b06eedbfce68afd46d0f3c27c60b03faad319eaf33103611cf8f6456ad613082565b90565b6130f8906130f261174b565b506142bc565b8061311261310c61310761308e565b613076565b91613076565b1490811561311f575b5090565b905061313a61313461312f6130ba565b613076565b91613076565b145f61311b565b5f7f494e56414c49445f524543495049454e54000000000000000000000000000000910152565b6131756011602092611562565b61317e81613141565b0190565b6131979060208101905f818303910152613168565b90565b156131a157565b6131a96102a2565b62461bcd60e51b8152806131bf60048201613182565b0390fd5b5f7f554e535550504f525445445f544f4b454e5f5459504500000000000000000000910152565b6131f76016602092611562565b613200816131c3565b0190565b6132199060208101905f8183039101526131ea565b90565b61322590610a01565b90565b6132319061321c565b90565b61323d90610a1d565b90565b61324990610a1d565b90565b9060208282031261326557613262915f01612961565b90565b6102ac565b63ffffffff1690565b61328761328261328c9261326a565b612595565b613076565b90565b613298906102c2565b90565b6132a49061328f565b9052565b9160206132c99294936132c260408201965f83019061329b565b01906103cd565b565b5f7f554e444552464c4f570000000000000000000000000000000000000000000000910152565b6132ff6009602092611562565b613308816132cb565b0190565b6133219060208101905f8183039101526132f2565b90565b1561332b57565b6133336102a2565b62461bcd60e51b8152806133496004820161330c565b0390fd5b61335c61336291939293610377565b92610377565b820391821161336d57565b6119dc565b5f7f494e434f52524543545f414d4f554e545f5452414e5346455252454400000000910152565b6133a6601c602092611562565b6133af81613372565b0190565b6133c89060208101905f818303910152613399565b90565b156133d257565b6133da6102a2565b62461bcd60e51b8152806133f0600482016133b3565b0390fd5b909161341b8261341461340e6134095f611668565b610311565b91612086565b141561319a565b613426838290613697565b90613430846142d9565b5f146135fd576134486134425f611fe8565b91610377565b146135f85761345961349f93614448565b61346281613228565b602061346d82613234565b6370a082319061349461347f30613240565b926134886102a2565b998a9485938493612595565b83526004830161032a565b03915afa9081156135f35761350460209360046134fe6135099561353b9a5f916135c6575b50986134f06134d663a9059cbb613273565b918a906134e16102a2565b9586948c8601908152016132a8565b888201810382520382611485565b906145da565b613234565b6370a082319061353061351b30613240565b926135246102a2565b97889485938493612595565b83526004830161032a565b03915afa80156135c15761357f61358a9261358492613590965f91613593575b506135798161357261356c89610377565b91610377565b1115613324565b9461334d565b610377565b91610377565b146133cb565b5b565b6135b4915060203d81116135ba575b6135ac8183611485565b81019061324c565b5f61355b565b503d6135a2565b6125cd565b6135e69150883d81116135ec575b6135de8183611485565b81019061324c565b5f6134c4565b503d6135d4565b6125cd565b505050565b90919261360990614308565b5f146136405761362161361b5f611fe8565b91610377565b1461363c5761363261363792612086565b614419565b613591565b5050565b6136486102a2565b62461bcd60e51b81528061365e60048201613204565b0390fd5b61367161367791939293610377565b92610377565b91613683838202610377565b92818404149015171561369257565b6119dc565b906136ad6136b3926136a7612ce0565b50612d3a565b90613662565b90565b6136ca6136c56136cf9261175c565b6102cd565b610377565b90565b6136dc60026136b6565b90565b6136f1680100000000000000006119cf565b61370a6137046136ff6136d2565b610377565b91610377565b1461372b5761372961371a6136d2565b68010000000000000000611a2e565b565b5f633ee5aeb560e01b8152806137436004820161082a565b0390fd5b6137516001612d1e565b90565b61376e61375f613747565b68010000000000000000611a2e565b565b61377990610a1d565b90565b1561378357565b5f63e6c4247b60e01b81528061379b6004820161082a565b0390fd5b156137a657565b5f63162908e360e11b8152806137be6004820161082a565b0390fd5b6137cb90610a1d565b90565b156137d557565b5f6312d5633960e31b8152806137ed6004820161082a565b0390fd5b6137fa90610a01565b90565b613806906137f1565b90565b61381290610a1d565b90565b61381e90613770565b9052565b60409061384b613852949695939661384160608401985f850190613815565b602083019061031d565b01906103cd565b565b91909161388461386382613770565b61387d6138776138725f611668565b610311565b91610311565b141561377c565b6138a08361389a6138945f611fe8565b91610377565b1161379f565b6138e060206138ae83613770565b6370a08231906138d56138c0306137c2565b926138c96102a2565b95869485938493612595565b83526004830161032a565b03915afa8015613a095761390f915f916139db575b5061390861390286610377565b91610377565b10156137ce565b61393461392361391e83613770565b613228565b61392d602561163c565b8591614691565b61394e613949613944602561163c565b6137fd565b613809565b9163f213159c90929092613962602661163c565b9490823b156139d6575f946139936139889361397c6102a2565b98899788968795612595565b855260048501613822565b03925af180156139d1576139a5575b50565b6139c4905f3d81116139ca575b6139bc8183611485565b81019061259b565b5f6139a2565b503d6139b2565b6125cd565b612591565b6139fc915060203d8111613a02575b6139f48183611485565b81019061324c565b5f6138f5565b503d6139ea565b6125cd565b916020613a2f929493613a2860408201965f83019061031d565b01906103cd565b565b90613a4e82613a48613a425f611fe8565b91610377565b1161379f565b613a7e613a5a306137c2565b31613a77613a71613a6c8686906119f0565b610377565b91610377565b10156137ce565b613a98613a93613a8e602561163c565b6137fd565b613809565b91613aa863e041043292826119f0565b92919291613ab6602661163c565b9193813b15613b2a575f93613adc91613ae7613ad06102a2565b97889687958694612595565b845260048401613a0e565b03925af18015613b2557613af9575b50565b613b18905f3d8111613b1e575b613b108183611485565b81019061259b565b5f613af6565b503d613b06565b6125cd565b612591565b90565b613b46613b41613b4b92613b2f565b6102cd565b610377565b90565b613b777f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b613b8261174b565b508081613b8d612728565b918215613bea570981613b9e612728565b918215613be5570990613baf612728565b918215613be05708613bbf613b4e565b613bc7612728565b908115613bdb57613bd8920861476f565b90565b612ac7565b612ac7565b612ac7565b612ac7565b5f7f6d736748617368206f7574206f662072616e6765000000000000000000000000910152565b613c236014602092611562565b613c2c81613bef565b0190565b613c459060208101905f818303910152613c16565b90565b15613c4f57565b613c576102a2565b62461bcd60e51b815280613c6d60048201613c30565b0390fd5b5f7f73206f7574206f662072616e6765000000000000000000000000000000000000910152565b613ca5600e602092611562565b613cae81613c71565b0190565b613cc79060208101905f818303910152613c98565b90565b15613cd157565b613cd96102a2565b62461bcd60e51b815280613cef60048201613cb2565b0390fd5b90565b613d0a613d05613d0f92613cf3565b6102cd565b610377565b90565b613d1c60fb613cf6565b90565b1b90565b613d4290613d3c613d36613d4794610377565b91610377565b90613d1f565b610377565b90565b5f7f72206f7574206f662072616e6765000000000000000000000000000000000000910152565b613d7e600e602092611562565b613d8781613d4a565b0190565b613da09060208101905f818303910152613d71565b90565b15613daa57565b613db26102a2565b62461bcd60e51b815280613dc860048201613d8b565b0390fd5b5f7f77206f7574206f662072616e6765000000000000000000000000000000000000910152565b613e00600e602092611562565b613e0981613dcc565b0190565b613e229060208101905f818303910152613df3565b90565b15613e2c57565b613e346102a2565b62461bcd60e51b815280613e4a60048201613e0d565b0390fd5b613e65600167080000000000001160c01b0161270c565b90565b613e917f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b90565b613eab613ea6613eb092613e94565b6102cd565b610377565b90565b613edc7f01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca613e97565b90565b90565b613ef6613ef1613efb92613edf565b6102cd565b610377565b90565b613f267e5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f613ee2565b90565b613f336001612d1e565b90565b5f7f494e56414c49445f535441524b5f5349474e4154555245000000000000000000910152565b613f6a6017602092611562565b613f7381613f36565b0190565b613f8c9060208101905f818303910152613f5d565b90565b15613f9657565b613f9e6102a2565b62461bcd60e51b815280613fb460048201613f77565b0390fd5b90929161401f90613fec613fd484613fce612a9b565b90612adb565b613fe6613fe086610377565b91610377565b14613c48565b6001614000613ffa83610377565b91612d1e565b11158061422c575b61401190613cca565b614019612a9b565b90614849565b91600161403461402e86610377565b91612d1e565b1115806141f3575b61404590613da3565b600161405961405385610377565b91612d1e565b1115806141ba575b61406a90613e25565b8081614074613e4e565b9182156141b5570981614085613e4e565b9182156141b05709928586614098613e4e565b9182156141ab570993826140aa613e4e565b9182156141a65708936140bb613e68565b966140c4613e4e565b9384156141a15761415861413a61419397614101614175966140fb6140f561419f9f9b61418c9c6141999f08610377565b91610377565b146126e0565b614109612ce0565b50614112612ce0565b5061411b613eb3565b614123613efe565b61412b613f29565b91614134613e4e565b9361494c565b929092938a9190614149613f29565b91614152613e4e565b9361494c565b919091909291614166613f29565b9261416f613e4e565b94614993565b61417d613f29565b91614186613e4e565b9361494c565b5092610377565b91610377565b14613f8f565b565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b5061406a836141eb6141e56141e060016141db6141d5613d12565b91612d1e565b613d23565b610377565b91610377565b109050614061565b506140458461422461421e614219600161421461420e613d12565b91612d1e565b613d23565b610377565b91610377565b10905061403c565b506140118161424a61424461423f612a9b565b610377565b91610377565b109050614008565b5f90565b90565b90565b61427061426b61427592614256565b6117e3565b614259565b90565b6142a17ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061425c565b90565b6142ac614252565b506142b5614278565b90565b5f90565b6142d16142d6916142cb6142b8565b50612f74565b614a91565b90565b6142eb906142e561174b565b506142bc565b6143046142fe6142f96130ba565b613076565b91613076565b1490565b61431a9061431461174b565b506142bc565b61433361432d61432861308e565b613076565b91613076565b1490565b905090565b6143475f8092614337565b0190565b6143549061433c565b90565b90614369614364836128ef565b6114ae565b918252565b3d5f146143895761437e3d614357565b903d5f602084013e5b565b614391612dc0565b90614387565b5f7f4554485f5452414e534645525f4641494c454400000000000000000000000000910152565b6143cb6013602092611562565b6143d481614397565b0190565b6143ed9060208101905f8183039101526143be565b90565b156143f757565b6143ff6102a2565b62461bcd60e51b815280614415600482016143d8565b0390fd5b5f614446928192906144296102a2565b90816144348161434b565b03925af161444061436e565b506143f0565b565b61445d614462916144576115ed565b50612f74565b614b1f565b90565b5f7f4241445f544f4b454e5f41444452455353000000000000000000000000000000910152565b6144996011602092611562565b6144a281614465565b0190565b6144bb9060208101905f81830391015261448c565b90565b156144c557565b6144cd6102a2565b62461bcd60e51b8152806144e3600482016144a6565b0390fd5b90565b156144f25750565b614513906144fe6102a2565b91829162461bcd60e51b83526004830161159c565b0390fd5b61452081610652565b0361452757565b5f80fd5b9050519061453882614517565b565b9060208282031261455357614550915f0161452b565b90565b6102ac565b5f7f544f4b454e5f4f5045524154494f4e5f4641494c454400000000000000000000910152565b61458c6016602092611562565b61459581614558565b0190565b6145ae9060208101905f81830391015261457f565b90565b156145b857565b6145c06102a2565b62461bcd60e51b8152806145d660048201614599565b0390fd5b5f9182916145ef6145ea82614b50565b6144be565b9082602082019151925af161461561460561436e565b9161460f836144e7565b906144ea565b61461e816113d1565b61463061462a5f611fe8565b91610377565b11614639575b50565b61465661465b91602061464b826113d1565b81830101910161453a565b6145b1565b5f614636565b61466a90611fe8565b9052565b91602061468f92949361468860408201965f83019061031d565b0190614661565b565b90916146d46004916146c563095ea7b36146ac879391613273565b926146b56102a2565b9586946020860190815201613a0e565b60208201810382520382611485565b906146e96146e3828490614b79565b15610652565b6146f3575b505050565b61474060046147459461473b849161472c63095ea7b36147135f91613273565b9261471c6102a2565b968794602086019081520161466e565b60208201810382520383611485565b614c1b565b614c1b565b5f80806146ee565b61475961475f91610377565b91610377565b90811561476a570490565b612ac7565b61477761174b565b506147c36147bd6147b86001936147b26147a2614792612728565b61479c6001612d1e565b9061334d565b6147ac60026136b6565b9061474d565b90614e06565b610377565b91612d1e565b1490565b5f7f496e76616c6964206e756d626572000000000000000000000000000000000000910152565b6147fb600e602092611562565b614804816147c7565b0190565b61481d9060208101905f8183039101526147ee565b90565b1561482757565b61482f6102a2565b62461bcd60e51b81528061484560048201614808565b0390fd5b614851612ce0565b508061486561485f5f611fe8565b91610377565b141580614931575b80614911575b61487c90614820565b6148855f611fe8565b61488f6001612d1e565b8390614899612ce0565b505b836148ae6148a85f611fe8565b91610377565b14614909576148be82859061474d565b81939186829188908115614904576148d793099061334d565b918680156148ff576148f8936148f292089495809492613662565b9061334d565b929161489b565b612ac7565b612ac7565b505091505090565b5061487c826149286149225f611fe8565b91610377565b14159050614873565b508061494561493f84610377565b91610377565b141561486d565b9161498d94939161497f9361495f612ce0565b50614968612ce0565b509091600193926149798795612d1e565b92614e8f565b929190929092909192614fa9565b91909190565b92909493916149a0612ce0565b506149a9612ce0565b506149b35f611fe8565b506149bd5f611fe8565b506149c75f611fe8565b50836149db6149d583610377565b91610377565b145f14614a595750849084918215614a545708614a006149fa5f611fe8565b91610377565b145f14614a2357505050505f90614a20614a1a5f93611fe8565b92611fe8565b90565b614a4e93614a3f9260019291614a398694612d1e565b9161586c565b92919290925b92909192614fa9565b91909190565b612ac7565b915093614a4e94614a879391906001939091600190614a81614a7b8997612d1e565b92612d1e565b9461514d565b9291929092614a45565b602090614a9c6142b8565b50015163ffffffff60e01b1690565b90565b614ac2614abd614ac792614aab565b6102cd565b610377565b90565b614ad46020614aae565b90565b90565b614aee614ae9614af392614ad7565b6102cd565b610377565b90565b614b006004614ada565b90565b614b1c614b0e614aca565b614b16614af6565b906119f0565b90565b614b48614b4d91614b2e6115ed565b50614b37614b03565b90614b40612ce0565b5001516116a5565b610a1d565b90565b614b5861174b565b50614b61612ce0565b503b614b75614b6f5f611fe8565b91610377565b1190565b905f602091614b8661174b565b50614b8f61174b565b50614b98612ce0565b50614ba1612ce0565b50828151910182855af13d915f51919283614bbd575b50505090565b90919250614bd3614bcd5f611fe8565b91610377565b145f14614c0157614be49150613234565b3b614bf7614bf15f611fe8565b91610377565b115b5f8080614bb7565b50614c15614c0f6001612d1e565b91610377565b14614bf9565b905f602091614c28612ce0565b50614c31612ce0565b50828151910182855af115614cc4573d5f5190614c56614c505f611fe8565b91610377565b145f14614caa5750614c6781613234565b3b614c7a614c745f611fe8565b91610377565b145b614c835750565b614c8f614ca691613234565b5f918291635274afe760e01b83526004830161032a565b0390fd5b614cbd614cb76001612d1e565b91610377565b1415614c7c565b6040513d5f823e3d90fd5b90565b614ce6614ce1614ceb92614ccf565b6102cd565b6102c2565b90565b614cf790614cd2565b90565b60ff1690565b614d14614d0f614d1992614aab565b6102cd565b614cfa565b90565b614d2590614d00565b9052565b9194614d71614d7b92989795614d6760a096614d5d614d829a614d5360c08a019e5f8b0190614d1c565b6020890190614d1c565b6040870190614d1c565b60608501906103cd565b60808301906103cd565b01906103cd565b565b5f7f4649454c445f504f575f4641494c454400000000000000000000000000000000910152565b614db86010602092611562565b614dc181614d84565b0190565b614dda9060208101905f818303910152614dab565b90565b15614de457565b614dec6102a2565b62461bcd60e51b815280614e0260048201614dc5565b0390fd5b5f8091614e8c93614e15612ce0565b50614e5c614e236005614cee565b92614e4d602091602094602091614e38612728565b92614e416102a2565b97889660208801614d29565b60208201810382520382611485565b602081019051915afa614e76614e7061436e565b91614ddd565b6020614e81826113d1565b81830101910161324c565b90565b9493929194614e9c612ce0565b50614ea5612ce0565b50614eae612ce0565b5080614ec2614ebc5f611fe8565b91610377565b14614f9b579590614ed25f611fe8565b95614edc5f611fe8565b93614ee76001612d1e565b985b80614efc614ef65f611fe8565b91610377565b14614f8a5780614f0c6001612d1e565b16614f1f614f195f611fe8565b91610377565b03614f5c575b90614f3e614f4a9392614f3860026136b6565b9061474d565b9391908791899361586c565b97919794909792979197949094614ee9565b97614f3e95829a614f4a9493614f7a93929187908692938d9561514d565b9a91969096999192935050614f25565b505050509250929050919291929190565b509150939150919291929190565b91614fcb9094939194614fba612ce0565b50614fc3612ce0565b508290614849565b918283839182156150095709908183918215615004570994929082918215614fff570990918215614ffa570990565b612ac7565b612ac7565b612ac7565b612ac7565b67ffffffffffffffff81116150235760200290565b611471565b6150346150399161500e565b6114ae565b90565b369037565b9061505f61504e83615028565b92615059849161500e565b9061503c565b565b61506b6004615041565b90565b50600490565b9061507e8261506e565b81101561508c576020020190565b61226c565b9061509b90610377565b9052565b6150a99051610377565b90565b90565b6150c36150be6150c8926150ac565b6102cd565b610377565b90565b5f7f557365206a6163446f75626c652066756e6374696f6e20696e73746561640000910152565b6150ff601e602092611562565b615108816150cb565b0190565b6151219060208101905f8183039101526150f2565b90565b1561512b57565b6151336102a2565b62461bcd60e51b8152806151496004820161510c565b0390fd5b92969495969390919361515e612ce0565b50615167612ce0565b50615170612ce0565b508361518461517e5f611fe8565b91610377565b1480615833575b61582457806151a261519c5f611fe8565b91610377565b148061580a575b6157fb576151b5615061565b9285868a9081156157f6576151dd92096151d8866151d25f611fe8565b90615074565b615091565b856151f96151f4866151ee5f611fe8565b90615074565b61509f565b8a9081156157f15761521f920961521a866152146001612d1e565b90615074565b615091565b87888a9081156157ec5761524792096152428661523c60026136b6565b90615074565b615091565b8761526461525f8661525960026136b6565b90615074565b61509f565b8a9081156157e75761528a92096152858661527f60036150af565b90615074565b615091565b6152946004615028565b946152b16152ac866152a660026136b6565b90615074565b61509f565b8a9081156157e2576152c692095f8701615091565b6152e26152dd856152d760036150af565b90615074565b61509f565b899081156157dd576152f8920960208601615091565b9061531461530f846153095f611fe8565b90615074565b61509f565b90889283156157d8576153499361534493615333920960408701615091565b9261533e6001612d1e565b90615074565b61509f565b869081156157d35761535f920960608301615091565b9361537b615376866153705f611fe8565b90615074565b61509f565b6153a86153a261539d6153988961539260026136b6565b90615074565b61509f565b610377565b91610377565b1415801561577d575b6153ba90615124565b6153c2615061565b936153df6153da876153d460026136b6565b90615074565b61509f565b615404836153fe6153f98a6153f35f611fe8565b90615074565b61509f565b9061334d565b839081156157785761542992086154248761541e5f611fe8565b90615074565b615091565b6154456154408761543a60036150af565b90615074565b61509f565b61546b836154656154608a61545a6001612d1e565b90615074565b61509f565b9061334d565b8390811561577357615491920861548c876154866001612d1e565b90615074565b615091565b6154ac6154a7866154a15f611fe8565b90615074565b61509f565b6154c76154c2876154bc5f611fe8565b90615074565b61509f565b8390811561576e576154ed92096154e8876154e260026136b6565b90615074565b615091565b615509615504866154fe60026136b6565b90615074565b61509f565b61552461551f876155195f611fe8565b90615074565b61509f565b839081156157695761554a92096155458761553f60036150af565b90615074565b615091565b6155666155618661555b6001612d1e565b90615074565b61509f565b61558261557d876155776001612d1e565b90615074565b61509f565b8391821561576457096155b1836155ab6155a6896155a060036150af565b90615074565b61509f565b9061334d565b8391821561575f5708826002906155d96155d48a6155ce5f611fe8565b90615074565b61509f565b6155f56155f08a6155ea60026136b6565b90615074565b61509f565b8691821561575a57098590811561575557615612615619946136b6565b099061334d565b8391821561575057089561563f61563a876156346001612d1e565b90615074565b61509f565b61565a6156558361564f5f611fe8565b90615074565b61509f565b6156766156718961566b60026136b6565b90615074565b61509f565b8591821561574b570961568a858a9061334d565b859182156157465708849182156157415709906156ba6156b585926156af6001612d1e565b90615074565b61509f565b906156d76156d2896156cc60036150af565b90615074565b61509f565b8590811561573c576156ea93099061334d565b90838015615737576157109261570b9208966157055f611fe8565b90615074565b61509f565b92908291821561573257099091821561572d570992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b506153ba61579d615798876157926001612d1e565b90615074565b61509f565b6157ca6157c46157bf6157ba8a6157b460036150af565b90615074565b61509f565b610377565b91610377565b141590506153b1565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b50509350909350919291929190565b508161581e6158185f611fe8565b91610377565b146151a9565b93509495505050919291929190565b50826158476158415f611fe8565b91610377565b1461518b565b90565b61586461585f6158699261584d565b6102cd565b610377565b90565b9492949390919361587b612ce0565b50615884612ce0565b5061588d612ce0565b50846158a161589b5f611fe8565b91610377565b14615a2357808183918215615a1e570995838484918215615a19570991868785918215615a145709906004908486918215615a0f570985918215615a0a576158e890614ada565b099760039085918215615a05576158fe906150af565b0991908085918215615a005709849182156159fb5709839182156159f65708958687849182156159f1570983829083869081156159ec5761594093089061334d565b849182156159e75708969061595684899061334d565b849182156159e25708839182156159dd5709908260089180859182156159d85709849081156159d35761598b61599294615850565b099061334d565b829182156159ce57089360029290829182156159c95709909182156159c4576159ba906136b6565b0992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b919394505091929192919056fea26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","sourceMap":"868:4258:26:-:0;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;:::o;2126:53:25:-;;;:::i;:::-;;;:::i;:::-;:::o;868:4258:26:-;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1818:40:17:-;1857:1;;;:::i;:::-;1818:40;:::o;1857:1::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;2037:52::-;2061:21;2071:11;;:::i;:::-;2061:21;;:::i;:::-;2037:52::o;868:4258:26:-;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;:::o;:::-;2061:21:17;868:4258:26;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;2061:21:17;868:4258:26;;;;;;:::o;:::-;;;2061:21:17;868:4258:26;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;7709:422:13:-;7857:26;;:::i;:::-;7898:15;;:1;:15;;:::i;:::-;7894:76;;7983:14;;:1;:14;;:::i;:::-;:34;;2061:21:17;868:4258:26;;;;7983:34:13;:::i;:::-;;;:::i;:::-;;7979:146;;7709:422;;:::o;7979:146::-;8033:33;868:4258:26;8033:14:13;2061:21:17;868:4258:26;;;;8033:1:13;:14;:33;:::i;:::-;2061:21:17;868:4258:26;;;;8085:29:13;;;;;:::i;:::-;;;;;;:::i;:::-;;;;7979:146;;;7894:76;7936:23;;;;;;;;;;;;:::i;:::-;;;;9071:205;9186:27;;:::i;:::-;9071:205;:::o;868:4258:26:-;;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3098:115:13:-;3147:66;;;:::i;:::-;3098:115;:::o;8819:122::-;8887:7;;:::i;:::-;8913:21;;;:::i;:::-;8906:28;:::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","offset":23871}},"transformations":[],"transformationValues":{}},"runtimeBytecode":{"onchainBytecode":"0x60806040526004361015610013575b6115e9565b61001d5f3561029c565b8063011e1167146102975780631710abaa14610292578063187ac4cb1461028d5780631dbd1da7146102885780631f0e8a12146102835780631f7daf0f1461027e57806330eff5dd1461027957806333eeb1471461027457806334759ca71461026f578063429a82081461026a578063439fab9114610265578063441a3e701461026057806346a577ed1461025b5780634780404d1461025657806354f3ea7f14610251578063556cf28b1461024c578063582b9044146102475780635837397114610242578063701f9fae1461023d5780637feaf0571461023857806386aeb4451461023357806387ec36e31461022e578063988760b0146102295780639a0fa042146102245780639cec9aaa1461021f578063b8ad077d1461021a578063b937f8f714610215578063bea8418714610210578063ccefe7b01461020b578063dd7202d814610206578063e2d8efd014610201578063e6fb8119146101fc578063e8a91f30146101f7578063e9f5a4a8146101f2578063ec3161b0146101ed578063ed3914d4146101e8578063ee4d01bf146101e3578063f405f17a146101de578063f637d950146101d95763ffa1ad740361000e576115b4565b61143c565b61139c565b61134a565b6112da565b611268565b611233565b6111ef565b611197565b61113f565b6110b4565b61107f565b610ff2565b610f48565b610edb565b610e83565b610df8565b610da0565b610d3c565b610d08565b610c8d565b610c54565b610baa565b610b52565b610ae2565b610a57565b61098c565b610919565b610890565b61082f565b610774565b610704565b610679565b61061d565b610592565b61053a565b6104e2565b610468565b6103ef565b61033f565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f9103126102ba57565b6102ac565b90565b60018060a01b031690565b90565b6102e46102df6102e9926102bf565b6102cd565b6102c2565b90565b6102f5906102d0565b90565b610303610eee6102ec565b90565b61030e6102f8565b90565b61031a906102c2565b90565b61032690610311565b9052565b919061033d905f6020850194019061031d565b565b3461036f5761034f3660046102b0565b61036b61035a610306565b6103626102a2565b9182918261032a565b0390f35b6102a8565b90565b90565b61038e61038961039392610374565b6102cd565b610377565b90565b6103bf7f01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb061037a565b90565b6103ca610396565b90565b6103d690610377565b9052565b91906103ed905f602085019401906103cd565b565b3461041f576103ff3660046102b0565b61041b61040a6103c2565b6104126102a2565b918291826103da565b0390f35b6102a8565b1c90565b60018060a01b031690565b6104439060086104489302610424565b610428565b90565b906104569154610433565b90565b61046560275f9061044b565b90565b34610498576104783660046102b0565b610494610483610459565b61048b6102a2565b9182918261032a565b0390f35b6102a8565b5f80fd5b6104aa81610377565b036104b157565b5f80fd5b905035906104c2826104a1565b565b906020828203126104dd576104da915f016104b5565b90565b6102ac565b346105125761050e6104fd6104f83660046104c4565b6116c1565b6105056102a2565b9182918261032a565b0390f35b6102a8565b73ce5a537d4da620de59efa6f74a0a065732600c7190565b610537610517565b90565b3461056a5761054a3660046102b0565b61056661055561052f565b61055d6102a2565b9182918261032a565b0390f35b6102a8565b73941f54cb53dc1478cb126a2ba8a83b2130419db590565b61058f61056f565b90565b346105c2576105a23660046102b0565b6105be6105ad610587565b6105b56102a2565b9182918261032a565b0390f35b6102a8565b90565b6105de6105d96105e3926105c7565b6102cd565b610377565b90565b61060f7f01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df26105ca565b90565b61061a6105e6565b90565b3461064d5761062d3660046102b0565b610649610638610612565b6106406102a2565b918291826103da565b0390f35b6102a8565b151590565b61066090610652565b9052565b9190610677905f60208501940190610657565b565b346106a9576106893660046102b0565b6106a561069461174f565b61069c6102a2565b91829182610664565b0390f35b6102a8565b90565b6106c56106c06106ca926106ae565b6102cd565b610377565b90565b6106f67f0348958c1322d3fc34f89b91b0b6473594725847184ee590e990bb70ef322b166106b1565b90565b6107016106cd565b90565b34610734576107143660046102b0565b61073061071f6106f9565b6107276102a2565b918291826103da565b0390f35b6102a8565b90565b61075061074b61075592610739565b6102cd565b610377565b90565b6107666401c16b450061073c565b90565b610771610758565b90565b346107a4576107843660046102b0565b6107a061078f610769565b6107976102a2565b918291826103da565b0390f35b6102a8565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156107ef5781359167ffffffffffffffff83116107ea5760200192600183028401116107e557565b6107b1565b6107ad565b6107a9565b90602082820312610825575f82013567ffffffffffffffff81116108205761081c92016107b5565b9091565b61049d565b6102ac565b5f0190565b3461085e576108486108423660046107f4565b90611f42565b6108506102a2565b8061085a8161082a565b0390f35b6102a8565b919060408382031261088b578061087f610888925f86016104b5565b936020016104b5565b90565b6102ac565b346108bf576108a96108a3366004610863565b906120ec565b6108b16102a2565b806108bb8161082a565b0390f35b6102a8565b90565b6108db6108d66108e0926108c4565b6102cd565b610377565b90565b61090b7eb59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e49586108c7565b90565b6109166108e3565b90565b34610949576109293660046102b0565b61094561093461090e565b61093c6102a2565b918291826103da565b0390f35b6102a8565b90565b61096561096061096a9261094e565b6102cd565b610377565b90565b61097e6703b2c201ffc2e880610951565b90565b61098961096d565b90565b346109bc5761099c3660046102b0565b6109b86109a7610981565b6109af6102a2565b918291826103da565b0390f35b6102a8565b60018060a01b031690565b6109dc9060086109e19302610424565b6109c1565b90565b906109ef91546109cc565b90565b6109fe60285f906109e4565b90565b610a15610a10610a1a926102c2565b6102cd565b6102c2565b90565b610a2690610a01565b90565b610a3290610a1d565b90565b610a3e90610a29565b9052565b9190610a55905f60208501940190610a35565b565b34610a8757610a673660046102b0565b610a83610a726109f2565b610a7a6102a2565b91829182610a42565b0390f35b6102a8565b90565b610aa3610a9e610aa892610a8c565b6102cd565b610377565b90565b610ad47f07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753610a8f565b90565b610adf610aab565b90565b34610b1257610af23660046102b0565b610b0e610afd610ad7565b610b056102a2565b918291826103da565b0390f35b6102a8565b90565b610b2e610b29610b3392610b17565b6102cd565b610377565b90565b610b44641d1a94a200610b1a565b90565b610b4f610b36565b90565b34610b8257610b623660046102b0565b610b7e610b6d610b47565b610b756102a2565b918291826103da565b0390f35b6102a8565b73216e8577b504ac3db213edd261e47fffbb35424890565b610ba7610b87565b90565b34610bda57610bba3660046102b0565b610bd6610bc5610b9f565b610bcd6102a2565b9182918261032a565b0390f35b6102a8565b909182601f83011215610c195781359167ffffffffffffffff8311610c14576020019260608302840111610c0f57565b6107b1565b6107ad565b6107a9565b90602082820312610c4f575f82013567ffffffffffffffff8111610c4a57610c469201610bdf565b9091565b61049d565b6102ac565b610c68610c62366004610c1e565b90612509565b610c706102a2565b80610c7a8161082a565b0390f35b610c8a60255f9061044b565b90565b34610cbd57610c9d3660046102b0565b610cb9610ca8610c7e565b610cb06102a2565b9182918261032a565b0390f35b6102a8565b919091604081840312610d0357610cdb835f83016104b5565b92602082013567ffffffffffffffff8111610cfe57610cfa92016107b5565b9091565b61049d565b6102ac565b34610d3757610d21610d1b366004610cc2565b91612515565b610d296102a2565b80610d338161082a565b0390f35b6102a8565b610d473660046102b0565b610d4f61267d565b610d576102a2565b80610d618161082a565b0390f35b90565b610d7c610d77610d8192610d65565b6102cd565b610377565b90565b610d926436b7176e00610d68565b90565b610d9d610d84565b90565b34610dd057610db03660046102b0565b610dcc610dbb610d95565b610dc36102a2565b918291826103da565b0390f35b6102a8565b73bc6eeb5111fea2b5e9b2bc534bbcbca9568999a490565b610df5610dd5565b90565b34610e2857610e083660046102b0565b610e24610e13610ded565b610e1b6102a2565b9182918261032a565b0390f35b6102a8565b90565b610e44610e3f610e4992610e2d565b6102cd565b610377565b90565b610e757f07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc610e30565b90565b610e80610e4c565b90565b34610eb357610e933660046102b0565b610eaf610e9e610e78565b610ea66102a2565b918291826103da565b0390f35b6102a8565b73409f85d2207796b543b8abdb6a0e2490bb1483d190565b610ed8610eb8565b90565b34610f0b57610eeb3660046102b0565b610f07610ef6610ed0565b610efe6102a2565b9182918261032a565b0390f35b6102a8565b90565b610f23906008610f289302610424565b610f10565b90565b90610f369154610f13565b90565b610f45600d5f90610f2b565b90565b34610f7857610f583660046102b0565b610f74610f63610f39565b610f6b6102a2565b918291826103da565b0390f35b6102a8565b610f8681610311565b03610f8d57565b5f80fd5b90503590610f9e82610f7d565b565b91606083830312610fed57610fb7825f8501610f91565b92610fc583602083016104b5565b92604082013567ffffffffffffffff8111610fe857610fe492016107b5565b9091565b61049d565b6102ac565b346110245761100e611005366004610fa0565b92919091612b2f565b6110166102a2565b806110208161082a565b0390f35b6102a8565b90565b61104061103b61104592611029565b6102cd565b610377565b90565b6110717f052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b43461102c565b90565b61107c611048565b90565b346110af5761108f3660046102b0565b6110ab61109a611074565b6110a26102a2565b918291826103da565b0390f35b6102a8565b346110e4576110e06110cf6110ca3660046104c4565b612d3a565b6110d76102a2565b918291826103da565b0390f35b6102a8565b90565b6111006110fb611105926110e9565b6102cd565b610377565b90565b6111317f025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca016110ec565b90565b61113c611108565b90565b3461116f5761114f3660046102b0565b61116b61115a611134565b6111626102a2565b918291826103da565b0390f35b6102a8565b7310cbbbb225bbea137ac01f0f6d91cdb126bccaa690565b611194611174565b90565b346111c7576111a73660046102b0565b6111c36111b261118c565b6111ba6102a2565b9182918261032a565b0390f35b6102a8565b735ebb994ebc1c44815fbf2fa61a6e1f8368dcb0c790565b6111ec6111cc565b90565b3461121f576111ff3660046102b0565b61121b61120a6111e4565b6112126102a2565b9182918261032a565b0390f35b6102a8565b61123060265f9061044b565b90565b34611263576112433660046102b0565b61125f61124e611224565b6112566102a2565b9182918261032a565b0390f35b6102a8565b346112995761129561128461127e366004610863565b90612d8e565b61128c6102a2565b918291826103da565b0390f35b6102a8565b90565b6112b56112b06112ba9261129e565b6102cd565b610377565b90565b6112cc650474dec268006112a1565b90565b6112d76112bd565b90565b3461130a576112ea3660046102b0565b6113066112f56112cf565b6112fd6102a2565b918291826103da565b0390f35b6102a8565b90565b61132661132161132b9261130f565b6102cd565b610377565b90565b61133c64590ec6d100611312565b90565b61134761132e565b90565b3461137a5761135a3660046102b0565b61137661136561133f565b61136d6102a2565b918291826103da565b0390f35b6102a8565b61138e650474dec268006112a1565b90565b61139961137f565b90565b346113cc576113ac3660046102b0565b6113c86113b7611391565b6113bf6102a2565b918291826103da565b0390f35b6102a8565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61141261141b60209361142093611409816113d1565b938480936113d5565b958691016113de565b6113e9565b0190565b6114399160208201915f8184039101526113f3565b90565b3461146c576114686114576114523660046104c4565b612f74565b61145f6102a2565b91829182611424565b0390f35b6102a8565b634e487b7160e01b5f52604160045260245ffd5b9061148f906113e9565b810190811067ffffffffffffffff8211176114a957604052565b611471565b906114c16114ba6102a2565b9283611485565b565b67ffffffffffffffff81116114e1576114dd6020916113e9565b0190565b611471565b906114f86114f3836114c3565b6114ae565b918252565b5f7f537461726b45782d494d582d4d6967726174696f6e2d312e302e300000000000910152565b61152e601b6114e6565b9061153b602083016114fd565b565b611545611524565b90565b61155061153d565b90565b61155b611548565b90565b5190565b60209181520190565b61158a611593602093611598936115818161155e565b93848093611562565b958691016113de565b6113e9565b0190565b6115b19160208201915f81840391015261156b565b90565b346115e4576115c43660046102b0565b6115e06115cf611553565b6115d76102a2565b9182918261159c565b0390f35b6102a8565b5f80fd5b5f90565b61160561160061160a92610377565b6102cd565b610377565b90565b90611617906115f1565b5f5260205260405f2090565b5f1c90565b61163461163991611623565b610428565b90565b6116469054611628565b90565b90565b61166061165b61166592611649565b6102cd565b6102c2565b90565b6116719061164c565b90565b90565b61168b61168661169092611674565b6102cd565b610377565b90565b6116a260018060a01b03611677565b90565b6116b96116b46116be92610377565b6102cd565b6102c2565b90565b6116c96115ed565b506116de6116d96018839061160d565b61163c565b806116f96116f36116ee5f611668565b610311565b91610311565b0361174657508061171b6117158361170f611693565b16610377565b91610377565b145f146117375761172e611733916116a5565b610a1d565b5b90565b506117415f611668565b611734565b905090565b5f90565b61175761174b565b505f90565b90565b67ffffffffffffffff1690565b61178061177b6117859261175c565b6102cd565b61175f565b90565b60401c90565b60ff1690565b6117a06117a591611788565b61178e565b90565b6117b29054611794565b90565b67ffffffffffffffff1690565b6117ce6117d391611623565b6117b5565b90565b6117e090546117c2565b90565b5f1b90565b906117fb67ffffffffffffffff916117e3565b9181191691161790565b61181961181461181e9261175f565b6102cd565b61175f565b90565b90565b9061183961183461184092611805565b611821565b82546117e8565b9055565b60401b90565b9061185e68ff000000000000000091611844565b9181191691161790565b61187190610652565b90565b90565b9061188c61188761189392611868565b611874565b825461184a565b9055565b6118a09061175f565b9052565b91906118b7905f60208501940190611897565b565b906118c4600261176c565b916118cd612faf565b906118d95f83016117a8565b801561196a575b61194e576119139261190a916118f8865f8601611824565b61190560015f8601611877565b611a98565b5f809101611877565b6119497fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916119406102a2565b918291826118a4565b0390a1565b5f63f92ee8a960e01b8152806119666004820161082a565b0390fd5b506119765f83016117d6565b6119886119828661175f565b9161175f565b10156118e0565b90611999906115f1565b5f5260205260405f2090565b906119af906115f1565b5f5260205260405f2090565b6119c76119cc91611623565b610f10565b90565b6119d990546119bb565b90565b634e487b7160e01b5f52601160045260245ffd5b6119ff611a0591939293610377565b92610377565b8201809211611a1057565b6119dc565b90611a215f19916117e3565b9181191691161790565b90565b90611a43611a3e611a4a926115f1565b611a2b565b8254611a15565b9055565b90611a5f60018060a01b03916117e3565b9181191691161790565b611a7290610a1d565b90565b90565b90611a8d611a88611a9492611a69565b611a75565b8254611a4e565b9055565b5050611ae1611aa561137f565b611adb611acc611abe6008611ab8610aab565b9061198f565b611ac66106cd565b906119a5565b91611ad6836119cf565b6119f0565b90611a2e565b611b28611aec610b36565b611b22611b13611b056008611aff610396565b9061198f565b611b0d6106cd565b906119a5565b91611b1d836119cf565b6119f0565b90611a2e565b611b6f611b33610758565b611b69611b5a611b4c6008611b46611048565b9061198f565b611b546106cd565b906119a5565b91611b64836119cf565b6119f0565b90611a2e565b611bb6611b7a6112bd565b611bb0611ba1611b936008611b8d610e4c565b9061198f565b611b9b6106cd565b906119a5565b91611bab836119cf565b6119f0565b90611a2e565b611bfd611bc161132e565b611bf7611be8611bda6008611bd46108e3565b9061198f565b611be26106cd565b906119a5565b91611bf2836119cf565b6119f0565b90611a2e565b611c44611c0861096d565b611c3e611c2f611c216008611c1b611108565b9061198f565b611c296106cd565b906119a5565b91611c39836119cf565b6119f0565b90611a2e565b611c8b611c4f610d84565b611c85611c76611c686008611c626105e6565b9061198f565b611c706106cd565b906119a5565b91611c80836119cf565b6119f0565b90611a2e565b611ca6611ca16018611c9b610aab565b9061160d565b61163c565b611cc0611cba611cb55f611668565b610311565b91610311565b14611f1a575b611ce1611cdc6018611cd6610396565b9061160d565b61163c565b611cfb611cf5611cf05f611668565b610311565b91610311565b14611ef2575b611d1c611d176018611d11611048565b9061160d565b61163c565b611d36611d30611d2b5f611668565b610311565b91610311565b14611eca575b611d57611d526018611d4c610e4c565b9061160d565b61163c565b611d71611d6b611d665f611668565b610311565b91610311565b14611ea2575b611d92611d8d6018611d876108e3565b9061160d565b61163c565b611dac611da6611da15f611668565b610311565b91610311565b14611e7a575b611dcd611dc86018611dc2611108565b9061160d565b61163c565b611de7611de1611ddc5f611668565b610311565b91610311565b14611e52575b611e08611e036018611dfd6105e6565b9061160d565b61163c565b611e22611e1c611e175f611668565b610311565b91610311565b14611e2a575b565b611e4d611e35610dd5565b611e486018611e426105e6565b9061160d565b611a78565b611e28565b611e75611e5d61056f565b611e706018611e6a611108565b9061160d565b611a78565b611ded565b611e9d611e85610517565b611e986018611e926108e3565b9061160d565b611a78565b611db2565b611ec5611ead610eb8565b611ec06018611eba610e4c565b9061160d565b611a78565b611d77565b611eed611ed5611174565b611ee86018611ee2611048565b9061160d565b611a78565b611d3c565b611f15611efd610b87565b611f106018611f0a610396565b9061160d565b611a78565b611d01565b611f3d611f256111cc565b611f386018611f32610aab565b9061160d565b611a78565b611cc6565b90611f4c916118b9565b565b611f5790610a01565b90565b611f6390611f4e565b90565b5f7f4e4f4e5f46554e4749424c455f41535345545f54595045000000000000000000910152565b611f9a6017602092611562565b611fa381611f66565b0190565b611fbc9060208101905f818303910152611f8d565b90565b15611fc657565b611fce6102a2565b62461bcd60e51b815280611fe460048201611fa7565b0390fd5b611ffc611ff761200192611649565b6102cd565b610377565b90565b5f7f4e4f5f50454e44494e475f5749544844524157414c0000000000000000000000910152565b6120386015602092611562565b61204181612004565b0190565b61205a9060208101905f81830391015261202b565b90565b1561206457565b61206c6102a2565b62461bcd60e51b81528061208260048201612045565b0390fd5b61208f90610a1d565b90565b61209b90612086565b9052565b909594926120ea946120d96120e3926120cf6080966120c560a088019c5f8901906103cd565b60208701906103cd565b60408501906103cd565b60608301906103cd565b0190612092565b565b906120fe6120f98361303c565b611f5a565b61210f61210a836130e6565b611fbf565b6121c182936121756121356121306121296008859061198f565b88906119a5565b6119cf565b956121528761214c6121465f611fe8565b91610377565b1161205d565b61217061215e5f611fe8565b9161216b6008869061198f565b6119a5565b611a2e565b612181838587916133f4565b9161218d848690613697565b947fb7477a7b93b2addc5272bbd7ad0986ef1c0d0bd265f26c3dc4bbe42727c2ac0c956121b86102a2565b9586958661209f565b0390a1565b906121d8916121d36136df565b612205565b6121e0613754565b565b156121e957565b5f636e7e1ba960e11b8152806122016004820161082a565b0390fd5b906122349161222f3361222961222361221e602761163c565b610311565b91610311565b146121e2565b61230d565b565b5090565b1561224157565b5f635091728960e01b8152806122596004820161082a565b0390fd5b60016122699101610377565b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015612290576060020190565b61226c565b3561229f81610f7d565b90565b356122ac816104a1565b90565b156122b657565b5f63dd3bd7d760e01b8152806122ce6004820161082a565b0390fd5b6122db90610a01565b90565b6122e7906122d2565b90565b156122f157565b5f631733f9d760e01b8152806123096004820161082a565b0390fd5b9061233461231c838390612236565b61232e6123285f611fe8565b91610377565b1161223a565b61233d5f611fe8565b916123475f611fe8565b5b8061236561235f61235a858790612236565b610377565b91610377565b10156124e857612468906123855f61237f85878591612280565b01612295565b61239c602061239686888691612280565b016122a2565b6123c16123b660406123b0888a8891612280565b016122a2565b9291929788906119f0565b966123df886123d86123d234610377565b91610377565b11156122af565b816123f96123f36123ee6102f8565b610311565b91610311565b145f1461246d5761240b915082613a31565b612415602661163c565b339061245f61244d6124477f680cdeb18e0632eaae1727127d3005efb3ea5dba23e34446c9e94cf2cf5f557793611a69565b93611a69565b936124566102a2565b918291826103da565b0390a35b61225d565b612348565b6124839061247a836122de565b90849091613854565b61248d602661163c565b33916124e06124ce6124c86124c27fbaffede578523e7bb616324498f96acc5cd38e6c6168c976d67866fb78ea958d94611a69565b94611a69565b94611a69565b946124d76102a2565b918291826103da565b0390a4612463565b505050612507906125016124fb34610377565b91610377565b146122ea565b565b90612513916121c6565b565b9091612525923392909192612b2f565b565b61252f6136df565b612537612541565b61253f613754565b565b6125663361256061255a612555602761163c565b610311565b91610311565b146121e2565b61256e6125dd565b565b61257c61258191611623565b6109c1565b90565b61258e9054612570565b90565b5f80fd5b60e01b90565b5f9103126125a557565b6102ac565b9160206125cb9294936125c460408201965f8301906103cd565b019061031d565b565b6125d56102a2565b3d5f823e3d90fd5b6125ef6125ea6028612584565b610a29565b63168b5ab73491909190612603600d6119cf565b903393813b15612678575f9361262a9161263561261e6102a2565b97889687958694612595565b8452600484016125aa565b03925af1801561267357612647575b50565b612666905f3d811161266c575b61265e8183611485565b81019061259b565b5f612644565b503d612654565b6125cd565b612591565b612685612527565b565b5f7f494e56414c49445f535441524b5f4b4559000000000000000000000000000000910152565b6126bb6011602092611562565b6126c481612687565b0190565b6126dd9060208101905f8183039101526126ae565b90565b156126e757565b6126ef6102a2565b62461bcd60e51b815280612705600482016126c8565b0390fd5b90565b61272061271b61272592612709565b6102cd565b610377565b90565b61273f600167080000000000001160c01b0161270c565b90565b5f7f494e56414c49445f4554485f4144445245535300000000000000000000000000910152565b6127766013602092611562565b61277f81612742565b0190565b6127989060208101905f818303910152612769565b90565b156127a257565b6127aa6102a2565b62461bcd60e51b8152806127c060048201612783565b0390fd5b5f7f535441524b5f4b45595f554e415641494c41424c450000000000000000000000910152565b6127f86015602092611562565b612801816127c4565b0190565b61281a9060208101905f8183039101526127eb565b90565b1561282457565b61282c6102a2565b62461bcd60e51b81528061284260048201612805565b0390fd5b5090565b90565b61286161285c6128669261284a565b6102cd565b610377565b90565b5f7f494e56414c49445f535441524b5f5349474e41545552455f4c454e4754480000910152565b61289d601e602092611562565b6128a681612869565b0190565b6128bf9060208101905f818303910152612890565b90565b156128c957565b6128d16102a2565b62461bcd60e51b8152806128e7600482016128aa565b0390fd5b5f80fd5b67ffffffffffffffff811161290d576129096020916113e9565b0190565b611471565b90825f939282370152565b9092919261293261292d826128ef565b6114ae565b9381855260208501908284011161294e5761294c92612912565b565b6128eb565b61295e91369161291d565b90565b9050519061296e826104a1565b565b90916060828403126129a5576129a261298b845f8501612961565b936129998160208601612961565b93604001612961565b90565b6102ac565b905090565b5f7f55736572526567697374726174696f6e3a000000000000000000000000000000910152565b6129e2601180926129aa565b6129eb816129af565b0190565b60601b90565b6129fe906129ef565b90565b612a0a906129f5565b90565b612a19612a1e91610311565b612a01565b9052565b90565b612a31612a3691610377565b612a22565b9052565b601460209392612a56612a4f612a5e946129d6565b8092612a0d565b018092612a25565b0190565b60200190565b612a74612a7991611623565b6115f1565b90565b90565b612a93612a8e612a9892612a7c565b6102cd565b610377565b90565b612ac47f0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f612a7f565b90565b634e487b7160e01b5f52601260045260245ffd5b612ae7612aed91610377565b91610377565b908115612af8570690565b612ac7565b604090612b26612b2d9496959396612b1c60608401985f85019061031d565b60208301906103cd565b019061031d565b565b91612c15612c8d9294612c2b92612b5987612b52612b4c5f611fe8565b91610377565b14156126e0565b612b7c87612b76612b70612b6b612728565b610377565b91610377565b106126e0565b612ba186612b9a612b94612b8f5f611668565b610311565b91610311565b141561279b565b612bd8612bb8612bb360188a9061160d565b61163c565b612bd2612bcc612bc75f611668565b610311565b91610311565b1461281d565b612be9612be488613b7a565b6126e0565b612c10612bf7828490612846565b612c0a612c04606061284d565b91610377565b146128c2565b612953565b6020612c20826113d1565b818301019101612970565b90612c84612c7686612c5e8991612c4f612c436102a2565b93849260208401612a3a565b60208201810382520382611485565b612c70612c6a826113d1565b91612a62565b20612a68565b612c7e612a9b565b90612adb565b92869293613fb8565b612ca281612c9d6018859061160d565b611a78565b903391612cdb7fcab1cf17c190e4e2195a7b8f7b362023246fa774390432b4704ab6b29d56b07b93612cd26102a2565b93849384612afd565b0390a1565b5f90565b90612cee906115f1565b5f5260205260405f2090565b612d06612d0b91611623565b61178e565b90565b612d189054612cfa565b90565b90565b612d32612d2d612d3792612d1b565b6102cd565b610377565b90565b612d42612ce0565b50612d60612d5a612d5560158490612ce4565b612d0e565b15610652565b5f14612d755750612d716001612d1e565b905b565b612d83612d889160166119a5565b6119cf565b90612d73565b612db7612db2612dbd93612da0612ce0565b50612dad8194600861198f565b6119a5565b6119cf565b90613697565b90565b606090565b5f7f41535345545f545950455f4e4f545f5245474953544552454400000000000000910152565b612df96019602092611562565b612e0281612dc5565b0190565b612e1b9060208101905f818303910152612dec565b90565b15612e2557565b612e2d6102a2565b62461bcd60e51b815280612e4360048201612e06565b0390fd5b90612e51906115f1565b5f5260205260405f2090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015612e91575b6020831014612e8c57565b612e5d565b91607f1691612e81565b60209181520190565b5f5260205f2090565b905f9291805490612ec7612ec083612e71565b8094612e9b565b916001811690815f14612f1e5750600114612ee2575b505050565b612eef9192939450612ea4565b915f925b818410612f0657505001905f8080612edd565b60018160209295939554848601520191019290612ef3565b92949550505060ff19168252151560200201905f8080612edd565b90612f4391612ead565b90565b90612f66612f5f92612f566102a2565b93848092612f39565b0383611485565b565b612f7190612f46565b90565b612fa7612fac91612f83612dc0565b50612fa0612f9b612f9660158490612ce4565b612d0e565b612e1e565b6014612e47565b612f68565b90565b612fb76142a4565b90565b5f7f555345525f554e52454749535445524544000000000000000000000000000000910152565b612fee6011602092611562565b612ff781612fba565b0190565b6130109060208101905f818303910152612fe1565b90565b1561301a57565b6130226102a2565b62461bcd60e51b81528061303860048201612ffb565b0390fd5b61304e906130486115ed565b506116c1565b906130748261306d6130676130625f611668565b610311565b91610311565b1415613013565b565b63ffffffff60e01b1690565b61308b90613076565b90565b6130b77f8322fff276cdf3f5716784c2e78b276d0d5cf1781fe7a7984e8bff96f75632c6613082565b90565b6130e37ff47261b06eedbfce68afd46d0f3c27c60b03faad319eaf33103611cf8f6456ad613082565b90565b6130f8906130f261174b565b506142bc565b8061311261310c61310761308e565b613076565b91613076565b1490811561311f575b5090565b905061313a61313461312f6130ba565b613076565b91613076565b145f61311b565b5f7f494e56414c49445f524543495049454e54000000000000000000000000000000910152565b6131756011602092611562565b61317e81613141565b0190565b6131979060208101905f818303910152613168565b90565b156131a157565b6131a96102a2565b62461bcd60e51b8152806131bf60048201613182565b0390fd5b5f7f554e535550504f525445445f544f4b454e5f5459504500000000000000000000910152565b6131f76016602092611562565b613200816131c3565b0190565b6132199060208101905f8183039101526131ea565b90565b61322590610a01565b90565b6132319061321c565b90565b61323d90610a1d565b90565b61324990610a1d565b90565b9060208282031261326557613262915f01612961565b90565b6102ac565b63ffffffff1690565b61328761328261328c9261326a565b612595565b613076565b90565b613298906102c2565b90565b6132a49061328f565b9052565b9160206132c99294936132c260408201965f83019061329b565b01906103cd565b565b5f7f554e444552464c4f570000000000000000000000000000000000000000000000910152565b6132ff6009602092611562565b613308816132cb565b0190565b6133219060208101905f8183039101526132f2565b90565b1561332b57565b6133336102a2565b62461bcd60e51b8152806133496004820161330c565b0390fd5b61335c61336291939293610377565b92610377565b820391821161336d57565b6119dc565b5f7f494e434f52524543545f414d4f554e545f5452414e5346455252454400000000910152565b6133a6601c602092611562565b6133af81613372565b0190565b6133c89060208101905f818303910152613399565b90565b156133d257565b6133da6102a2565b62461bcd60e51b8152806133f0600482016133b3565b0390fd5b909161341b8261341461340e6134095f611668565b610311565b91612086565b141561319a565b613426838290613697565b90613430846142d9565b5f146135fd576134486134425f611fe8565b91610377565b146135f85761345961349f93614448565b61346281613228565b602061346d82613234565b6370a082319061349461347f30613240565b926134886102a2565b998a9485938493612595565b83526004830161032a565b03915afa9081156135f35761350460209360046134fe6135099561353b9a5f916135c6575b50986134f06134d663a9059cbb613273565b918a906134e16102a2565b9586948c8601908152016132a8565b888201810382520382611485565b906145da565b613234565b6370a082319061353061351b30613240565b926135246102a2565b97889485938493612595565b83526004830161032a565b03915afa80156135c15761357f61358a9261358492613590965f91613593575b506135798161357261356c89610377565b91610377565b1115613324565b9461334d565b610377565b91610377565b146133cb565b5b565b6135b4915060203d81116135ba575b6135ac8183611485565b81019061324c565b5f61355b565b503d6135a2565b6125cd565b6135e69150883d81116135ec575b6135de8183611485565b81019061324c565b5f6134c4565b503d6135d4565b6125cd565b505050565b90919261360990614308565b5f146136405761362161361b5f611fe8565b91610377565b1461363c5761363261363792612086565b614419565b613591565b5050565b6136486102a2565b62461bcd60e51b81528061365e60048201613204565b0390fd5b61367161367791939293610377565b92610377565b91613683838202610377565b92818404149015171561369257565b6119dc565b906136ad6136b3926136a7612ce0565b50612d3a565b90613662565b90565b6136ca6136c56136cf9261175c565b6102cd565b610377565b90565b6136dc60026136b6565b90565b6136f1680100000000000000006119cf565b61370a6137046136ff6136d2565b610377565b91610377565b1461372b5761372961371a6136d2565b68010000000000000000611a2e565b565b5f633ee5aeb560e01b8152806137436004820161082a565b0390fd5b6137516001612d1e565b90565b61376e61375f613747565b68010000000000000000611a2e565b565b61377990610a1d565b90565b1561378357565b5f63e6c4247b60e01b81528061379b6004820161082a565b0390fd5b156137a657565b5f63162908e360e11b8152806137be6004820161082a565b0390fd5b6137cb90610a1d565b90565b156137d557565b5f6312d5633960e31b8152806137ed6004820161082a565b0390fd5b6137fa90610a01565b90565b613806906137f1565b90565b61381290610a1d565b90565b61381e90613770565b9052565b60409061384b613852949695939661384160608401985f850190613815565b602083019061031d565b01906103cd565b565b91909161388461386382613770565b61387d6138776138725f611668565b610311565b91610311565b141561377c565b6138a08361389a6138945f611fe8565b91610377565b1161379f565b6138e060206138ae83613770565b6370a08231906138d56138c0306137c2565b926138c96102a2565b95869485938493612595565b83526004830161032a565b03915afa8015613a095761390f915f916139db575b5061390861390286610377565b91610377565b10156137ce565b61393461392361391e83613770565b613228565b61392d602561163c565b8591614691565b61394e613949613944602561163c565b6137fd565b613809565b9163f213159c90929092613962602661163c565b9490823b156139d6575f946139936139889361397c6102a2565b98899788968795612595565b855260048501613822565b03925af180156139d1576139a5575b50565b6139c4905f3d81116139ca575b6139bc8183611485565b81019061259b565b5f6139a2565b503d6139b2565b6125cd565b612591565b6139fc915060203d8111613a02575b6139f48183611485565b81019061324c565b5f6138f5565b503d6139ea565b6125cd565b916020613a2f929493613a2860408201965f83019061031d565b01906103cd565b565b90613a4e82613a48613a425f611fe8565b91610377565b1161379f565b613a7e613a5a306137c2565b31613a77613a71613a6c8686906119f0565b610377565b91610377565b10156137ce565b613a98613a93613a8e602561163c565b6137fd565b613809565b91613aa863e041043292826119f0565b92919291613ab6602661163c565b9193813b15613b2a575f93613adc91613ae7613ad06102a2565b97889687958694612595565b845260048401613a0e565b03925af18015613b2557613af9575b50565b613b18905f3d8111613b1e575b613b108183611485565b81019061259b565b5f613af6565b503d613b06565b6125cd565b612591565b90565b613b46613b41613b4b92613b2f565b6102cd565b610377565b90565b613b777f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b613b8261174b565b508081613b8d612728565b918215613bea570981613b9e612728565b918215613be5570990613baf612728565b918215613be05708613bbf613b4e565b613bc7612728565b908115613bdb57613bd8920861476f565b90565b612ac7565b612ac7565b612ac7565b612ac7565b5f7f6d736748617368206f7574206f662072616e6765000000000000000000000000910152565b613c236014602092611562565b613c2c81613bef565b0190565b613c459060208101905f818303910152613c16565b90565b15613c4f57565b613c576102a2565b62461bcd60e51b815280613c6d60048201613c30565b0390fd5b5f7f73206f7574206f662072616e6765000000000000000000000000000000000000910152565b613ca5600e602092611562565b613cae81613c71565b0190565b613cc79060208101905f818303910152613c98565b90565b15613cd157565b613cd96102a2565b62461bcd60e51b815280613cef60048201613cb2565b0390fd5b90565b613d0a613d05613d0f92613cf3565b6102cd565b610377565b90565b613d1c60fb613cf6565b90565b1b90565b613d4290613d3c613d36613d4794610377565b91610377565b90613d1f565b610377565b90565b5f7f72206f7574206f662072616e6765000000000000000000000000000000000000910152565b613d7e600e602092611562565b613d8781613d4a565b0190565b613da09060208101905f818303910152613d71565b90565b15613daa57565b613db26102a2565b62461bcd60e51b815280613dc860048201613d8b565b0390fd5b5f7f77206f7574206f662072616e6765000000000000000000000000000000000000910152565b613e00600e602092611562565b613e0981613dcc565b0190565b613e229060208101905f818303910152613df3565b90565b15613e2c57565b613e346102a2565b62461bcd60e51b815280613e4a60048201613e0d565b0390fd5b613e65600167080000000000001160c01b0161270c565b90565b613e917f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b90565b613eab613ea6613eb092613e94565b6102cd565b610377565b90565b613edc7f01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca613e97565b90565b90565b613ef6613ef1613efb92613edf565b6102cd565b610377565b90565b613f267e5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f613ee2565b90565b613f336001612d1e565b90565b5f7f494e56414c49445f535441524b5f5349474e4154555245000000000000000000910152565b613f6a6017602092611562565b613f7381613f36565b0190565b613f8c9060208101905f818303910152613f5d565b90565b15613f9657565b613f9e6102a2565b62461bcd60e51b815280613fb460048201613f77565b0390fd5b90929161401f90613fec613fd484613fce612a9b565b90612adb565b613fe6613fe086610377565b91610377565b14613c48565b6001614000613ffa83610377565b91612d1e565b11158061422c575b61401190613cca565b614019612a9b565b90614849565b91600161403461402e86610377565b91612d1e565b1115806141f3575b61404590613da3565b600161405961405385610377565b91612d1e565b1115806141ba575b61406a90613e25565b8081614074613e4e565b9182156141b5570981614085613e4e565b9182156141b05709928586614098613e4e565b9182156141ab570993826140aa613e4e565b9182156141a65708936140bb613e68565b966140c4613e4e565b9384156141a15761415861413a61419397614101614175966140fb6140f561419f9f9b61418c9c6141999f08610377565b91610377565b146126e0565b614109612ce0565b50614112612ce0565b5061411b613eb3565b614123613efe565b61412b613f29565b91614134613e4e565b9361494c565b929092938a9190614149613f29565b91614152613e4e565b9361494c565b919091909291614166613f29565b9261416f613e4e565b94614993565b61417d613f29565b91614186613e4e565b9361494c565b5092610377565b91610377565b14613f8f565b565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b5061406a836141eb6141e56141e060016141db6141d5613d12565b91612d1e565b613d23565b610377565b91610377565b109050614061565b506140458461422461421e614219600161421461420e613d12565b91612d1e565b613d23565b610377565b91610377565b10905061403c565b506140118161424a61424461423f612a9b565b610377565b91610377565b109050614008565b5f90565b90565b90565b61427061426b61427592614256565b6117e3565b614259565b90565b6142a17ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061425c565b90565b6142ac614252565b506142b5614278565b90565b5f90565b6142d16142d6916142cb6142b8565b50612f74565b614a91565b90565b6142eb906142e561174b565b506142bc565b6143046142fe6142f96130ba565b613076565b91613076565b1490565b61431a9061431461174b565b506142bc565b61433361432d61432861308e565b613076565b91613076565b1490565b905090565b6143475f8092614337565b0190565b6143549061433c565b90565b90614369614364836128ef565b6114ae565b918252565b3d5f146143895761437e3d614357565b903d5f602084013e5b565b614391612dc0565b90614387565b5f7f4554485f5452414e534645525f4641494c454400000000000000000000000000910152565b6143cb6013602092611562565b6143d481614397565b0190565b6143ed9060208101905f8183039101526143be565b90565b156143f757565b6143ff6102a2565b62461bcd60e51b815280614415600482016143d8565b0390fd5b5f614446928192906144296102a2565b90816144348161434b565b03925af161444061436e565b506143f0565b565b61445d614462916144576115ed565b50612f74565b614b1f565b90565b5f7f4241445f544f4b454e5f41444452455353000000000000000000000000000000910152565b6144996011602092611562565b6144a281614465565b0190565b6144bb9060208101905f81830391015261448c565b90565b156144c557565b6144cd6102a2565b62461bcd60e51b8152806144e3600482016144a6565b0390fd5b90565b156144f25750565b614513906144fe6102a2565b91829162461bcd60e51b83526004830161159c565b0390fd5b61452081610652565b0361452757565b5f80fd5b9050519061453882614517565b565b9060208282031261455357614550915f0161452b565b90565b6102ac565b5f7f544f4b454e5f4f5045524154494f4e5f4641494c454400000000000000000000910152565b61458c6016602092611562565b61459581614558565b0190565b6145ae9060208101905f81830391015261457f565b90565b156145b857565b6145c06102a2565b62461bcd60e51b8152806145d660048201614599565b0390fd5b5f9182916145ef6145ea82614b50565b6144be565b9082602082019151925af161461561460561436e565b9161460f836144e7565b906144ea565b61461e816113d1565b61463061462a5f611fe8565b91610377565b11614639575b50565b61465661465b91602061464b826113d1565b81830101910161453a565b6145b1565b5f614636565b61466a90611fe8565b9052565b91602061468f92949361468860408201965f83019061031d565b0190614661565b565b90916146d46004916146c563095ea7b36146ac879391613273565b926146b56102a2565b9586946020860190815201613a0e565b60208201810382520382611485565b906146e96146e3828490614b79565b15610652565b6146f3575b505050565b61474060046147459461473b849161472c63095ea7b36147135f91613273565b9261471c6102a2565b968794602086019081520161466e565b60208201810382520383611485565b614c1b565b614c1b565b5f80806146ee565b61475961475f91610377565b91610377565b90811561476a570490565b612ac7565b61477761174b565b506147c36147bd6147b86001936147b26147a2614792612728565b61479c6001612d1e565b9061334d565b6147ac60026136b6565b9061474d565b90614e06565b610377565b91612d1e565b1490565b5f7f496e76616c6964206e756d626572000000000000000000000000000000000000910152565b6147fb600e602092611562565b614804816147c7565b0190565b61481d9060208101905f8183039101526147ee565b90565b1561482757565b61482f6102a2565b62461bcd60e51b81528061484560048201614808565b0390fd5b614851612ce0565b508061486561485f5f611fe8565b91610377565b141580614931575b80614911575b61487c90614820565b6148855f611fe8565b61488f6001612d1e565b8390614899612ce0565b505b836148ae6148a85f611fe8565b91610377565b14614909576148be82859061474d565b81939186829188908115614904576148d793099061334d565b918680156148ff576148f8936148f292089495809492613662565b9061334d565b929161489b565b612ac7565b612ac7565b505091505090565b5061487c826149286149225f611fe8565b91610377565b14159050614873565b508061494561493f84610377565b91610377565b141561486d565b9161498d94939161497f9361495f612ce0565b50614968612ce0565b509091600193926149798795612d1e565b92614e8f565b929190929092909192614fa9565b91909190565b92909493916149a0612ce0565b506149a9612ce0565b506149b35f611fe8565b506149bd5f611fe8565b506149c75f611fe8565b50836149db6149d583610377565b91610377565b145f14614a595750849084918215614a545708614a006149fa5f611fe8565b91610377565b145f14614a2357505050505f90614a20614a1a5f93611fe8565b92611fe8565b90565b614a4e93614a3f9260019291614a398694612d1e565b9161586c565b92919290925b92909192614fa9565b91909190565b612ac7565b915093614a4e94614a879391906001939091600190614a81614a7b8997612d1e565b92612d1e565b9461514d565b9291929092614a45565b602090614a9c6142b8565b50015163ffffffff60e01b1690565b90565b614ac2614abd614ac792614aab565b6102cd565b610377565b90565b614ad46020614aae565b90565b90565b614aee614ae9614af392614ad7565b6102cd565b610377565b90565b614b006004614ada565b90565b614b1c614b0e614aca565b614b16614af6565b906119f0565b90565b614b48614b4d91614b2e6115ed565b50614b37614b03565b90614b40612ce0565b5001516116a5565b610a1d565b90565b614b5861174b565b50614b61612ce0565b503b614b75614b6f5f611fe8565b91610377565b1190565b905f602091614b8661174b565b50614b8f61174b565b50614b98612ce0565b50614ba1612ce0565b50828151910182855af13d915f51919283614bbd575b50505090565b90919250614bd3614bcd5f611fe8565b91610377565b145f14614c0157614be49150613234565b3b614bf7614bf15f611fe8565b91610377565b115b5f8080614bb7565b50614c15614c0f6001612d1e565b91610377565b14614bf9565b905f602091614c28612ce0565b50614c31612ce0565b50828151910182855af115614cc4573d5f5190614c56614c505f611fe8565b91610377565b145f14614caa5750614c6781613234565b3b614c7a614c745f611fe8565b91610377565b145b614c835750565b614c8f614ca691613234565b5f918291635274afe760e01b83526004830161032a565b0390fd5b614cbd614cb76001612d1e565b91610377565b1415614c7c565b6040513d5f823e3d90fd5b90565b614ce6614ce1614ceb92614ccf565b6102cd565b6102c2565b90565b614cf790614cd2565b90565b60ff1690565b614d14614d0f614d1992614aab565b6102cd565b614cfa565b90565b614d2590614d00565b9052565b9194614d71614d7b92989795614d6760a096614d5d614d829a614d5360c08a019e5f8b0190614d1c565b6020890190614d1c565b6040870190614d1c565b60608501906103cd565b60808301906103cd565b01906103cd565b565b5f7f4649454c445f504f575f4641494c454400000000000000000000000000000000910152565b614db86010602092611562565b614dc181614d84565b0190565b614dda9060208101905f818303910152614dab565b90565b15614de457565b614dec6102a2565b62461bcd60e51b815280614e0260048201614dc5565b0390fd5b5f8091614e8c93614e15612ce0565b50614e5c614e236005614cee565b92614e4d602091602094602091614e38612728565b92614e416102a2565b97889660208801614d29565b60208201810382520382611485565b602081019051915afa614e76614e7061436e565b91614ddd565b6020614e81826113d1565b81830101910161324c565b90565b9493929194614e9c612ce0565b50614ea5612ce0565b50614eae612ce0565b5080614ec2614ebc5f611fe8565b91610377565b14614f9b579590614ed25f611fe8565b95614edc5f611fe8565b93614ee76001612d1e565b985b80614efc614ef65f611fe8565b91610377565b14614f8a5780614f0c6001612d1e565b16614f1f614f195f611fe8565b91610377565b03614f5c575b90614f3e614f4a9392614f3860026136b6565b9061474d565b9391908791899361586c565b97919794909792979197949094614ee9565b97614f3e95829a614f4a9493614f7a93929187908692938d9561514d565b9a91969096999192935050614f25565b505050509250929050919291929190565b509150939150919291929190565b91614fcb9094939194614fba612ce0565b50614fc3612ce0565b508290614849565b918283839182156150095709908183918215615004570994929082918215614fff570990918215614ffa570990565b612ac7565b612ac7565b612ac7565b612ac7565b67ffffffffffffffff81116150235760200290565b611471565b6150346150399161500e565b6114ae565b90565b369037565b9061505f61504e83615028565b92615059849161500e565b9061503c565b565b61506b6004615041565b90565b50600490565b9061507e8261506e565b81101561508c576020020190565b61226c565b9061509b90610377565b9052565b6150a99051610377565b90565b90565b6150c36150be6150c8926150ac565b6102cd565b610377565b90565b5f7f557365206a6163446f75626c652066756e6374696f6e20696e73746561640000910152565b6150ff601e602092611562565b615108816150cb565b0190565b6151219060208101905f8183039101526150f2565b90565b1561512b57565b6151336102a2565b62461bcd60e51b8152806151496004820161510c565b0390fd5b92969495969390919361515e612ce0565b50615167612ce0565b50615170612ce0565b508361518461517e5f611fe8565b91610377565b1480615833575b61582457806151a261519c5f611fe8565b91610377565b148061580a575b6157fb576151b5615061565b9285868a9081156157f6576151dd92096151d8866151d25f611fe8565b90615074565b615091565b856151f96151f4866151ee5f611fe8565b90615074565b61509f565b8a9081156157f15761521f920961521a866152146001612d1e565b90615074565b615091565b87888a9081156157ec5761524792096152428661523c60026136b6565b90615074565b615091565b8761526461525f8661525960026136b6565b90615074565b61509f565b8a9081156157e75761528a92096152858661527f60036150af565b90615074565b615091565b6152946004615028565b946152b16152ac866152a660026136b6565b90615074565b61509f565b8a9081156157e2576152c692095f8701615091565b6152e26152dd856152d760036150af565b90615074565b61509f565b899081156157dd576152f8920960208601615091565b9061531461530f846153095f611fe8565b90615074565b61509f565b90889283156157d8576153499361534493615333920960408701615091565b9261533e6001612d1e565b90615074565b61509f565b869081156157d35761535f920960608301615091565b9361537b615376866153705f611fe8565b90615074565b61509f565b6153a86153a261539d6153988961539260026136b6565b90615074565b61509f565b610377565b91610377565b1415801561577d575b6153ba90615124565b6153c2615061565b936153df6153da876153d460026136b6565b90615074565b61509f565b615404836153fe6153f98a6153f35f611fe8565b90615074565b61509f565b9061334d565b839081156157785761542992086154248761541e5f611fe8565b90615074565b615091565b6154456154408761543a60036150af565b90615074565b61509f565b61546b836154656154608a61545a6001612d1e565b90615074565b61509f565b9061334d565b8390811561577357615491920861548c876154866001612d1e565b90615074565b615091565b6154ac6154a7866154a15f611fe8565b90615074565b61509f565b6154c76154c2876154bc5f611fe8565b90615074565b61509f565b8390811561576e576154ed92096154e8876154e260026136b6565b90615074565b615091565b615509615504866154fe60026136b6565b90615074565b61509f565b61552461551f876155195f611fe8565b90615074565b61509f565b839081156157695761554a92096155458761553f60036150af565b90615074565b615091565b6155666155618661555b6001612d1e565b90615074565b61509f565b61558261557d876155776001612d1e565b90615074565b61509f565b8391821561576457096155b1836155ab6155a6896155a060036150af565b90615074565b61509f565b9061334d565b8391821561575f5708826002906155d96155d48a6155ce5f611fe8565b90615074565b61509f565b6155f56155f08a6155ea60026136b6565b90615074565b61509f565b8691821561575a57098590811561575557615612615619946136b6565b099061334d565b8391821561575057089561563f61563a876156346001612d1e565b90615074565b61509f565b61565a6156558361564f5f611fe8565b90615074565b61509f565b6156766156718961566b60026136b6565b90615074565b61509f565b8591821561574b570961568a858a9061334d565b859182156157465708849182156157415709906156ba6156b585926156af6001612d1e565b90615074565b61509f565b906156d76156d2896156cc60036150af565b90615074565b61509f565b8590811561573c576156ea93099061334d565b90838015615737576157109261570b9208966157055f611fe8565b90615074565b61509f565b92908291821561573257099091821561572d570992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b506153ba61579d615798876157926001612d1e565b90615074565b61509f565b6157ca6157c46157bf6157ba8a6157b460036150af565b90615074565b61509f565b610377565b91610377565b141590506153b1565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b50509350909350919291929190565b508161581e6158185f611fe8565b91610377565b146151a9565b93509495505050919291929190565b50826158476158415f611fe8565b91610377565b1461518b565b90565b61586461585f6158699261584d565b6102cd565b610377565b90565b9492949390919361587b612ce0565b50615884612ce0565b5061588d612ce0565b50846158a161589b5f611fe8565b91610377565b14615a2357808183918215615a1e570995838484918215615a19570991868785918215615a145709906004908486918215615a0f570985918215615a0a576158e890614ada565b099760039085918215615a05576158fe906150af565b0991908085918215615a005709849182156159fb5709839182156159f65708958687849182156159f1570983829083869081156159ec5761594093089061334d565b849182156159e75708969061595684899061334d565b849182156159e25708839182156159dd5709908260089180859182156159d85709849081156159d35761598b61599294615850565b099061334d565b829182156159ce57089360029290829182156159c95709909182156159c4576159ba906136b6565b0992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b919394505091929192919056fea26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","recompiledBytecode":"0x60806040526004361015610013575b6115e9565b61001d5f3561029c565b8063011e1167146102975780631710abaa14610292578063187ac4cb1461028d5780631dbd1da7146102885780631f0e8a12146102835780631f7daf0f1461027e57806330eff5dd1461027957806333eeb1471461027457806334759ca71461026f578063429a82081461026a578063439fab9114610265578063441a3e701461026057806346a577ed1461025b5780634780404d1461025657806354f3ea7f14610251578063556cf28b1461024c578063582b9044146102475780635837397114610242578063701f9fae1461023d5780637feaf0571461023857806386aeb4451461023357806387ec36e31461022e578063988760b0146102295780639a0fa042146102245780639cec9aaa1461021f578063b8ad077d1461021a578063b937f8f714610215578063bea8418714610210578063ccefe7b01461020b578063dd7202d814610206578063e2d8efd014610201578063e6fb8119146101fc578063e8a91f30146101f7578063e9f5a4a8146101f2578063ec3161b0146101ed578063ed3914d4146101e8578063ee4d01bf146101e3578063f405f17a146101de578063f637d950146101d95763ffa1ad740361000e576115b4565b61143c565b61139c565b61134a565b6112da565b611268565b611233565b6111ef565b611197565b61113f565b6110b4565b61107f565b610ff2565b610f48565b610edb565b610e83565b610df8565b610da0565b610d3c565b610d08565b610c8d565b610c54565b610baa565b610b52565b610ae2565b610a57565b61098c565b610919565b610890565b61082f565b610774565b610704565b610679565b61061d565b610592565b61053a565b6104e2565b610468565b6103ef565b61033f565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f9103126102ba57565b6102ac565b90565b60018060a01b031690565b90565b6102e46102df6102e9926102bf565b6102cd565b6102c2565b90565b6102f5906102d0565b90565b610303610eee6102ec565b90565b61030e6102f8565b90565b61031a906102c2565b90565b61032690610311565b9052565b919061033d905f6020850194019061031d565b565b3461036f5761034f3660046102b0565b61036b61035a610306565b6103626102a2565b9182918261032a565b0390f35b6102a8565b90565b90565b61038e61038961039392610374565b6102cd565b610377565b90565b6103bf7f01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb061037a565b90565b6103ca610396565b90565b6103d690610377565b9052565b91906103ed905f602085019401906103cd565b565b3461041f576103ff3660046102b0565b61041b61040a6103c2565b6104126102a2565b918291826103da565b0390f35b6102a8565b1c90565b60018060a01b031690565b6104439060086104489302610424565b610428565b90565b906104569154610433565b90565b61046560275f9061044b565b90565b34610498576104783660046102b0565b610494610483610459565b61048b6102a2565b9182918261032a565b0390f35b6102a8565b5f80fd5b6104aa81610377565b036104b157565b5f80fd5b905035906104c2826104a1565b565b906020828203126104dd576104da915f016104b5565b90565b6102ac565b346105125761050e6104fd6104f83660046104c4565b6116c1565b6105056102a2565b9182918261032a565b0390f35b6102a8565b73ce5a537d4da620de59efa6f74a0a065732600c7190565b610537610517565b90565b3461056a5761054a3660046102b0565b61056661055561052f565b61055d6102a2565b9182918261032a565b0390f35b6102a8565b73941f54cb53dc1478cb126a2ba8a83b2130419db590565b61058f61056f565b90565b346105c2576105a23660046102b0565b6105be6105ad610587565b6105b56102a2565b9182918261032a565b0390f35b6102a8565b90565b6105de6105d96105e3926105c7565b6102cd565b610377565b90565b61060f7f01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df26105ca565b90565b61061a6105e6565b90565b3461064d5761062d3660046102b0565b610649610638610612565b6106406102a2565b918291826103da565b0390f35b6102a8565b151590565b61066090610652565b9052565b9190610677905f60208501940190610657565b565b346106a9576106893660046102b0565b6106a561069461174f565b61069c6102a2565b91829182610664565b0390f35b6102a8565b90565b6106c56106c06106ca926106ae565b6102cd565b610377565b90565b6106f67f0348958c1322d3fc34f89b91b0b6473594725847184ee590e990bb70ef322b166106b1565b90565b6107016106cd565b90565b34610734576107143660046102b0565b61073061071f6106f9565b6107276102a2565b918291826103da565b0390f35b6102a8565b90565b61075061074b61075592610739565b6102cd565b610377565b90565b6107666401c16b450061073c565b90565b610771610758565b90565b346107a4576107843660046102b0565b6107a061078f610769565b6107976102a2565b918291826103da565b0390f35b6102a8565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156107ef5781359167ffffffffffffffff83116107ea5760200192600183028401116107e557565b6107b1565b6107ad565b6107a9565b90602082820312610825575f82013567ffffffffffffffff81116108205761081c92016107b5565b9091565b61049d565b6102ac565b5f0190565b3461085e576108486108423660046107f4565b90611f42565b6108506102a2565b8061085a8161082a565b0390f35b6102a8565b919060408382031261088b578061087f610888925f86016104b5565b936020016104b5565b90565b6102ac565b346108bf576108a96108a3366004610863565b906120ec565b6108b16102a2565b806108bb8161082a565b0390f35b6102a8565b90565b6108db6108d66108e0926108c4565b6102cd565b610377565b90565b61090b7eb59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e49586108c7565b90565b6109166108e3565b90565b34610949576109293660046102b0565b61094561093461090e565b61093c6102a2565b918291826103da565b0390f35b6102a8565b90565b61096561096061096a9261094e565b6102cd565b610377565b90565b61097e6703b2c201ffc2e880610951565b90565b61098961096d565b90565b346109bc5761099c3660046102b0565b6109b86109a7610981565b6109af6102a2565b918291826103da565b0390f35b6102a8565b60018060a01b031690565b6109dc9060086109e19302610424565b6109c1565b90565b906109ef91546109cc565b90565b6109fe60285f906109e4565b90565b610a15610a10610a1a926102c2565b6102cd565b6102c2565b90565b610a2690610a01565b90565b610a3290610a1d565b90565b610a3e90610a29565b9052565b9190610a55905f60208501940190610a35565b565b34610a8757610a673660046102b0565b610a83610a726109f2565b610a7a6102a2565b91829182610a42565b0390f35b6102a8565b90565b610aa3610a9e610aa892610a8c565b6102cd565b610377565b90565b610ad47f07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753610a8f565b90565b610adf610aab565b90565b34610b1257610af23660046102b0565b610b0e610afd610ad7565b610b056102a2565b918291826103da565b0390f35b6102a8565b90565b610b2e610b29610b3392610b17565b6102cd565b610377565b90565b610b44641d1a94a200610b1a565b90565b610b4f610b36565b90565b34610b8257610b623660046102b0565b610b7e610b6d610b47565b610b756102a2565b918291826103da565b0390f35b6102a8565b73216e8577b504ac3db213edd261e47fffbb35424890565b610ba7610b87565b90565b34610bda57610bba3660046102b0565b610bd6610bc5610b9f565b610bcd6102a2565b9182918261032a565b0390f35b6102a8565b909182601f83011215610c195781359167ffffffffffffffff8311610c14576020019260608302840111610c0f57565b6107b1565b6107ad565b6107a9565b90602082820312610c4f575f82013567ffffffffffffffff8111610c4a57610c469201610bdf565b9091565b61049d565b6102ac565b610c68610c62366004610c1e565b90612509565b610c706102a2565b80610c7a8161082a565b0390f35b610c8a60255f9061044b565b90565b34610cbd57610c9d3660046102b0565b610cb9610ca8610c7e565b610cb06102a2565b9182918261032a565b0390f35b6102a8565b919091604081840312610d0357610cdb835f83016104b5565b92602082013567ffffffffffffffff8111610cfe57610cfa92016107b5565b9091565b61049d565b6102ac565b34610d3757610d21610d1b366004610cc2565b91612515565b610d296102a2565b80610d338161082a565b0390f35b6102a8565b610d473660046102b0565b610d4f61267d565b610d576102a2565b80610d618161082a565b0390f35b90565b610d7c610d77610d8192610d65565b6102cd565b610377565b90565b610d926436b7176e00610d68565b90565b610d9d610d84565b90565b34610dd057610db03660046102b0565b610dcc610dbb610d95565b610dc36102a2565b918291826103da565b0390f35b6102a8565b73bc6eeb5111fea2b5e9b2bc534bbcbca9568999a490565b610df5610dd5565b90565b34610e2857610e083660046102b0565b610e24610e13610ded565b610e1b6102a2565b9182918261032a565b0390f35b6102a8565b90565b610e44610e3f610e4992610e2d565b6102cd565b610377565b90565b610e757f07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc610e30565b90565b610e80610e4c565b90565b34610eb357610e933660046102b0565b610eaf610e9e610e78565b610ea66102a2565b918291826103da565b0390f35b6102a8565b73409f85d2207796b543b8abdb6a0e2490bb1483d190565b610ed8610eb8565b90565b34610f0b57610eeb3660046102b0565b610f07610ef6610ed0565b610efe6102a2565b9182918261032a565b0390f35b6102a8565b90565b610f23906008610f289302610424565b610f10565b90565b90610f369154610f13565b90565b610f45600d5f90610f2b565b90565b34610f7857610f583660046102b0565b610f74610f63610f39565b610f6b6102a2565b918291826103da565b0390f35b6102a8565b610f8681610311565b03610f8d57565b5f80fd5b90503590610f9e82610f7d565b565b91606083830312610fed57610fb7825f8501610f91565b92610fc583602083016104b5565b92604082013567ffffffffffffffff8111610fe857610fe492016107b5565b9091565b61049d565b6102ac565b346110245761100e611005366004610fa0565b92919091612b2f565b6110166102a2565b806110208161082a565b0390f35b6102a8565b90565b61104061103b61104592611029565b6102cd565b610377565b90565b6110717f052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b43461102c565b90565b61107c611048565b90565b346110af5761108f3660046102b0565b6110ab61109a611074565b6110a26102a2565b918291826103da565b0390f35b6102a8565b346110e4576110e06110cf6110ca3660046104c4565b612d3a565b6110d76102a2565b918291826103da565b0390f35b6102a8565b90565b6111006110fb611105926110e9565b6102cd565b610377565b90565b6111317f025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca016110ec565b90565b61113c611108565b90565b3461116f5761114f3660046102b0565b61116b61115a611134565b6111626102a2565b918291826103da565b0390f35b6102a8565b7310cbbbb225bbea137ac01f0f6d91cdb126bccaa690565b611194611174565b90565b346111c7576111a73660046102b0565b6111c36111b261118c565b6111ba6102a2565b9182918261032a565b0390f35b6102a8565b735ebb994ebc1c44815fbf2fa61a6e1f8368dcb0c790565b6111ec6111cc565b90565b3461121f576111ff3660046102b0565b61121b61120a6111e4565b6112126102a2565b9182918261032a565b0390f35b6102a8565b61123060265f9061044b565b90565b34611263576112433660046102b0565b61125f61124e611224565b6112566102a2565b9182918261032a565b0390f35b6102a8565b346112995761129561128461127e366004610863565b90612d8e565b61128c6102a2565b918291826103da565b0390f35b6102a8565b90565b6112b56112b06112ba9261129e565b6102cd565b610377565b90565b6112cc650474dec268006112a1565b90565b6112d76112bd565b90565b3461130a576112ea3660046102b0565b6113066112f56112cf565b6112fd6102a2565b918291826103da565b0390f35b6102a8565b90565b61132661132161132b9261130f565b6102cd565b610377565b90565b61133c64590ec6d100611312565b90565b61134761132e565b90565b3461137a5761135a3660046102b0565b61137661136561133f565b61136d6102a2565b918291826103da565b0390f35b6102a8565b61138e650474dec268006112a1565b90565b61139961137f565b90565b346113cc576113ac3660046102b0565b6113c86113b7611391565b6113bf6102a2565b918291826103da565b0390f35b6102a8565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61141261141b60209361142093611409816113d1565b938480936113d5565b958691016113de565b6113e9565b0190565b6114399160208201915f8184039101526113f3565b90565b3461146c576114686114576114523660046104c4565b612f74565b61145f6102a2565b91829182611424565b0390f35b6102a8565b634e487b7160e01b5f52604160045260245ffd5b9061148f906113e9565b810190811067ffffffffffffffff8211176114a957604052565b611471565b906114c16114ba6102a2565b9283611485565b565b67ffffffffffffffff81116114e1576114dd6020916113e9565b0190565b611471565b906114f86114f3836114c3565b6114ae565b918252565b5f7f537461726b45782d494d582d4d6967726174696f6e2d312e302e300000000000910152565b61152e601b6114e6565b9061153b602083016114fd565b565b611545611524565b90565b61155061153d565b90565b61155b611548565b90565b5190565b60209181520190565b61158a611593602093611598936115818161155e565b93848093611562565b958691016113de565b6113e9565b0190565b6115b19160208201915f81840391015261156b565b90565b346115e4576115c43660046102b0565b6115e06115cf611553565b6115d76102a2565b9182918261159c565b0390f35b6102a8565b5f80fd5b5f90565b61160561160061160a92610377565b6102cd565b610377565b90565b90611617906115f1565b5f5260205260405f2090565b5f1c90565b61163461163991611623565b610428565b90565b6116469054611628565b90565b90565b61166061165b61166592611649565b6102cd565b6102c2565b90565b6116719061164c565b90565b90565b61168b61168661169092611674565b6102cd565b610377565b90565b6116a260018060a01b03611677565b90565b6116b96116b46116be92610377565b6102cd565b6102c2565b90565b6116c96115ed565b506116de6116d96018839061160d565b61163c565b806116f96116f36116ee5f611668565b610311565b91610311565b0361174657508061171b6117158361170f611693565b16610377565b91610377565b145f146117375761172e611733916116a5565b610a1d565b5b90565b506117415f611668565b611734565b905090565b5f90565b61175761174b565b505f90565b90565b67ffffffffffffffff1690565b61178061177b6117859261175c565b6102cd565b61175f565b90565b60401c90565b60ff1690565b6117a06117a591611788565b61178e565b90565b6117b29054611794565b90565b67ffffffffffffffff1690565b6117ce6117d391611623565b6117b5565b90565b6117e090546117c2565b90565b5f1b90565b906117fb67ffffffffffffffff916117e3565b9181191691161790565b61181961181461181e9261175f565b6102cd565b61175f565b90565b90565b9061183961183461184092611805565b611821565b82546117e8565b9055565b60401b90565b9061185e68ff000000000000000091611844565b9181191691161790565b61187190610652565b90565b90565b9061188c61188761189392611868565b611874565b825461184a565b9055565b6118a09061175f565b9052565b91906118b7905f60208501940190611897565b565b906118c4600261176c565b916118cd612faf565b906118d95f83016117a8565b801561196a575b61194e576119139261190a916118f8865f8601611824565b61190560015f8601611877565b611a98565b5f809101611877565b6119497fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916119406102a2565b918291826118a4565b0390a1565b5f63f92ee8a960e01b8152806119666004820161082a565b0390fd5b506119765f83016117d6565b6119886119828661175f565b9161175f565b10156118e0565b90611999906115f1565b5f5260205260405f2090565b906119af906115f1565b5f5260205260405f2090565b6119c76119cc91611623565b610f10565b90565b6119d990546119bb565b90565b634e487b7160e01b5f52601160045260245ffd5b6119ff611a0591939293610377565b92610377565b8201809211611a1057565b6119dc565b90611a215f19916117e3565b9181191691161790565b90565b90611a43611a3e611a4a926115f1565b611a2b565b8254611a15565b9055565b90611a5f60018060a01b03916117e3565b9181191691161790565b611a7290610a1d565b90565b90565b90611a8d611a88611a9492611a69565b611a75565b8254611a4e565b9055565b5050611ae1611aa561137f565b611adb611acc611abe6008611ab8610aab565b9061198f565b611ac66106cd565b906119a5565b91611ad6836119cf565b6119f0565b90611a2e565b611b28611aec610b36565b611b22611b13611b056008611aff610396565b9061198f565b611b0d6106cd565b906119a5565b91611b1d836119cf565b6119f0565b90611a2e565b611b6f611b33610758565b611b69611b5a611b4c6008611b46611048565b9061198f565b611b546106cd565b906119a5565b91611b64836119cf565b6119f0565b90611a2e565b611bb6611b7a6112bd565b611bb0611ba1611b936008611b8d610e4c565b9061198f565b611b9b6106cd565b906119a5565b91611bab836119cf565b6119f0565b90611a2e565b611bfd611bc161132e565b611bf7611be8611bda6008611bd46108e3565b9061198f565b611be26106cd565b906119a5565b91611bf2836119cf565b6119f0565b90611a2e565b611c44611c0861096d565b611c3e611c2f611c216008611c1b611108565b9061198f565b611c296106cd565b906119a5565b91611c39836119cf565b6119f0565b90611a2e565b611c8b611c4f610d84565b611c85611c76611c686008611c626105e6565b9061198f565b611c706106cd565b906119a5565b91611c80836119cf565b6119f0565b90611a2e565b611ca6611ca16018611c9b610aab565b9061160d565b61163c565b611cc0611cba611cb55f611668565b610311565b91610311565b14611f1a575b611ce1611cdc6018611cd6610396565b9061160d565b61163c565b611cfb611cf5611cf05f611668565b610311565b91610311565b14611ef2575b611d1c611d176018611d11611048565b9061160d565b61163c565b611d36611d30611d2b5f611668565b610311565b91610311565b14611eca575b611d57611d526018611d4c610e4c565b9061160d565b61163c565b611d71611d6b611d665f611668565b610311565b91610311565b14611ea2575b611d92611d8d6018611d876108e3565b9061160d565b61163c565b611dac611da6611da15f611668565b610311565b91610311565b14611e7a575b611dcd611dc86018611dc2611108565b9061160d565b61163c565b611de7611de1611ddc5f611668565b610311565b91610311565b14611e52575b611e08611e036018611dfd6105e6565b9061160d565b61163c565b611e22611e1c611e175f611668565b610311565b91610311565b14611e2a575b565b611e4d611e35610dd5565b611e486018611e426105e6565b9061160d565b611a78565b611e28565b611e75611e5d61056f565b611e706018611e6a611108565b9061160d565b611a78565b611ded565b611e9d611e85610517565b611e986018611e926108e3565b9061160d565b611a78565b611db2565b611ec5611ead610eb8565b611ec06018611eba610e4c565b9061160d565b611a78565b611d77565b611eed611ed5611174565b611ee86018611ee2611048565b9061160d565b611a78565b611d3c565b611f15611efd610b87565b611f106018611f0a610396565b9061160d565b611a78565b611d01565b611f3d611f256111cc565b611f386018611f32610aab565b9061160d565b611a78565b611cc6565b90611f4c916118b9565b565b611f5790610a01565b90565b611f6390611f4e565b90565b5f7f4e4f4e5f46554e4749424c455f41535345545f54595045000000000000000000910152565b611f9a6017602092611562565b611fa381611f66565b0190565b611fbc9060208101905f818303910152611f8d565b90565b15611fc657565b611fce6102a2565b62461bcd60e51b815280611fe460048201611fa7565b0390fd5b611ffc611ff761200192611649565b6102cd565b610377565b90565b5f7f4e4f5f50454e44494e475f5749544844524157414c0000000000000000000000910152565b6120386015602092611562565b61204181612004565b0190565b61205a9060208101905f81830391015261202b565b90565b1561206457565b61206c6102a2565b62461bcd60e51b81528061208260048201612045565b0390fd5b61208f90610a1d565b90565b61209b90612086565b9052565b909594926120ea946120d96120e3926120cf6080966120c560a088019c5f8901906103cd565b60208701906103cd565b60408501906103cd565b60608301906103cd565b0190612092565b565b906120fe6120f98361303c565b611f5a565b61210f61210a836130e6565b611fbf565b6121c182936121756121356121306121296008859061198f565b88906119a5565b6119cf565b956121528761214c6121465f611fe8565b91610377565b1161205d565b61217061215e5f611fe8565b9161216b6008869061198f565b6119a5565b611a2e565b612181838587916133f4565b9161218d848690613697565b947fb7477a7b93b2addc5272bbd7ad0986ef1c0d0bd265f26c3dc4bbe42727c2ac0c956121b86102a2565b9586958661209f565b0390a1565b906121d8916121d36136df565b612205565b6121e0613754565b565b156121e957565b5f636e7e1ba960e11b8152806122016004820161082a565b0390fd5b906122349161222f3361222961222361221e602761163c565b610311565b91610311565b146121e2565b61230d565b565b5090565b1561224157565b5f635091728960e01b8152806122596004820161082a565b0390fd5b60016122699101610377565b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015612290576060020190565b61226c565b3561229f81610f7d565b90565b356122ac816104a1565b90565b156122b657565b5f63dd3bd7d760e01b8152806122ce6004820161082a565b0390fd5b6122db90610a01565b90565b6122e7906122d2565b90565b156122f157565b5f631733f9d760e01b8152806123096004820161082a565b0390fd5b9061233461231c838390612236565b61232e6123285f611fe8565b91610377565b1161223a565b61233d5f611fe8565b916123475f611fe8565b5b8061236561235f61235a858790612236565b610377565b91610377565b10156124e857612468906123855f61237f85878591612280565b01612295565b61239c602061239686888691612280565b016122a2565b6123c16123b660406123b0888a8891612280565b016122a2565b9291929788906119f0565b966123df886123d86123d234610377565b91610377565b11156122af565b816123f96123f36123ee6102f8565b610311565b91610311565b145f1461246d5761240b915082613a31565b612415602661163c565b339061245f61244d6124477f680cdeb18e0632eaae1727127d3005efb3ea5dba23e34446c9e94cf2cf5f557793611a69565b93611a69565b936124566102a2565b918291826103da565b0390a35b61225d565b612348565b6124839061247a836122de565b90849091613854565b61248d602661163c565b33916124e06124ce6124c86124c27fbaffede578523e7bb616324498f96acc5cd38e6c6168c976d67866fb78ea958d94611a69565b94611a69565b94611a69565b946124d76102a2565b918291826103da565b0390a4612463565b505050612507906125016124fb34610377565b91610377565b146122ea565b565b90612513916121c6565b565b9091612525923392909192612b2f565b565b61252f6136df565b612537612541565b61253f613754565b565b6125663361256061255a612555602761163c565b610311565b91610311565b146121e2565b61256e6125dd565b565b61257c61258191611623565b6109c1565b90565b61258e9054612570565b90565b5f80fd5b60e01b90565b5f9103126125a557565b6102ac565b9160206125cb9294936125c460408201965f8301906103cd565b019061031d565b565b6125d56102a2565b3d5f823e3d90fd5b6125ef6125ea6028612584565b610a29565b63168b5ab73491909190612603600d6119cf565b903393813b15612678575f9361262a9161263561261e6102a2565b97889687958694612595565b8452600484016125aa565b03925af1801561267357612647575b50565b612666905f3d811161266c575b61265e8183611485565b81019061259b565b5f612644565b503d612654565b6125cd565b612591565b612685612527565b565b5f7f494e56414c49445f535441524b5f4b4559000000000000000000000000000000910152565b6126bb6011602092611562565b6126c481612687565b0190565b6126dd9060208101905f8183039101526126ae565b90565b156126e757565b6126ef6102a2565b62461bcd60e51b815280612705600482016126c8565b0390fd5b90565b61272061271b61272592612709565b6102cd565b610377565b90565b61273f600167080000000000001160c01b0161270c565b90565b5f7f494e56414c49445f4554485f4144445245535300000000000000000000000000910152565b6127766013602092611562565b61277f81612742565b0190565b6127989060208101905f818303910152612769565b90565b156127a257565b6127aa6102a2565b62461bcd60e51b8152806127c060048201612783565b0390fd5b5f7f535441524b5f4b45595f554e415641494c41424c450000000000000000000000910152565b6127f86015602092611562565b612801816127c4565b0190565b61281a9060208101905f8183039101526127eb565b90565b1561282457565b61282c6102a2565b62461bcd60e51b81528061284260048201612805565b0390fd5b5090565b90565b61286161285c6128669261284a565b6102cd565b610377565b90565b5f7f494e56414c49445f535441524b5f5349474e41545552455f4c454e4754480000910152565b61289d601e602092611562565b6128a681612869565b0190565b6128bf9060208101905f818303910152612890565b90565b156128c957565b6128d16102a2565b62461bcd60e51b8152806128e7600482016128aa565b0390fd5b5f80fd5b67ffffffffffffffff811161290d576129096020916113e9565b0190565b611471565b90825f939282370152565b9092919261293261292d826128ef565b6114ae565b9381855260208501908284011161294e5761294c92612912565b565b6128eb565b61295e91369161291d565b90565b9050519061296e826104a1565b565b90916060828403126129a5576129a261298b845f8501612961565b936129998160208601612961565b93604001612961565b90565b6102ac565b905090565b5f7f55736572526567697374726174696f6e3a000000000000000000000000000000910152565b6129e2601180926129aa565b6129eb816129af565b0190565b60601b90565b6129fe906129ef565b90565b612a0a906129f5565b90565b612a19612a1e91610311565b612a01565b9052565b90565b612a31612a3691610377565b612a22565b9052565b601460209392612a56612a4f612a5e946129d6565b8092612a0d565b018092612a25565b0190565b60200190565b612a74612a7991611623565b6115f1565b90565b90565b612a93612a8e612a9892612a7c565b6102cd565b610377565b90565b612ac47f0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f612a7f565b90565b634e487b7160e01b5f52601260045260245ffd5b612ae7612aed91610377565b91610377565b908115612af8570690565b612ac7565b604090612b26612b2d9496959396612b1c60608401985f85019061031d565b60208301906103cd565b019061031d565b565b91612c15612c8d9294612c2b92612b5987612b52612b4c5f611fe8565b91610377565b14156126e0565b612b7c87612b76612b70612b6b612728565b610377565b91610377565b106126e0565b612ba186612b9a612b94612b8f5f611668565b610311565b91610311565b141561279b565b612bd8612bb8612bb360188a9061160d565b61163c565b612bd2612bcc612bc75f611668565b610311565b91610311565b1461281d565b612be9612be488613b7a565b6126e0565b612c10612bf7828490612846565b612c0a612c04606061284d565b91610377565b146128c2565b612953565b6020612c20826113d1565b818301019101612970565b90612c84612c7686612c5e8991612c4f612c436102a2565b93849260208401612a3a565b60208201810382520382611485565b612c70612c6a826113d1565b91612a62565b20612a68565b612c7e612a9b565b90612adb565b92869293613fb8565b612ca281612c9d6018859061160d565b611a78565b903391612cdb7fcab1cf17c190e4e2195a7b8f7b362023246fa774390432b4704ab6b29d56b07b93612cd26102a2565b93849384612afd565b0390a1565b5f90565b90612cee906115f1565b5f5260205260405f2090565b612d06612d0b91611623565b61178e565b90565b612d189054612cfa565b90565b90565b612d32612d2d612d3792612d1b565b6102cd565b610377565b90565b612d42612ce0565b50612d60612d5a612d5560158490612ce4565b612d0e565b15610652565b5f14612d755750612d716001612d1e565b905b565b612d83612d889160166119a5565b6119cf565b90612d73565b612db7612db2612dbd93612da0612ce0565b50612dad8194600861198f565b6119a5565b6119cf565b90613697565b90565b606090565b5f7f41535345545f545950455f4e4f545f5245474953544552454400000000000000910152565b612df96019602092611562565b612e0281612dc5565b0190565b612e1b9060208101905f818303910152612dec565b90565b15612e2557565b612e2d6102a2565b62461bcd60e51b815280612e4360048201612e06565b0390fd5b90612e51906115f1565b5f5260205260405f2090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015612e91575b6020831014612e8c57565b612e5d565b91607f1691612e81565b60209181520190565b5f5260205f2090565b905f9291805490612ec7612ec083612e71565b8094612e9b565b916001811690815f14612f1e5750600114612ee2575b505050565b612eef9192939450612ea4565b915f925b818410612f0657505001905f8080612edd565b60018160209295939554848601520191019290612ef3565b92949550505060ff19168252151560200201905f8080612edd565b90612f4391612ead565b90565b90612f66612f5f92612f566102a2565b93848092612f39565b0383611485565b565b612f7190612f46565b90565b612fa7612fac91612f83612dc0565b50612fa0612f9b612f9660158490612ce4565b612d0e565b612e1e565b6014612e47565b612f68565b90565b612fb76142a4565b90565b5f7f555345525f554e52454749535445524544000000000000000000000000000000910152565b612fee6011602092611562565b612ff781612fba565b0190565b6130109060208101905f818303910152612fe1565b90565b1561301a57565b6130226102a2565b62461bcd60e51b81528061303860048201612ffb565b0390fd5b61304e906130486115ed565b506116c1565b906130748261306d6130676130625f611668565b610311565b91610311565b1415613013565b565b63ffffffff60e01b1690565b61308b90613076565b90565b6130b77f8322fff276cdf3f5716784c2e78b276d0d5cf1781fe7a7984e8bff96f75632c6613082565b90565b6130e37ff47261b06eedbfce68afd46d0f3c27c60b03faad319eaf33103611cf8f6456ad613082565b90565b6130f8906130f261174b565b506142bc565b8061311261310c61310761308e565b613076565b91613076565b1490811561311f575b5090565b905061313a61313461312f6130ba565b613076565b91613076565b145f61311b565b5f7f494e56414c49445f524543495049454e54000000000000000000000000000000910152565b6131756011602092611562565b61317e81613141565b0190565b6131979060208101905f818303910152613168565b90565b156131a157565b6131a96102a2565b62461bcd60e51b8152806131bf60048201613182565b0390fd5b5f7f554e535550504f525445445f544f4b454e5f5459504500000000000000000000910152565b6131f76016602092611562565b613200816131c3565b0190565b6132199060208101905f8183039101526131ea565b90565b61322590610a01565b90565b6132319061321c565b90565b61323d90610a1d565b90565b61324990610a1d565b90565b9060208282031261326557613262915f01612961565b90565b6102ac565b63ffffffff1690565b61328761328261328c9261326a565b612595565b613076565b90565b613298906102c2565b90565b6132a49061328f565b9052565b9160206132c99294936132c260408201965f83019061329b565b01906103cd565b565b5f7f554e444552464c4f570000000000000000000000000000000000000000000000910152565b6132ff6009602092611562565b613308816132cb565b0190565b6133219060208101905f8183039101526132f2565b90565b1561332b57565b6133336102a2565b62461bcd60e51b8152806133496004820161330c565b0390fd5b61335c61336291939293610377565b92610377565b820391821161336d57565b6119dc565b5f7f494e434f52524543545f414d4f554e545f5452414e5346455252454400000000910152565b6133a6601c602092611562565b6133af81613372565b0190565b6133c89060208101905f818303910152613399565b90565b156133d257565b6133da6102a2565b62461bcd60e51b8152806133f0600482016133b3565b0390fd5b909161341b8261341461340e6134095f611668565b610311565b91612086565b141561319a565b613426838290613697565b90613430846142d9565b5f146135fd576134486134425f611fe8565b91610377565b146135f85761345961349f93614448565b61346281613228565b602061346d82613234565b6370a082319061349461347f30613240565b926134886102a2565b998a9485938493612595565b83526004830161032a565b03915afa9081156135f35761350460209360046134fe6135099561353b9a5f916135c6575b50986134f06134d663a9059cbb613273565b918a906134e16102a2565b9586948c8601908152016132a8565b888201810382520382611485565b906145da565b613234565b6370a082319061353061351b30613240565b926135246102a2565b97889485938493612595565b83526004830161032a565b03915afa80156135c15761357f61358a9261358492613590965f91613593575b506135798161357261356c89610377565b91610377565b1115613324565b9461334d565b610377565b91610377565b146133cb565b5b565b6135b4915060203d81116135ba575b6135ac8183611485565b81019061324c565b5f61355b565b503d6135a2565b6125cd565b6135e69150883d81116135ec575b6135de8183611485565b81019061324c565b5f6134c4565b503d6135d4565b6125cd565b505050565b90919261360990614308565b5f146136405761362161361b5f611fe8565b91610377565b1461363c5761363261363792612086565b614419565b613591565b5050565b6136486102a2565b62461bcd60e51b81528061365e60048201613204565b0390fd5b61367161367791939293610377565b92610377565b91613683838202610377565b92818404149015171561369257565b6119dc565b906136ad6136b3926136a7612ce0565b50612d3a565b90613662565b90565b6136ca6136c56136cf9261175c565b6102cd565b610377565b90565b6136dc60026136b6565b90565b6136f1680100000000000000006119cf565b61370a6137046136ff6136d2565b610377565b91610377565b1461372b5761372961371a6136d2565b68010000000000000000611a2e565b565b5f633ee5aeb560e01b8152806137436004820161082a565b0390fd5b6137516001612d1e565b90565b61376e61375f613747565b68010000000000000000611a2e565b565b61377990610a1d565b90565b1561378357565b5f63e6c4247b60e01b81528061379b6004820161082a565b0390fd5b156137a657565b5f63162908e360e11b8152806137be6004820161082a565b0390fd5b6137cb90610a1d565b90565b156137d557565b5f6312d5633960e31b8152806137ed6004820161082a565b0390fd5b6137fa90610a01565b90565b613806906137f1565b90565b61381290610a1d565b90565b61381e90613770565b9052565b60409061384b613852949695939661384160608401985f850190613815565b602083019061031d565b01906103cd565b565b91909161388461386382613770565b61387d6138776138725f611668565b610311565b91610311565b141561377c565b6138a08361389a6138945f611fe8565b91610377565b1161379f565b6138e060206138ae83613770565b6370a08231906138d56138c0306137c2565b926138c96102a2565b95869485938493612595565b83526004830161032a565b03915afa8015613a095761390f915f916139db575b5061390861390286610377565b91610377565b10156137ce565b61393461392361391e83613770565b613228565b61392d602561163c565b8591614691565b61394e613949613944602561163c565b6137fd565b613809565b9163f213159c90929092613962602661163c565b9490823b156139d6575f946139936139889361397c6102a2565b98899788968795612595565b855260048501613822565b03925af180156139d1576139a5575b50565b6139c4905f3d81116139ca575b6139bc8183611485565b81019061259b565b5f6139a2565b503d6139b2565b6125cd565b612591565b6139fc915060203d8111613a02575b6139f48183611485565b81019061324c565b5f6138f5565b503d6139ea565b6125cd565b916020613a2f929493613a2860408201965f83019061031d565b01906103cd565b565b90613a4e82613a48613a425f611fe8565b91610377565b1161379f565b613a7e613a5a306137c2565b31613a77613a71613a6c8686906119f0565b610377565b91610377565b10156137ce565b613a98613a93613a8e602561163c565b6137fd565b613809565b91613aa863e041043292826119f0565b92919291613ab6602661163c565b9193813b15613b2a575f93613adc91613ae7613ad06102a2565b97889687958694612595565b845260048401613a0e565b03925af18015613b2557613af9575b50565b613b18905f3d8111613b1e575b613b108183611485565b81019061259b565b5f613af6565b503d613b06565b6125cd565b612591565b90565b613b46613b41613b4b92613b2f565b6102cd565b610377565b90565b613b777f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b613b8261174b565b508081613b8d612728565b918215613bea570981613b9e612728565b918215613be5570990613baf612728565b918215613be05708613bbf613b4e565b613bc7612728565b908115613bdb57613bd8920861476f565b90565b612ac7565b612ac7565b612ac7565b612ac7565b5f7f6d736748617368206f7574206f662072616e6765000000000000000000000000910152565b613c236014602092611562565b613c2c81613bef565b0190565b613c459060208101905f818303910152613c16565b90565b15613c4f57565b613c576102a2565b62461bcd60e51b815280613c6d60048201613c30565b0390fd5b5f7f73206f7574206f662072616e6765000000000000000000000000000000000000910152565b613ca5600e602092611562565b613cae81613c71565b0190565b613cc79060208101905f818303910152613c98565b90565b15613cd157565b613cd96102a2565b62461bcd60e51b815280613cef60048201613cb2565b0390fd5b90565b613d0a613d05613d0f92613cf3565b6102cd565b610377565b90565b613d1c60fb613cf6565b90565b1b90565b613d4290613d3c613d36613d4794610377565b91610377565b90613d1f565b610377565b90565b5f7f72206f7574206f662072616e6765000000000000000000000000000000000000910152565b613d7e600e602092611562565b613d8781613d4a565b0190565b613da09060208101905f818303910152613d71565b90565b15613daa57565b613db26102a2565b62461bcd60e51b815280613dc860048201613d8b565b0390fd5b5f7f77206f7574206f662072616e6765000000000000000000000000000000000000910152565b613e00600e602092611562565b613e0981613dcc565b0190565b613e229060208101905f818303910152613df3565b90565b15613e2c57565b613e346102a2565b62461bcd60e51b815280613e4a60048201613e0d565b0390fd5b613e65600167080000000000001160c01b0161270c565b90565b613e917f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b90565b613eab613ea6613eb092613e94565b6102cd565b610377565b90565b613edc7f01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca613e97565b90565b90565b613ef6613ef1613efb92613edf565b6102cd565b610377565b90565b613f267e5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f613ee2565b90565b613f336001612d1e565b90565b5f7f494e56414c49445f535441524b5f5349474e4154555245000000000000000000910152565b613f6a6017602092611562565b613f7381613f36565b0190565b613f8c9060208101905f818303910152613f5d565b90565b15613f9657565b613f9e6102a2565b62461bcd60e51b815280613fb460048201613f77565b0390fd5b90929161401f90613fec613fd484613fce612a9b565b90612adb565b613fe6613fe086610377565b91610377565b14613c48565b6001614000613ffa83610377565b91612d1e565b11158061422c575b61401190613cca565b614019612a9b565b90614849565b91600161403461402e86610377565b91612d1e565b1115806141f3575b61404590613da3565b600161405961405385610377565b91612d1e565b1115806141ba575b61406a90613e25565b8081614074613e4e565b9182156141b5570981614085613e4e565b9182156141b05709928586614098613e4e565b9182156141ab570993826140aa613e4e565b9182156141a65708936140bb613e68565b966140c4613e4e565b9384156141a15761415861413a61419397614101614175966140fb6140f561419f9f9b61418c9c6141999f08610377565b91610377565b146126e0565b614109612ce0565b50614112612ce0565b5061411b613eb3565b614123613efe565b61412b613f29565b91614134613e4e565b9361494c565b929092938a9190614149613f29565b91614152613e4e565b9361494c565b919091909291614166613f29565b9261416f613e4e565b94614993565b61417d613f29565b91614186613e4e565b9361494c565b5092610377565b91610377565b14613f8f565b565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b5061406a836141eb6141e56141e060016141db6141d5613d12565b91612d1e565b613d23565b610377565b91610377565b109050614061565b506140458461422461421e614219600161421461420e613d12565b91612d1e565b613d23565b610377565b91610377565b10905061403c565b506140118161424a61424461423f612a9b565b610377565b91610377565b109050614008565b5f90565b90565b90565b61427061426b61427592614256565b6117e3565b614259565b90565b6142a17ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061425c565b90565b6142ac614252565b506142b5614278565b90565b5f90565b6142d16142d6916142cb6142b8565b50612f74565b614a91565b90565b6142eb906142e561174b565b506142bc565b6143046142fe6142f96130ba565b613076565b91613076565b1490565b61431a9061431461174b565b506142bc565b61433361432d61432861308e565b613076565b91613076565b1490565b905090565b6143475f8092614337565b0190565b6143549061433c565b90565b90614369614364836128ef565b6114ae565b918252565b3d5f146143895761437e3d614357565b903d5f602084013e5b565b614391612dc0565b90614387565b5f7f4554485f5452414e534645525f4641494c454400000000000000000000000000910152565b6143cb6013602092611562565b6143d481614397565b0190565b6143ed9060208101905f8183039101526143be565b90565b156143f757565b6143ff6102a2565b62461bcd60e51b815280614415600482016143d8565b0390fd5b5f614446928192906144296102a2565b90816144348161434b565b03925af161444061436e565b506143f0565b565b61445d614462916144576115ed565b50612f74565b614b1f565b90565b5f7f4241445f544f4b454e5f41444452455353000000000000000000000000000000910152565b6144996011602092611562565b6144a281614465565b0190565b6144bb9060208101905f81830391015261448c565b90565b156144c557565b6144cd6102a2565b62461bcd60e51b8152806144e3600482016144a6565b0390fd5b90565b156144f25750565b614513906144fe6102a2565b91829162461bcd60e51b83526004830161159c565b0390fd5b61452081610652565b0361452757565b5f80fd5b9050519061453882614517565b565b9060208282031261455357614550915f0161452b565b90565b6102ac565b5f7f544f4b454e5f4f5045524154494f4e5f4641494c454400000000000000000000910152565b61458c6016602092611562565b61459581614558565b0190565b6145ae9060208101905f81830391015261457f565b90565b156145b857565b6145c06102a2565b62461bcd60e51b8152806145d660048201614599565b0390fd5b5f9182916145ef6145ea82614b50565b6144be565b9082602082019151925af161461561460561436e565b9161460f836144e7565b906144ea565b61461e816113d1565b61463061462a5f611fe8565b91610377565b11614639575b50565b61465661465b91602061464b826113d1565b81830101910161453a565b6145b1565b5f614636565b61466a90611fe8565b9052565b91602061468f92949361468860408201965f83019061031d565b0190614661565b565b90916146d46004916146c563095ea7b36146ac879391613273565b926146b56102a2565b9586946020860190815201613a0e565b60208201810382520382611485565b906146e96146e3828490614b79565b15610652565b6146f3575b505050565b61474060046147459461473b849161472c63095ea7b36147135f91613273565b9261471c6102a2565b968794602086019081520161466e565b60208201810382520383611485565b614c1b565b614c1b565b5f80806146ee565b61475961475f91610377565b91610377565b90811561476a570490565b612ac7565b61477761174b565b506147c36147bd6147b86001936147b26147a2614792612728565b61479c6001612d1e565b9061334d565b6147ac60026136b6565b9061474d565b90614e06565b610377565b91612d1e565b1490565b5f7f496e76616c6964206e756d626572000000000000000000000000000000000000910152565b6147fb600e602092611562565b614804816147c7565b0190565b61481d9060208101905f8183039101526147ee565b90565b1561482757565b61482f6102a2565b62461bcd60e51b81528061484560048201614808565b0390fd5b614851612ce0565b508061486561485f5f611fe8565b91610377565b141580614931575b80614911575b61487c90614820565b6148855f611fe8565b61488f6001612d1e565b8390614899612ce0565b505b836148ae6148a85f611fe8565b91610377565b14614909576148be82859061474d565b81939186829188908115614904576148d793099061334d565b918680156148ff576148f8936148f292089495809492613662565b9061334d565b929161489b565b612ac7565b612ac7565b505091505090565b5061487c826149286149225f611fe8565b91610377565b14159050614873565b508061494561493f84610377565b91610377565b141561486d565b9161498d94939161497f9361495f612ce0565b50614968612ce0565b509091600193926149798795612d1e565b92614e8f565b929190929092909192614fa9565b91909190565b92909493916149a0612ce0565b506149a9612ce0565b506149b35f611fe8565b506149bd5f611fe8565b506149c75f611fe8565b50836149db6149d583610377565b91610377565b145f14614a595750849084918215614a545708614a006149fa5f611fe8565b91610377565b145f14614a2357505050505f90614a20614a1a5f93611fe8565b92611fe8565b90565b614a4e93614a3f9260019291614a398694612d1e565b9161586c565b92919290925b92909192614fa9565b91909190565b612ac7565b915093614a4e94614a879391906001939091600190614a81614a7b8997612d1e565b92612d1e565b9461514d565b9291929092614a45565b602090614a9c6142b8565b50015163ffffffff60e01b1690565b90565b614ac2614abd614ac792614aab565b6102cd565b610377565b90565b614ad46020614aae565b90565b90565b614aee614ae9614af392614ad7565b6102cd565b610377565b90565b614b006004614ada565b90565b614b1c614b0e614aca565b614b16614af6565b906119f0565b90565b614b48614b4d91614b2e6115ed565b50614b37614b03565b90614b40612ce0565b5001516116a5565b610a1d565b90565b614b5861174b565b50614b61612ce0565b503b614b75614b6f5f611fe8565b91610377565b1190565b905f602091614b8661174b565b50614b8f61174b565b50614b98612ce0565b50614ba1612ce0565b50828151910182855af13d915f51919283614bbd575b50505090565b90919250614bd3614bcd5f611fe8565b91610377565b145f14614c0157614be49150613234565b3b614bf7614bf15f611fe8565b91610377565b115b5f8080614bb7565b50614c15614c0f6001612d1e565b91610377565b14614bf9565b905f602091614c28612ce0565b50614c31612ce0565b50828151910182855af115614cc4573d5f5190614c56614c505f611fe8565b91610377565b145f14614caa5750614c6781613234565b3b614c7a614c745f611fe8565b91610377565b145b614c835750565b614c8f614ca691613234565b5f918291635274afe760e01b83526004830161032a565b0390fd5b614cbd614cb76001612d1e565b91610377565b1415614c7c565b6040513d5f823e3d90fd5b90565b614ce6614ce1614ceb92614ccf565b6102cd565b6102c2565b90565b614cf790614cd2565b90565b60ff1690565b614d14614d0f614d1992614aab565b6102cd565b614cfa565b90565b614d2590614d00565b9052565b9194614d71614d7b92989795614d6760a096614d5d614d829a614d5360c08a019e5f8b0190614d1c565b6020890190614d1c565b6040870190614d1c565b60608501906103cd565b60808301906103cd565b01906103cd565b565b5f7f4649454c445f504f575f4641494c454400000000000000000000000000000000910152565b614db86010602092611562565b614dc181614d84565b0190565b614dda9060208101905f818303910152614dab565b90565b15614de457565b614dec6102a2565b62461bcd60e51b815280614e0260048201614dc5565b0390fd5b5f8091614e8c93614e15612ce0565b50614e5c614e236005614cee565b92614e4d602091602094602091614e38612728565b92614e416102a2565b97889660208801614d29565b60208201810382520382611485565b602081019051915afa614e76614e7061436e565b91614ddd565b6020614e81826113d1565b81830101910161324c565b90565b9493929194614e9c612ce0565b50614ea5612ce0565b50614eae612ce0565b5080614ec2614ebc5f611fe8565b91610377565b14614f9b579590614ed25f611fe8565b95614edc5f611fe8565b93614ee76001612d1e565b985b80614efc614ef65f611fe8565b91610377565b14614f8a5780614f0c6001612d1e565b16614f1f614f195f611fe8565b91610377565b03614f5c575b90614f3e614f4a9392614f3860026136b6565b9061474d565b9391908791899361586c565b97919794909792979197949094614ee9565b97614f3e95829a614f4a9493614f7a93929187908692938d9561514d565b9a91969096999192935050614f25565b505050509250929050919291929190565b509150939150919291929190565b91614fcb9094939194614fba612ce0565b50614fc3612ce0565b508290614849565b918283839182156150095709908183918215615004570994929082918215614fff570990918215614ffa570990565b612ac7565b612ac7565b612ac7565b612ac7565b67ffffffffffffffff81116150235760200290565b611471565b6150346150399161500e565b6114ae565b90565b369037565b9061505f61504e83615028565b92615059849161500e565b9061503c565b565b61506b6004615041565b90565b50600490565b9061507e8261506e565b81101561508c576020020190565b61226c565b9061509b90610377565b9052565b6150a99051610377565b90565b90565b6150c36150be6150c8926150ac565b6102cd565b610377565b90565b5f7f557365206a6163446f75626c652066756e6374696f6e20696e73746561640000910152565b6150ff601e602092611562565b615108816150cb565b0190565b6151219060208101905f8183039101526150f2565b90565b1561512b57565b6151336102a2565b62461bcd60e51b8152806151496004820161510c565b0390fd5b92969495969390919361515e612ce0565b50615167612ce0565b50615170612ce0565b508361518461517e5f611fe8565b91610377565b1480615833575b61582457806151a261519c5f611fe8565b91610377565b148061580a575b6157fb576151b5615061565b9285868a9081156157f6576151dd92096151d8866151d25f611fe8565b90615074565b615091565b856151f96151f4866151ee5f611fe8565b90615074565b61509f565b8a9081156157f15761521f920961521a866152146001612d1e565b90615074565b615091565b87888a9081156157ec5761524792096152428661523c60026136b6565b90615074565b615091565b8761526461525f8661525960026136b6565b90615074565b61509f565b8a9081156157e75761528a92096152858661527f60036150af565b90615074565b615091565b6152946004615028565b946152b16152ac866152a660026136b6565b90615074565b61509f565b8a9081156157e2576152c692095f8701615091565b6152e26152dd856152d760036150af565b90615074565b61509f565b899081156157dd576152f8920960208601615091565b9061531461530f846153095f611fe8565b90615074565b61509f565b90889283156157d8576153499361534493615333920960408701615091565b9261533e6001612d1e565b90615074565b61509f565b869081156157d35761535f920960608301615091565b9361537b615376866153705f611fe8565b90615074565b61509f565b6153a86153a261539d6153988961539260026136b6565b90615074565b61509f565b610377565b91610377565b1415801561577d575b6153ba90615124565b6153c2615061565b936153df6153da876153d460026136b6565b90615074565b61509f565b615404836153fe6153f98a6153f35f611fe8565b90615074565b61509f565b9061334d565b839081156157785761542992086154248761541e5f611fe8565b90615074565b615091565b6154456154408761543a60036150af565b90615074565b61509f565b61546b836154656154608a61545a6001612d1e565b90615074565b61509f565b9061334d565b8390811561577357615491920861548c876154866001612d1e565b90615074565b615091565b6154ac6154a7866154a15f611fe8565b90615074565b61509f565b6154c76154c2876154bc5f611fe8565b90615074565b61509f565b8390811561576e576154ed92096154e8876154e260026136b6565b90615074565b615091565b615509615504866154fe60026136b6565b90615074565b61509f565b61552461551f876155195f611fe8565b90615074565b61509f565b839081156157695761554a92096155458761553f60036150af565b90615074565b615091565b6155666155618661555b6001612d1e565b90615074565b61509f565b61558261557d876155776001612d1e565b90615074565b61509f565b8391821561576457096155b1836155ab6155a6896155a060036150af565b90615074565b61509f565b9061334d565b8391821561575f5708826002906155d96155d48a6155ce5f611fe8565b90615074565b61509f565b6155f56155f08a6155ea60026136b6565b90615074565b61509f565b8691821561575a57098590811561575557615612615619946136b6565b099061334d565b8391821561575057089561563f61563a876156346001612d1e565b90615074565b61509f565b61565a6156558361564f5f611fe8565b90615074565b61509f565b6156766156718961566b60026136b6565b90615074565b61509f565b8591821561574b570961568a858a9061334d565b859182156157465708849182156157415709906156ba6156b585926156af6001612d1e565b90615074565b61509f565b906156d76156d2896156cc60036150af565b90615074565b61509f565b8590811561573c576156ea93099061334d565b90838015615737576157109261570b9208966157055f611fe8565b90615074565b61509f565b92908291821561573257099091821561572d570992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b506153ba61579d615798876157926001612d1e565b90615074565b61509f565b6157ca6157c46157bf6157ba8a6157b460036150af565b90615074565b61509f565b610377565b91610377565b141590506153b1565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b50509350909350919291929190565b508161581e6158185f611fe8565b91610377565b146151a9565b93509495505050919291929190565b50826158476158415f611fe8565b91610377565b1461518b565b90565b61586461585f6158699261584d565b6102cd565b610377565b90565b9492949390919361587b612ce0565b50615884612ce0565b5061588d612ce0565b50846158a161589b5f611fe8565b91610377565b14615a2357808183918215615a1e570995838484918215615a19570991868785918215615a145709906004908486918215615a0f570985918215615a0a576158e890614ada565b099760039085918215615a05576158fe906150af565b0991908085918215615a005709849182156159fb5709839182156159f65708958687849182156159f1570983829083869081156159ec5761594093089061334d565b849182156159e75708969061595684899061334d565b849182156159e25708839182156159dd5709908260089180859182156159d85709849081156159d35761598b61599294615850565b099061334d565b829182156159ce57089360029290829182156159c95709909182156159c4576159ba906136b6565b0992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b919394505091929192919056fea26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","sourceMap":"868:4258:26:-:0;;;;;;;;;-1:-1:-1;868:4258:26;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;2068:51:25:-;2105:14;2113:5;2105:14;:::i;:::-;2068:51;:::o;:::-;;;:::i;:::-;;:::o;868:4258:26:-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1627:105::-;1666:66;;;:::i;:::-;1627:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;6314:31:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;2511:81::-;2550:42;2511:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;2769:81::-;2808:42;2769:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2922:105::-;2961:66;;;:::i;:::-;2922:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;998:125::-;1047:76;;;:::i;:::-;998:125;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2083:52::-;2125:10;;;:::i;:::-;2083:52;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2400:105::-;2439:66;;;:::i;:::-;2400:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2856:60::-;2898:18;;;:::i;:::-;2856:60;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;6473:47:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1368:105::-;1407:66;;;:::i;:::-;1368:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1825:54::-;1867:12;;;:::i;:::-;1825:54;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1738:81::-;1777:42;1738:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;6026:26:23;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3120:54::-;3162:12;;;:::i;:::-;3120:54;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;3033:81::-;3072:42;3033:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2141:105::-;2180:66;;;:::i;:::-;2141:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;2252:81::-;2291:42;2252:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;2670:24:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1885:105::-;1924:66;;;:::i;:::-;1885:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2658:105::-;2697:66;;;:::i;:::-;2658:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1996:81::-;2035:42;1996:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1479:81::-;1518:42;1479:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;6169:39:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2339:55::-;2381:13;;;:::i;:::-;2339:55;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2598:54::-;2640:12;;;:::i;:::-;2598:54;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1566:55::-;1608:13;;;:::i;:::-;1566:55;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;:::o;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;:::o;1299:62:22:-;1332:29;;:::i;:::-;1299:62;:::o;:::-;;;:::i;:::-;;:::o;868:4258:26:-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1433:55:22:-;1474:14;868:4258:26;;;;;1474:14:22;:::i;:::-;1433:55;:::o;1474:14::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;4503:314::-;4561:7;;:::i;:::-;4604;:17;;:7;4612:8;4604:17;;:::i;:::-;;:::i;:::-;4636:13;:29;;4653:12;4661:3;4653:12;:::i;:::-;4636:29;:::i;:::-;;;:::i;:::-;;4632:80;;4729:8;;:37;;4742:8;4753:12;;:::i;:::-;4742:23;4729:37;:::i;:::-;;;:::i;:::-;;:81;;;;4777:17;4769:26;4785:8;4777:17;:::i;:::-;4769:26;:::i;:::-;4729:81;4722:88;:::o;4729:81::-;4806:3;4798:12;4806:3;4798:12;:::i;:::-;4729:81;;4632:80;4688:13;;4681:20;:::o;868:4258:26:-;;;:::o;3751:78:22:-;3794:4;;:::i;:::-;3817:5;;3810:12;:::o;868:4258:26:-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;6250:431:13:-;;3826:1:26;;;:::i;:::-;6388:26:13;;;:::i;:::-;6429:1;:15;;:1;:15;;:::i;:::-;:44;;;;6250:431;6425:105;;6616:23;6556:7;6605:1;6556:7;6539:24;6556:7;6539:14;:1;:14;:24;:::i;:::-;6573:22;6591:4;6573:15;:1;:15;:22;:::i;:::-;6605:1;:::i;:::-;6616:15;6634:5;6616:1;:15;:23;:::i;:::-;6654:20;;;;;:::i;:::-;;;;;;:::i;:::-;;;;6250:431::o;6425:105::-;6496:23;;;;;;;;;;;;:::i;:::-;;;;6429:44;6448:1;:14;;:1;:14;;:::i;:::-;:25;;6466:7;6448:25;:::i;:::-;;;:::i;:::-;;;6429:44;;868:4258:26;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;3709:1415::-;;;3887:67;3939:15;;:::i;:::-;3887:67;:48;:32;:18;3906:12;;:::i;:::-;3887:32;;:::i;:::-;3920:14;;:::i;:::-;3887:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;3964;4016:15;;:::i;:::-;3964:67;:48;:32;:18;3983:12;;:::i;:::-;3964:32;;:::i;:::-;3997:14;;:::i;:::-;3964:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4041;4093:15;;:::i;:::-;4041:67;:48;:32;:18;4060:12;;:::i;:::-;4041:32;;:::i;:::-;4074:14;;:::i;:::-;4041:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4118;4170:15;;:::i;:::-;4118:67;:48;:32;:18;4137:12;;:::i;:::-;4118:32;;:::i;:::-;4151:14;;:::i;:::-;4118:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4195;4247:15;;:::i;:::-;4195:67;:48;:32;:18;4214:12;;:::i;:::-;4195:32;;:::i;:::-;4228:14;;:::i;:::-;4195:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4272;4324:15;;:::i;:::-;4272:67;:48;:32;:18;4291:12;;:::i;:::-;4272:32;;:::i;:::-;4305:14;;:::i;:::-;4272:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4349;4401:15;;:::i;:::-;4349:67;:48;:32;:18;4368:12;;:::i;:::-;4349:32;;:::i;:::-;4382:14;;:::i;:::-;4349:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4522:21;;:7;4530:12;;:::i;:::-;4522:21;;:::i;:::-;;:::i;:::-;:35;;4547:10;4555:1;4547:10;:::i;:::-;4522:35;:::i;:::-;;;:::i;:::-;;4518:77;;3709:1415;4609:21;;:7;4617:12;;:::i;:::-;4609:21;;:::i;:::-;;:::i;:::-;:35;;4634:10;4642:1;4634:10;:::i;:::-;4609:35;:::i;:::-;;;:::i;:::-;;4605:77;;3709:1415;4696:21;;:7;4704:12;;:::i;:::-;4696:21;;:::i;:::-;;:::i;:::-;:35;;4721:10;4729:1;4721:10;:::i;:::-;4696:35;:::i;:::-;;;:::i;:::-;;4692:77;;3709:1415;4783:21;;:7;4791:12;;:::i;:::-;4783:21;;:::i;:::-;;:::i;:::-;:35;;4808:10;4816:1;4808:10;:::i;:::-;4783:35;:::i;:::-;;;:::i;:::-;;4779:77;;3709:1415;4870:21;;:7;4878:12;;:::i;:::-;4870:21;;:::i;:::-;;:::i;:::-;:35;;4895:10;4903:1;4895:10;:::i;:::-;4870:35;:::i;:::-;;;:::i;:::-;;4866:77;;3709:1415;4957:21;;:7;4965:12;;:::i;:::-;4957:21;;:::i;:::-;;:::i;:::-;:35;;4982:10;4990:1;4982:10;:::i;:::-;4957:35;:::i;:::-;;;:::i;:::-;;4953:77;;3709:1415;5044:21;;:7;5052:12;;:::i;:::-;5044:21;;:::i;:::-;;:::i;:::-;:35;;5069:10;5077:1;5069:10;:::i;:::-;5044:35;:::i;:::-;;;:::i;:::-;;5040:77;;3709:1415;:::o;5040:77::-;5081:36;5105:12;;:::i;:::-;5081:21;:7;5089:12;;:::i;:::-;5081:21;;:::i;:::-;:36;:::i;:::-;5040:77;;4953;4994:36;5018:12;;:::i;:::-;4994:21;:7;5002:12;;:::i;:::-;4994:21;;:::i;:::-;:36;:::i;:::-;4953:77;;4866;4907:36;4931:12;;:::i;:::-;4907:21;:7;4915:12;;:::i;:::-;4907:21;;:::i;:::-;:36;:::i;:::-;4866:77;;4779;4820:36;4844:12;;:::i;:::-;4820:21;:7;4828:12;;:::i;:::-;4820:21;;:::i;:::-;:36;:::i;:::-;4779:77;;4692;4733:36;4757:12;;:::i;:::-;4733:21;:7;4741:12;;:::i;:::-;4733:21;;:::i;:::-;:36;:::i;:::-;4692:77;;4605;4646:36;4670:12;;:::i;:::-;4646:21;:7;4654:12;;:::i;:::-;4646:21;;:::i;:::-;:36;:::i;:::-;4605:77;;4518;4559:36;4583:12;;:::i;:::-;4559:21;:7;4567:12;;:::i;:::-;4559:21;;:::i;:::-;:36;:::i;:::-;4518:77;;3709:1415;;;;;:::i;:::-;:::o;868:4258::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;2388:729:22:-;;2490:34;2498:25;2514:8;2498:25;:::i;:::-;2490:34;:::i;:::-;2534:66;2542:30;2562:9;2542:30;:::i;:::-;2534:66;:::i;:::-;2973:137;2628:9;2718:18;2828:41;2718:37;;:28;:18;2737:8;2718:28;;:::i;:::-;2747:7;2718:37;;:::i;:::-;;:::i;:::-;2773:15;2765:53;2773:15;:19;;2791:1;2773:19;:::i;:::-;;;:::i;:::-;;2765:53;:::i;:::-;2828:37;:41;2868:1;2828:41;:::i;:::-;:18;:28;:18;2847:8;2828:28;;:::i;:::-;:37;:::i;:::-;:41;:::i;:::-;2942:15;2920:9;2931;2942:15;;;:::i;:::-;3019:9;3030:42;3019:9;3056:15;3030:42;;:::i;:::-;3074:15;2973:137;;;;:::i;:::-;;;;;;:::i;:::-;;;;2388:729::o;2466:103:17:-;;2531:1;2466:103;;;:::i;:::-;2531:1;:::i;:::-;;;:::i;:::-;2466:103::o;868:4258:26:-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;1829:133:25;;1954:1;1829:133;1871:73;1879:10;:30;;1893:16;;;:::i;:::-;1879:30;:::i;:::-;;;:::i;:::-;;1871:73;:::i;:::-;1954:1;:::i;:::-;1829:133::o;868:4258:26:-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;4108:1014:25;;4288:48;4296:13;:6;;:13;;:::i;:::-;:17;;4312:1;4296:17;:::i;:::-;;;:::i;:::-;;4288:48;:::i;:::-;4347:21;4367:1;4347:21;:::i;:::-;4395:1;4383:13;4395:1;4383:13;:::i;:::-;4417:3;4398:1;:17;;4402:13;:6;;:13;;:::i;:::-;4398:17;:::i;:::-;;;:::i;:::-;;;;;4417:3;4484:6;:15;;:9;:6;;4491:1;4484:9;;:::i;:::-;:15;;:::i;:::-;4501:16;;:9;:6;;4508:1;4501:9;;:::i;:::-;:16;;:::i;:::-;4554;4519:19;;:9;:6;;4526:1;4519:9;;:::i;:::-;:19;;:::i;:::-;4436:103;;;4567:3;;4554:16;;:::i;:::-;4592:9;4584:56;4592:9;:22;;4605:9;4592:22;:::i;:::-;;;:::i;:::-;;;4584:56;:::i;:::-;4659:5;:19;;4668:10;;:::i;:::-;4659:19;:::i;:::-;;;:::i;:::-;;4655:383;;;;4731:3;4723:6;;;4731:3;:::i;:::-;4787:24;;;:::i;:::-;4813:10;4758:66;;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;:::i;:::-;;;;4655:383;4417:3;:::i;:::-;4383:13;;4655:383;4921:3;4905:5;4890:21;4905:5;4890:21;:::i;:::-;4913:6;;4921:3;;;:::i;:::-;4986:24;;;:::i;:::-;5012:10;4948:75;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;:::i;:::-;;;;4655:383;;4398:17;;;;5057:58;4398:17;5065:22;;5078:9;5065:22;:::i;:::-;;;:::i;:::-;;5057:58;:::i;:::-;4108:1014::o;:::-;;;;;:::i;:::-;:::o;12890:155:22:-;;;13023:14;12890:155;13001:10;13013:8;13023:14;;;;:::i;:::-;12890:155::o;2466:103:17:-;;;:::i;:::-;2531:1;;:::i;:::-;;;:::i;:::-;2466:103::o;1829:133:25:-;1871:73;1879:10;:30;;1893:16;;;:::i;:::-;1879:30;:::i;:::-;;;:::i;:::-;;1871:73;:::i;:::-;1954:1;;:::i;:::-;1829:133::o;868:4258:26:-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;;;;;;;3711:177:25;3809:31;:17;;;:::i;:::-;:31;:::i;:::-;;3848:9;3809:49;;;3859:9;;;;:::i;:::-;3870:10;;3809:72;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;3711:177;;:::o;3809:72::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;3711:177::-;;;:::i;:::-;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;12191:102:22:-;12228:65;868:4258:26;12228:65:22;;;;;:::i;:::-;12191:102;:::o;12228:65::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;12228:65:22;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;12228:65:22;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;12228:65:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;750:113:29:-;787:76;;;:::i;:::-;750:113;:::o;787:76::-;868:4258:26;;;787:76:29;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;13448:955:22:-;;13953:33;14286:9;13448:955;;14040:44;13448:955;13558:43;13566:8;:13;;13578:1;13566:13;:::i;:::-;;;:::i;:::-;;;13558:43;:::i;:::-;13611:50;13619:8;:20;;13630:9;;:::i;:::-;13619:20;:::i;:::-;;;:::i;:::-;;13611:50;:::i;:::-;13671:52;13679:6;:20;;13689:10;13697:1;13689:10;:::i;:::-;13679:20;:::i;:::-;;;:::i;:::-;;;13671:52;:::i;:::-;13733:65;13741:17;;:7;13749:8;13741:17;;:::i;:::-;;:::i;:::-;:31;;13762:10;13770:1;13762:10;:::i;:::-;13741:31;:::i;:::-;;;:::i;:::-;;13733:65;:::i;:::-;13808:50;13816:20;13827:8;13816:20;:::i;:::-;13808:50;:::i;:::-;13868:74;13876:21;:14;;:21;;:::i;:::-;:31;;13901:6;13876:31;:::i;:::-;;;:::i;:::-;;13868:74;:::i;:::-;13953:33;:::i;:::-;14040:44;;;;:::i;:::-;;;;;;;;:::i;:::-;13996:88;14125:102;:75;14181:6;14143:55;14189:8;14143:55;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;14133:66;;;;:::i;:::-;;;:::i;:::-;;14125:75;:::i;:::-;14203:24;;:::i;:::-;14125:102;;:::i;:::-;14270:1;14276:8;14286:9;;;:::i;:::-;14307:26;14327:6;14307:17;:7;14315:8;14307:17;;:::i;:::-;:26;:::i;:::-;14375:8;14385:10;14349:47;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;13448:955::o;868:4258:26:-;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;5652:344:22:-;5720:15;;:::i;:::-;5752:19;5751:39;5752:38;;:19;5772:17;5752:38;;:::i;:::-;;:::i;:::-;5751:39;;:::i;:::-;5747:243;;;;5862:1;5852:11;5862:1;5852:11;:::i;:::-;5747:243;;5652:344::o;5747:243::-;5942:37;;:18;;:37;:::i;:::-;;:::i;:::-;5747:243;;;3368:238;3561:37;;3527:72;3368:238;3456:7;;:::i;:::-;3503;3561:28;3503:7;3561:18;;:28;:::i;:::-;:37;:::i;:::-;;:::i;:::-;3527:72;;:::i;:::-;3520:79;:::o;868:4258:26:-;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;5054:317:22:-;5333:31;5321:43;5054:317;5116:22;;:::i;:::-;5216:19;5208:68;5216:30;;:19;5236:9;5216:30;;:::i;:::-;;:::i;:::-;5208:68;:::i;:::-;5333:20;:31;:::i;:::-;5321:43;:::i;:::-;5054:317;:::o;9071:205:13:-;9186:27;;:::i;:::-;9071:205;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;9196:189:22;9297:19;9196:189;9262:14;;:::i;:::-;9307:8;9297:19;:::i;:::-;9334:6;9326:52;9334:6;:22;;9344:12;9352:3;9344:12;:::i;:::-;9334:22;:::i;:::-;;;:::i;:::-;;;9326:52;:::i;:::-;9196:189::o;868:4258:26:-;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;1668:66:22:-;1708:26;1715:18;1708:26;:::i;:::-;1668:66;:::o;1538:82::-;1580:40;1587:32;1580:40;:::i;:::-;1538:82;:::o;8676:243::-;8786:45;8676:243;8747:4;;:::i;:::-;8821:9;8786:45;:::i;:::-;8848:13;:29;;8865:12;;:::i;:::-;8848:29;:::i;:::-;;;:::i;:::-;;:64;;;;;8676:243;8841:71;;:::o;8848:64::-;8881:13;;:31;;8898:14;;:::i;:::-;8881:31;:::i;:::-;;;:::i;:::-;;8848:64;;;868:4258:26;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;6310:1286:22;;;6477:55;6485:9;:25;;6498:12;6506:3;6498:12;:::i;:::-;6485:25;:::i;:::-;;;:::i;:::-;;;6477:55;:::i;:::-;6559:42;6574:9;6585:15;6559:42;;:::i;:::-;6623:9;6615:18;6623:9;6615:18;:::i;:::-;6611:979;;;;6653:20;;6672:1;6653:20;:::i;:::-;;;:::i;:::-;;6649:33;;6718:34;6847:30;6742:9;6718:34;:::i;:::-;6781:20;6788:12;6781:20;:::i;:::-;6847:30;:15;:5;:15;:::i;:::-;;6871:4;6847:30;6863:13;6871:4;6863:13;:::i;:::-;6847:30;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;7030:8;7084:30;6847;6915:66;;7084:15;6847:30;7084;6847;;;;;6611:979;6815:62;6938:14;6915:66;6938:23;:14;:23;:::i;:::-;6963:9;6974:6;6915:66;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;7030:8;;:::i;:::-;7084:15;:::i;:::-;;7108:4;7084:30;7100:13;7108:4;7100:13;:::i;:::-;7084:30;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;7316;7292:54;7084:30;7292:54;7084:30;7284:95;7084:30;;;;;6611:979;7053:61;7128:67;7136:20;:45;;7160:21;7136:45;:::i;:::-;;;:::i;:::-;;;7128:67;:::i;:::-;7316:21;:30;:::i;:::-;7292:54;:::i;:::-;;;:::i;:::-;;7284:95;:::i;:::-;6611:979;6310:1286::o;7084:30::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;6847:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;6649:33::-;6675:7;;;:::o;6611:979::-;7408:9;;;7400:18;7408:9;7400:18;:::i;:::-;7396:194;;;;7438:20;;7457:1;7438:20;:::i;:::-;;;:::i;:::-;;7434:33;;7480:28;7509:6;7480:9;:28;:::i;:::-;7509:6;:::i;:::-;6611:979;;7434:33;7460:7;;:::o;7396:194::-;7547:32;;:::i;:::-;868:4258:26;;;7547:32:22;;;;;;;;:::i;:::-;;;;868:4258:26;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;:::i;8267:223:22:-;;8410:29;8458:25;8267:223;8366:14;;:::i;:::-;8421:17;8410:29;:::i;:::-;8458:25;;:::i;:::-;8267:223;:::o;868:4258:26:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1864:36:17:-;1899:1;;;:::i;:::-;1864:36;:::o;2575:307::-;2702:7;;;:::i;:::-;:18;;2713:7;;:::i;:::-;2702:18;:::i;:::-;;;:::i;:::-;;2698:86;;2858:17;2868:7;;:::i;:::-;2858:17;;:::i;:::-;2575:307::o;2698:86::-;2743:30;;;;;;;;;;;;:::i;:::-;;;;1818:40;1857:1;;;:::i;:::-;1818:40;:::o;2888:208::-;3068:21;3078:11;;:::i;:::-;3068:21;;:::i;:::-;2888:208::o;868:4258:26:-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;5391:661:25:-;;;;5502:55;5510:14;5518:5;5510:14;:::i;:::-;:28;;5528:10;5536:1;5528:10;:::i;:::-;5510:28;:::i;:::-;;;:::i;:::-;;;5502:55;:::i;:::-;5567:36;5575:6;:10;;5584:1;5575:10;:::i;:::-;;;:::i;:::-;;5567:36;:::i;:::-;5632:30;;:15;:5;:15;:::i;:::-;;5656:4;5632:30;5648:13;5656:4;5648:13;:::i;:::-;5632:30;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;5672:50;5632:30;;;;;5391:661;5614:48;5680:17;;5691:6;5680:17;:::i;:::-;;;:::i;:::-;;;5672:50;:::i;:::-;5930:6;5881:22;5888:14;5896:5;5888:14;:::i;:::-;5881:22;:::i;:::-;5917:11;;;:::i;:::-;5930:6;;;:::i;:::-;5947:39;:29;5964:11;;;:::i;:::-;5947:29;:::i;:::-;:39;:::i;:::-;;;5994:9;5947:57;;;6012:24;;;:::i;:::-;6038:6;5947:98;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;5391:661;;:::o;5947:98::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;5632:30::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;868:4258:26:-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;6259:366:25:-;;6346:36;6354:6;:10;;6363:1;6354:10;:::i;:::-;;;:::i;:::-;;6346:36;:::i;:::-;6442:62;6411:13;6419:4;6411:13;:::i;:::-;:21;6450:29;;6461:18;:6;6470:9;6461:18;;:::i;:::-;6450:29;:::i;:::-;;;:::i;:::-;;;6442:62;:::i;:::-;6515:42;:29;6532:11;;;:::i;:::-;6515:29;:::i;:::-;:42;:::i;:::-;;6565:18;6515:42;6565:6;;:18;:::i;:::-;6515:69;;;6585:24;;;;:::i;:::-;6611:6;6515:103;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;6259:366;;:::o;6515:103::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;868:4258:26:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;12342:99:22:-;12376:65;;;:::i;:::-;12342:99;:::o;14589:266::-;14649:4;;:::i;:::-;14696:8;;14706;14716:9;;:::i;:::-;14689:37;;;;;;14728:8;14738:9;;:::i;:::-;14682:66;;;;;;14807:8;14817:9;;:::i;:::-;14792:35;;;;;;14829:6;;:::i;:::-;14837:9;;:::i;:::-;14785:62;;;;;14765:83;14785:62;;14765:83;:::i;:::-;14758:90;:::o;14785:62::-;;:::i;14792:35::-;;:::i;14682:66::-;;:::i;14689:37::-;;:::i;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;869:52:29:-;918:3;;;:::i;:::-;869:52;:::o;918:3::-;;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;918:3:29;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;918:3:29;;;;;;;;:::i;:::-;;;;483:105;523:65;868:4258:26;12228:65:22;;;;523::29;:::i;:::-;483:105;:::o;635:109::-;668:76;;;:::i;:::-;635:109;:::o;668:76::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;927:102::-;964:65;;;:::i;:::-;927:102;:::o;964:65::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1035:101::-;1072:64;;;:::i;:::-;1035:101;:::o;594:35::-;628:1;;;:::i;:::-;594:35;:::o;628:1::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;628:1:29;;;;;;;;:::i;:::-;;;;1143:1253;;;;1397:18;1143:1253;1250:62;1258:18;:7;1268:8;;:::i;:::-;1258:18;;:::i;:::-;:29;;1280:7;1258:29;:::i;:::-;;;:::i;:::-;;1250:62;:::i;:::-;1331:1;:6;;1336:1;1331:6;:::i;:::-;;;:::i;:::-;;;1330:26;;;1143:1253;1322:53;;;:::i;:::-;1406:8;;:::i;:::-;1397:18;;:::i;:::-;1434:1;;:6;;1439:1;1434:6;:::i;:::-;;;:::i;:::-;;;1433:45;;;1143:1253;1425:72;;;:::i;:::-;1516:1;:6;;1521:1;1516:6;:::i;:::-;;;:::i;:::-;;;1515:45;;;1143:1253;1507:72;;;:::i;:::-;1699:4;1705;1711:11;;:::i;:::-;1692:31;;;;;;1725:4;1731:11;;:::i;:::-;1685:58;;;;;;1777:4;;1783;1789:11;;:::i;:::-;1770:31;;;;;;1843:2;1847:4;1853:11;;:::i;:::-;1836:29;;;;;;1867:4;;;:::i;:::-;1873:11;;;:::i;:::-;1829:56;;;;;2142:39;2044:53;2351:10;1829:56;1815:92;2208:48;1829:56;1823:62;;2343:46;1829:56;;2295:37;1829:56;2351:10;1829:56;;1823:62;:::i;:::-;;;:::i;:::-;;1815:92;:::i;:::-;1957:11;;:::i;:::-;1978;;;:::i;:::-;2044:7;2058:8;;:::i;:::-;2068;;:::i;:::-;2078:5;;:::i;:::-;2085:11;;;:::i;:::-;2044:53;;:::i;:::-;2013:84;;;2142:1;;2150:4;2156;2162:5;;:::i;:::-;2169:11;;;:::i;:::-;2142:39;;:::i;:::-;2111:70;;;2208:4;2219;2225;2237:5;;:::i;:::-;2244:11;;;:::i;:::-;2208:48;;:::i;:::-;2313:5;;:::i;:::-;2320:11;;;:::i;:::-;2295:37;;:::i;:::-;2276:56;2360:1;2351:10;:::i;:::-;;;:::i;:::-;;2343:46;:::i;:::-;1143:1253::o;1829:56::-;;:::i;1836:29::-;;:::i;1770:31::-;;:::i;1685:58::-;;:::i;1692:31::-;;:::i;1515:45::-;1528:1;1507:72;1528:1;:31;;1533:25;:1;:25;1538:20;;:::i;:::-;1533:25;;:::i;:::-;;:::i;:::-;1528:31;:::i;:::-;;;:::i;:::-;;1515:45;;;;1433;1446:1;1425:72;1446:1;:31;;1451:25;:1;:25;1456:20;;:::i;:::-;1451:25;;:::i;:::-;;:::i;:::-;1446:31;:::i;:::-;;;:::i;:::-;;1433:45;;;;1330:26;1343:1;1322:53;1343:1;:12;;1347:8;;:::i;:::-;1343:12;:::i;:::-;;;:::i;:::-;;1330:26;;;;868:4258:26;;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3098:115:13:-;3147:66;;;:::i;:::-;3098:115;:::o;8819:122::-;8887:7;;:::i;:::-;8913:21;;;:::i;:::-;8906:28;:::o;868:4258:26:-;;;:::o;10571:176:22:-;10716:23;10681:59;10571:176;10656:6;;:::i;:::-;10729:9;10716:23;:::i;:::-;10681:59;:::i;:::-;10674:66;:::o;10237:152::-;10319:45;10237:152;10296:4;;:::i;:::-;10354:9;10319:45;:::i;:::-;:63;;10368:14;;:::i;:::-;10319:63;:::i;:::-;;;:::i;:::-;;10312:70;:::o;9896:150::-;9978:45;9896:150;9955:4;;:::i;:::-;10013:9;9978:45;:::i;:::-;:61;;10027:12;;:::i;:::-;9978:61;:::i;:::-;;;:::i;:::-;;9971:68;:::o;868:4258:26:-;;;;:::o;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;628:217:27;728:33;799:39;628:217;;;728:29;:33;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;799:39;:::i;:::-;628:217::o;7781:169:22:-;7919:23;7882:61;7781:169;7856:7;;:::i;:::-;7932:9;7919:23;:::i;:::-;7882:61;:::i;:::-;7875:68;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;1054:452:27;1299:27;1054:452;;;1149:54;1157:24;1168:12;1157:24;:::i;:::-;1149:54;:::i;:::-;1317:8;1299:27;;;;;;;;;1336:36;1299:27;;:::i;:::-;1344:7;1353:18;1360:10;1353:18;:::i;:::-;1336:36;;:::i;:::-;1387:17;:10;:17;:::i;:::-;:21;;1407:1;1387:21;:::i;:::-;;;:::i;:::-;;1383:117;;1054:452;;:::o;1383:117::-;1432:30;1424:65;1443:10;1432:30;;;;:::i;:::-;;;;;;;;:::i;:::-;1424:65;:::i;:::-;1383:117;;;868:4258:26;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;5084:380:16:-;;;5199:47;;5084:380;5199:47;5214:13;5199:47;5230:7;5239:5;5199:47;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;5286:5;5261:45;5262:44;5286:5;5293:12;5262:44;;:::i;:::-;5261:45;;:::i;:::-;5257:201;;5084:380;;;;:::o;5257:201::-;5349:43;;5434:12;5342:5;5349:43;5342:5;5364:13;5349:43;5364:13;5349:43;5389:1;5349:43;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;:::-;5434:12;:::i;:::-;5257:201;;;;;868:4258:26;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;14966:154:22:-;15039:4;;:::i;:::-;15062:1;:51;;15067:46;15062:1;15077:12;15092:19;15093:13;:9;;:::i;:::-;:13;15105:1;15093:13;:::i;:::-;;;:::i;:::-;15092:19;15110:1;15092:19;:::i;:::-;;;:::i;:::-;15067:46;;:::i;:::-;15062:51;:::i;:::-;;;:::i;:::-;;15055:58;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;834:438:28;898:7;;:::i;:::-;925:2;;:7;;931:1;925:7;:::i;:::-;;;:::i;:::-;;;:20;;;834:438;925:32;;;834:438;917:59;;;:::i;:::-;986:13;998:1;986:13;:::i;:::-;1009:16;1024:1;1009:16;:::i;:::-;1047:3;1060:9;;;:::i;:::-;1079:169;;1086:2;:7;;1092:1;1086:7;:::i;:::-;;;:::i;:::-;;;;1113:6;:1;1117:2;1113:6;;:::i;:::-;1146:4;1159:1;1163:3;;1176:1;1179:4;1185:3;1169:20;;;;;1163:26;1169:20;;1163:26;;:::i;:::-;1192:3;;1152:44;;;;1226:10;1152:44;1230:6;1152:44;;1133:64;1222:2;;1226:1;1230;:6;:::i;:::-;1226:10;;:::i;:::-;1079:169;;;;1152:44;;:::i;1169:20::-;;:::i;1086:7::-;;;;;;1257:8;:::o;925:32::-;949:3;917:59;949:3;:8;;956:1;949:8;:::i;:::-;;;:::i;:::-;;;925:32;;;;:20;936:2;;:9;;942:3;936:9;:::i;:::-;;;:::i;:::-;;;925:20;;3316:275;;3559:25;3316:275;;;3511:31;3316:275;3440:7;;:::i;:::-;3449;;;:::i;:::-;3518:2;3522;3526;3530:1;3533:3;3538;3511:31;3538:3;3511:31;;:::i;:::-;;;:::i;:::-;3472:70;;;;3568:2;3572;3576;3580:3;3559:25;;:::i;:::-;3552:32;;;;:::o;2671:567::-;;;;;;2811:7;;:::i;:::-;2820;;;:::i;:::-;2855:1;2843:13;2855:1;2843:13;:::i;:::-;2878:1;2866:13;2878:1;2866:13;:::i;:::-;2901:1;2889:13;2901:1;2889:13;:::i;:::-;2916:3;;:10;;2923:3;2916:10;:::i;:::-;;;:::i;:::-;;2912:281;;;;2953:3;;2958;2963;2946:21;;;;;;:26;;2971:1;2946:26;:::i;:::-;;;:::i;:::-;;2942:161;;;;3000:1;;;;;3003;2992:13;;3003:1;2992:13;;:::i;:::-;;;:::i;:::-;;:::o;2942:161::-;3209:22;3066:3;3056:32;3066:3;3076:1;3079:3;3084;3056:32;3084:3;3056:32;;:::i;:::-;;;:::i;:::-;3044:44;;;;;2912:281;3221:1;3224;3227:3;3209:22;;:::i;:::-;3202:29;;;;:::o;2946:21::-;;:::i;2912:281::-;3152:3;;;3209:22;3152:3;3145:37;3152:3;3157;3162:1;;3165:3;3170;3175:1;;3178:3;3145:37;;3178:3;3145:37;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;3133:49;;;;;2912:281;;11098:325:22;11215:202;11098:325;11188:15;;:::i;:::-;11215:202;;;868:4258:26;;;11215:202:22;11098:325;:::o;868:4258:26:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1788:48:22:-;1832:4;;;:::i;:::-;1788:48;:::o;1832:4::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1882:43::-;1924:1;;;:::i;:::-;1882:43;:::o;1993:89::-;2051:31;:15;;:::i;:::-;2069:13;;:::i;:::-;2051:31;;:::i;:::-;1993:89;:::o;11587:301::-;11868:12;11860:21;11587:301;11679:7;;:::i;:::-;11715:29;;;:::i;:::-;11754:11;;;:::i;:::-;11775:69;;;11868:12;:::i;:::-;11860:21;:::i;:::-;11853:28;:::o;432:190:27:-;492:4;;:::i;:::-;508:12;;;:::i;:::-;530:61;;607:8;;614:1;607:8;:::i;:::-;;;:::i;:::-;;600:15;:::o;9592:480:16:-;;9770:199;;9592:480;9675:4;;:::i;:::-;9691:12;;;:::i;:::-;9713:18;;;:::i;:::-;9741:19;;;:::i;:::-;9770:199;;;;;;;;;;;;;;9985:7;:80;;;;9592:480;9978:87;;;;:::o;9985:80::-;9997:10;;;;:15;;10011:1;9997:15;:::i;:::-;;;:::i;:::-;;:67;;;;10015:14;10023:5;;10015:14;:::i;:::-;:26;:30;;10044:1;10015:30;:::i;:::-;;;:::i;:::-;;9997:67;9985:80;;;;;9997:67;10048:11;:16;;10063:1;10048:16;:::i;:::-;;;:::i;:::-;;9997:67;;8370:720;;8507:421;;8370:720;8450:18;;:::i;:::-;8478:19;;;:::i;:::-;8507:421;;;;;;;;;;;;;;;;8942:10;:15;;8956:1;8942:15;:::i;:::-;;;:::i;:::-;;:68;;;;8968:5;8960:14;8968:5;8960:14;:::i;:::-;:26;:31;;8990:1;8960:31;:::i;:::-;;;:::i;:::-;;8942:68;8938:146;;8370:720;:::o;8938:146::-;9058:14;9033:40;9066:5;9058:14;:::i;:::-;9033:40;;;;;;;;;;;;;:::i;:::-;;;;8942:68;8994:16;;9009:1;8994:16;:::i;:::-;;;:::i;:::-;;;8942:68;;8507:421;;;;;;;;;;868:4258:26;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;15224:327:22;15370:78;15224:327;;15511:33;15224:327;15297:7;;:::i;:::-;15378:1;15392:55;15370:10;15378:1;15370:10;:::i;:::-;15403:4;15392:55;15403:4;15409;;15415;;15421;15437:9;;:::i;:::-;15392:55;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;15370:78;;;;;;;;15458:36;15370:78;;:::i;:::-;15466:7;15458:36;:::i;:::-;15511:33;;;;:::i;:::-;;;;;;;;:::i;:::-;15504:40;:::o;5877:616:28:-;;;;;;6014:7;;:::i;:::-;6023;;;:::i;:::-;6032;;;:::i;:::-;6059:2;;:7;;6065:1;6059:7;:::i;:::-;;;:::i;:::-;;6055:32;;6118:2;;6130:14;6143:1;6130:14;:::i;:::-;6167:1;6154:14;6167:1;6154:14;:::i;:::-;6191:1;6178:14;6191:1;6178:14;:::i;:::-;6203:255;;6210:9;:14;;6223:1;6210:14;:::i;:::-;;;:::i;:::-;;;;6245:9;:13;6257:1;6245:13;:::i;:::-;;6244:20;;6263:1;6244:20;:::i;:::-;;;:::i;:::-;;6240:109;;6203:255;6374:9;:13;6416:31;6374:9;;:13;6386:1;6374:13;:::i;:::-;;;:::i;:::-;6426:2;6430;6434;6438:3;6443;;6416:31;;:::i;:::-;6401:46;;;;;;6203:255;;;;;;;;;6240:109;6306:2;6374:13;6306:2;;;6416:31;6306:2;;6299:35;6306:2;6310;6314;6318;6322;;6326;6330:3;;6299:35;;:::i;:::-;6284:50;;;;;6240:109;;;;;;;;6210:14;;;;;;;;;;6479:2;6483;6467:19;;;;:::o;6055:32::-;6076:2;;;;;;6080;6084;6068:19;;;;:::o;2254:338::-;;2387:15;2254:338;;;;;2344:7;;:::i;:::-;2353;;;:::i;:::-;2394:2;2398:3;2387:15;;:::i;:::-;2435:4;;2441;2447:3;2428:23;;;;;;2481:2;2485:5;2492:3;2474:22;;;;;;2526:2;2537:4;2543:5;2550:3;2530:24;;;;;;2556:3;2519:41;;;;;;2570:15;:::o;2519:41::-;;:::i;2530:24::-;;:::i;2474:22::-;;:::i;2428:23::-;;:::i;868:4258:26:-;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3680:1319:28;;;;;;;;;;3834:7;;:::i;:::-;3843;;;:::i;:::-;3852;;;:::i;:::-;3879:3;;:8;;3886:1;3879:8;:::i;:::-;;;:::i;:::-;;:20;;;3680:1319;3875:48;;3937:3;:8;;3944:1;3937:8;:::i;:::-;;;:::i;:::-;;:20;;;3680:1319;3933:48;;3992:20;;:::i;:::-;4037:3;;4042;4047;4030:21;;;;;4022:29;4030:21;;4022:29;:2;:29;4025:1;4022:29;:::i;:::-;;;:::i;:::-;;:::i;:::-;4076:3;4081:5;;:2;:5;4084:1;4081:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4088:3;4069:23;;;;;4061:31;4069:23;;4061:31;:2;:31;4064:1;4061:31;:::i;:::-;;;:::i;:::-;;:::i;:::-;4117:3;4122;4127;4110:21;;;;;4102:29;4110:21;;4102:29;:2;:29;4105:1;4102:29;:::i;:::-;;;:::i;:::-;;:::i;:::-;4156:3;4161:5;;:2;:5;4164:1;4161:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4168:3;4149:23;;;;;4141:31;4149:23;;4141:31;:2;:31;4144:1;4141:31;:::i;:::-;;;:::i;:::-;;:::i;:::-;4188:100;;;:::i;:::-;4196:3;4201:5;;:2;:5;4204:1;4201:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4208:3;4189:23;;;;;4188:100;4189:23;;4188:100;;;;:::i;:::-;4226:5;;:2;:5;4229:1;4226:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4233:3;4214:23;;;;;4188:100;4214:23;;4188:100;;;;:::i;:::-;4251:2;:5;;:2;:5;4254:1;4251:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4258:3;;4239:23;;;;;4276:5;4239:23;4276:5;4239:23;4188:100;4239:23;;4188:100;;;;:::i;:::-;4276:2;:5;4279:1;4276:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4283:3;4264:23;;;;;4188:100;4264:23;;4188:100;;;;:::i;:::-;4307:2;:5;;:2;:5;4310:1;4307:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;:14;;4316:5;;:2;:5;4319:1;4316:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4307:14;:::i;:::-;;;:::i;:::-;;;:32;;;;3680:1319;4299:75;;;:::i;:::-;4385:20;;:::i;:::-;4430:2;:5;;:2;:5;4433:1;4430:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4437:11;:3;4443:5;;:2;:5;4446:1;4443:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4437:11;;:::i;:::-;4450:3;4423:31;;;;;4415:39;4423:31;;4415:39;:2;:39;4418:1;4415:39;:::i;:::-;;;:::i;:::-;;:::i;:::-;4479:5;;:2;:5;4482:1;4479:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4486:11;:3;4492:5;;:2;:5;4495:1;4492:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4486:11;;:::i;:::-;4499:3;4472:31;;;;;4464:39;4472:31;;4464:39;:2;:39;4467:1;4464:39;:::i;:::-;;;:::i;:::-;;:::i;:::-;4528:5;;:2;:5;4531:1;4528:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4535;;:2;:5;4538:1;4535:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4542:3;4521:25;;;;;4513:33;4521:25;;4513:33;:2;:33;4516:1;4513:33;:::i;:::-;;;:::i;:::-;;:::i;:::-;4571:5;;:2;:5;4574:1;4571:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4578;;:2;:5;4581:1;4578:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4585:3;4564:25;;;;;4556:33;4564:25;;4556:33;:2;:33;4559:1;4556:33;:::i;:::-;;;:::i;:::-;;:::i;:::-;4627:5;;:2;:5;4630:1;4627:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4634;;:2;:5;4637:1;4634:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4641:3;4620:25;;;;;;4647:11;:3;4653:5;;:2;:5;4656:1;4653:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4647:11;;:::i;:::-;4660:3;4613:51;;;;;;4690:3;4703:1;4713:2;:5;;:2;:5;4716:1;4713:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4720;;:2;:5;4723:1;4720:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4727:3;4706:25;;;;;;4733:3;4696:41;;;;;;4690:47;4696:41;;:::i;:::-;;4690:47;;:::i;:::-;4739:3;4679:64;;;;;;4774:2;:5;;:2;:5;4777:1;4774:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4795;;:2;:5;4798:1;4795:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4802;;:2;:5;4805:1;4802:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4809:3;4788:25;;;;;;4815:8;:3;4821:2;4815:8;;:::i;:::-;4825:3;4781:48;;;;;;4831:3;4767:68;;;;;;4861:3;4874:5;;4861:3;4874:2;:5;4877:1;4874:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4881:2;:5;;:2;:5;4884:1;4881:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4888:3;4867:25;;;;;4861:31;4867:25;;4861:31;;:::i;:::-;4894:3;;4850:48;;;;4929:5;4850:48;4929:5;4850:48;;4929:2;:5;4932:1;4929:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4943:3;4948;4953;4936:21;;;;;;4959:3;4922:41;;;;;;4981:2;4985;4989;4973:19;;;;:::o;4922:41::-;;:::i;4936:21::-;;:::i;4850:48::-;;:::i;4867:25::-;;:::i;4767:68::-;;:::i;4781:48::-;;:::i;4788:25::-;;:::i;4679:64::-;;:::i;4696:41::-;;:::i;4706:25::-;;:::i;4613:51::-;;:::i;4620:25::-;;:::i;4564:::-;;:::i;4521:::-;;:::i;4472:31::-;;:::i;4423:::-;;:::i;4307:32::-;4325:2;4299:75;4325:5;;:2;:5;4328:1;4325:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;:14;;4334:5;;:2;:5;4337:1;4334:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4325:14;:::i;:::-;;;:::i;:::-;;;4307:32;;;;4264:23;;:::i;4239:::-;;:::i;4214:::-;;:::i;4189:::-;;:::i;4149:::-;;:::i;4110:21::-;;:::i;4069:23::-;;:::i;4030:21::-;;:::i;3933:48::-;3967:3;;;;;;;3972;3977;3959:22;;;;:::o;3937:20::-;3949:3;;:8;;3956:1;3949:8;:::i;:::-;;;:::i;:::-;;3937:20;;3875:48;3909:3;;;;;;;3914;3919;3901:22;;;;:::o;3879:20::-;3891:3;;:8;;3898:1;3891:8;:::i;:::-;;;:::i;:::-;;3879:20;;868:4258:26;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;5069:731:28:-;;;;;;;;5197:7;;:::i;:::-;5206;;;:::i;:::-;5215;;;:::i;:::-;5242:2;;:7;;5248:1;5242:7;:::i;:::-;;;:::i;:::-;;5238:32;;5300:2;5304;5308:3;5293:19;;;;;;5341:2;;5345;5349:3;5334:19;;;;;;5382:2;;5386;5390:3;5375:19;;;;;;5424:1;;5434:2;5438:1;5441:3;5427:18;;;;;;5447:3;5417:34;;;;;;;;:::i;:::-;;5487:1;;5490;5493:3;5480:17;;;;;;;;:::i;:::-;;5506:3;5518:1;;5524:3;5511:17;;;;;;5530:3;5499:35;;;;;;5536:3;5473:67;;;;;;5569:1;;5572;5575:3;5562:17;;;;;;5581:3;5594:1;5597;;5600:3;5587:17;;;;;5581:23;5587:17;;5581:23;;:::i;:::-;5606:3;5555:55;;;;;;5638:1;5648;5651:7;:3;5657:1;5651:7;;:::i;:::-;5660:3;5641:23;;;;;;5666:3;5631:39;;;;;;5672:3;;5685:1;5695;;5701:3;5688:17;;;;;;5707:3;5678:33;;;;;;5672:39;5678:33;;:::i;:::-;;5672:39;;:::i;:::-;5713:3;5624:93;;;;;;5738:1;;5748:2;5752;5756:3;5741:19;;;;;;5762:3;5731:35;;;;;;;;:::i;:::-;;5785:1;5788;5791;5777:16;;;;:::o;5731:35::-;;:::i;5741:19::-;;:::i;5624:93::-;;:::i;5678:33::-;;:::i;5688:17::-;;:::i;5631:39::-;;:::i;5641:23::-;;:::i;5555:55::-;;:::i;5587:17::-;;:::i;5562:::-;;:::i;5473:67::-;;:::i;5499:35::-;;:::i;5511:17::-;;:::i;5480:::-;;:::i;5417:34::-;;:::i;5427:18::-;;:::i;5375:19::-;;:::i;5334:::-;;:::i;5293:::-;;:::i;5238:32::-;5259:2;;;;;5263;5267;5251:19;;;;:::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","offset":23089}},"immutableReferences":{},"transformations":[],"transformationValues":{}},"deployment":{"transactionHash":"0x2a633e5bfe154dc89b184806d4c5406c172563ad34174364772df7216520ebc7","blockNumber":"24918805","transactionIndex":"367","deployer":"0xC2E90a3cff62e7F0e659211b1666b658e5042227"},"sources":{"src/bridge/starkex/StarkExchangeMigrationV2.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {StarkExchangeMigration} from \"./StarkExchangeMigration.sol\";\n\n/**\n * @title StarkExchangeMigrationV2\n * @notice Upgrades the StarkEx bridge to register Stark key → Ethereum address associations for\n *         holders whose keys are not yet registered on-chain, enabling them to call `withdraw`.\n * @dev VCO tokens were not migrated during the original migration due to a bug in the VCO token's\n *      `approve` method. This contract populates `pendingWithdrawals` and `ethKeys` entries for\n *      the 7 VCO holders during initialization. Holders can then withdraw using the standard\n *      `withdraw(uint256, uint256)` function inherited from LegacyStarkExchangeBridge.\n *      All existing StarkExchangeMigration functionality is preserved.\n */\ncontract StarkExchangeMigrationV2 is StarkExchangeMigration {\n    /// @notice VCO token asset type ID from the StarkEx system\n    uint256 public constant VCO_ASSET_TYPE =\n        1485183671027309009439509871835489442660821279230223034298428454062208985878;\n\n    // -----------------------------------------------------------------------\n    //  VCO holder data: Stark keys, Ethereum addresses, and quantized balances\n    // -----------------------------------------------------------------------\n    uint256 public constant HOLDER_1_KEY = 0x07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753;\n    address public constant HOLDER_1_ETH = 0x5eBb994EBC1c44815FbF2fA61a6E1f8368dcB0C7;\n    uint256 public constant HOLDER_1_AMOUNT = 4900000000000;\n    uint256 public constant HOLDER_2_KEY = 0x01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb0;\n    address public constant HOLDER_2_ETH = 0x216e8577B504aC3dB213eDd261e47fffBb354248;\n    uint256 public constant HOLDER_2_AMOUNT = 125000000000;\n    uint256 public constant HOLDER_3_KEY = 0x052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b434;\n    address public constant HOLDER_3_ETH = 0x10cbBBb225BBEA137aC01F0F6D91CDB126BccaA6;\n    uint256 public constant HOLDER_3_AMOUNT = 7540000000;\n    uint256 public constant HOLDER_4_KEY = 0x07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc;\n    address public constant HOLDER_4_ETH = 0x409F85D2207796b543b8abdB6a0E2490BB1483D1;\n    uint256 public constant HOLDER_4_AMOUNT = 4900000000000;\n    uint256 public constant HOLDER_5_KEY = 0x00b59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e4958;\n    address public constant HOLDER_5_ETH = 0xCE5A537D4dA620DE59efA6F74a0A065732600c71;\n    uint256 public constant HOLDER_5_AMOUNT = 382500000000;\n    uint256 public constant HOLDER_6_KEY = 0x025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca01;\n    address public constant HOLDER_6_ETH = 0x941f54cb53Dc1478Cb126a2Ba8a83b2130419dB5;\n    uint256 public constant HOLDER_6_AMOUNT = 266488641810000000;\n    uint256 public constant HOLDER_7_KEY = 0x01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df2;\n    address public constant HOLDER_7_ETH = 0xBC6EeB5111fEa2B5e9B2Bc534bBcbCa9568999a4;\n    uint256 public constant HOLDER_7_AMOUNT = 235000000000;\n\n    /**\n     * @notice Populates `pendingWithdrawals` with VCO token entries for the 7 holders and registers\n     *         Stark key → Ethereum address associations for holders not yet registered on-chain.\n     * @dev The bytes parameter is unused but required to match the parent function signature for StarkEx proxy compatibility.\n     *      Uses `reinitializer(2)` because the parent's `initialize` used `initializer` (equivalent to\n     *      reinitializer(1)). This ensures the function can only execute once.\n     */\n    function initialize(\n        bytes calldata /* data */\n    )\n        external\n        override\n        reinitializer(2)\n    {\n        // Populate VCO pending withdrawals\n        pendingWithdrawals[HOLDER_1_KEY][VCO_ASSET_TYPE] += HOLDER_1_AMOUNT;\n        pendingWithdrawals[HOLDER_2_KEY][VCO_ASSET_TYPE] += HOLDER_2_AMOUNT;\n        pendingWithdrawals[HOLDER_3_KEY][VCO_ASSET_TYPE] += HOLDER_3_AMOUNT;\n        pendingWithdrawals[HOLDER_4_KEY][VCO_ASSET_TYPE] += HOLDER_4_AMOUNT;\n        pendingWithdrawals[HOLDER_5_KEY][VCO_ASSET_TYPE] += HOLDER_5_AMOUNT;\n        pendingWithdrawals[HOLDER_6_KEY][VCO_ASSET_TYPE] += HOLDER_6_AMOUNT;\n        pendingWithdrawals[HOLDER_7_KEY][VCO_ASSET_TYPE] += HOLDER_7_AMOUNT;\n\n        // Register Stark key → Ethereum address for holders not yet registered on-chain\n        if (ethKeys[HOLDER_1_KEY] == address(0)) ethKeys[HOLDER_1_KEY] = HOLDER_1_ETH;\n        if (ethKeys[HOLDER_2_KEY] == address(0)) ethKeys[HOLDER_2_KEY] = HOLDER_2_ETH;\n        if (ethKeys[HOLDER_3_KEY] == address(0)) ethKeys[HOLDER_3_KEY] = HOLDER_3_ETH;\n        if (ethKeys[HOLDER_4_KEY] == address(0)) ethKeys[HOLDER_4_KEY] = HOLDER_4_ETH;\n        if (ethKeys[HOLDER_5_KEY] == address(0)) ethKeys[HOLDER_5_KEY] = HOLDER_5_ETH;\n        if (ethKeys[HOLDER_6_KEY] == address(0)) ethKeys[HOLDER_6_KEY] = HOLDER_6_ETH;\n        if (ethKeys[HOLDER_7_KEY] == address(0)) ethKeys[HOLDER_7_KEY] = HOLDER_7_ETH;\n    }\n}\n"},"src/bridge/starkex/StarkExchangeMigration.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {Initializable} from \"@openzeppelin/contracts/proxy/utils/Initializable.sol\";\nimport {IRootERC20Bridge} from \"../zkEVM/IRootERC20Bridge.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {IStarkExchangeMigration} from \"./IStarkExchangeMigration.sol\";\nimport {VaultRootSenderAdapter} from \"../messaging/VaultRootSenderAdapter.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport {LegacyStarkExchangeBridge} from \"./LegacyStarkExchangeBridge.sol\";\n\n/**\n * @title StarkExchangeMigration\n * @notice This contract facilitates the migration of ETH and ERC-20 assets held by the legacy Immutable X bridge to Immutable zkEVM.\n * @dev The contract performs the following functions, in service of the migration:\n *      1. Sends the proven vault root hash stored in this contract, to a designated contract on Immutable zkEVM. This root is used by the destination contract to facilitate disbursement of funds to the intended recipients.\n *      2. Enables an authorised entity to migrate ERC-20 tokens and ETH held by the StarkExchange bridge to Immutable zkEVM.\n *      3. Enables users who had already initiated a withdrawal from Immutable X, prior to this contract upgrade taking effect, to finalise their pending withdrawal.\n */\ncontract StarkExchangeMigration is IStarkExchangeMigration, LegacyStarkExchangeBridge, Initializable, ReentrancyGuard {\n    using SafeERC20 for IERC20;\n\n    /**\n     * @notice Restrict access only to the migration manager\n     */\n    modifier onlyMigrationManager() {\n        require(msg.sender == migrationManager, UnauthorizedMigrationInitiator());\n        _;\n    }\n\n    /// @dev Reference to native ETH, based on the value used to represent ETH on the zkEVM bridge.\n    address public constant NATIVE_ETH = address(0xeee);\n\n    constructor() {\n        _disableInitializers();\n    }\n\n    /**\n     * @notice Initializes the contract with migration configuration\n     * @param data Encoded initialization data containing addresses\n     * @dev Can only be called once due to initializer modifier\n     * @dev Initializer is called by the proxy during the `upgradeTo()` function call which can only be called by Governance\n     * @dev The hash of the data used to initialize the contract is pre-committed to when the contract upgrade is proposed in the Proxy's timelock upgrade.\n     */\n    function initialize(bytes calldata data) external virtual initializer {\n        (\n            address _migrationManager,\n            address _zkEVMBridge,\n            address _rootSenderAdapter,\n            address _zkEVMWithdrawalProcessor\n        ) = abi.decode(data, (address, address, address, address));\n\n        require(_migrationManager != address(0), InvalidAddress());\n        require(_zkEVMBridge != address(0), InvalidAddress());\n        require(_rootSenderAdapter != address(0), InvalidAddress());\n        require(_zkEVMWithdrawalProcessor != address(0), InvalidAddress());\n\n        migrationManager = _migrationManager;\n        zkEVMBridge = _zkEVMBridge;\n        zkEVMWithdrawalProcessor = _zkEVMWithdrawalProcessor;\n        rootSenderAdapter = VaultRootSenderAdapter(_rootSenderAdapter);\n    }\n\n    /**\n     * @inheritdoc IStarkExchangeMigration\n     * @dev Only the migration manager can call this function\n     * @dev Assumes that the caller is the gas refund receiver, and can receive native asset\n     */\n    function migrateVaultRoot() external payable override nonReentrant onlyMigrationManager {\n        rootSenderAdapter.sendVaultRoot{value: msg.value}(vaultRoot, msg.sender);\n    }\n\n    /**\n     * @inheritdoc IStarkExchangeMigration\n     * @dev Only the migration manager can call this function\n     * @dev Assumes that the caller is the gas refund receiver, and can receive native asset\n     */\n    function migrateHoldings(TokenMigrationDetails[] calldata tokens)\n        external\n        payable\n        override\n        nonReentrant\n        onlyMigrationManager\n    {\n        require(tokens.length > 0, NoMigrationDetails());\n\n        uint256 totalFees = 0;\n        for (uint256 i = 0; i < tokens.length; i++) {\n            (address token, uint256 amount, uint256 fee) = (tokens[i].token, tokens[i].amount, tokens[i].bridgeFee);\n\n            totalFees += fee;\n            require(totalFees <= msg.value, InsufficientBridgeFee());\n\n            if (token == NATIVE_ETH) {\n                _depositETHToZKEVMBridge(amount, fee);\n                emit ETHHoldingsMigration(amount, zkEVMWithdrawalProcessor, msg.sender);\n            } else {\n                _depositERC20ToZKEVMBridge(IERC20Metadata(token), amount, fee);\n                emit ERC20HoldingsMigration(token, amount, zkEVMWithdrawalProcessor, msg.sender);\n            }\n        }\n        require(totalFees == msg.value, ExcessBridgeFeeProvided());\n    }\n    /**\n     * @notice Internal function to deposit ERC20 tokens to the zkEVM bridge\n     * @param token The ERC20 token to deposit\n     * @param amount The amount of tokens to deposit\n     * @dev Validates inputs and transfers tokens to the zkEVM bridge\n     */\n\n    function _depositERC20ToZKEVMBridge(IERC20Metadata token, uint256 amount, uint256 bridgeFee) private {\n        require(address(token) != address(0), InvalidAddress());\n        require(amount > 0, InvalidAmount());\n\n        uint256 balance = token.balanceOf(address(this));\n        require(balance >= amount, AmountExceedsBalance());\n        // Approve the zkEVM bridge to spend the tokens\n        // Using forceApprove to handle tokens that require zero approval first (e.g., USDT)\n        IERC20(address(token)).forceApprove(zkEVMBridge, amount);\n        IRootERC20Bridge(zkEVMBridge).depositTo{value: bridgeFee}(token, zkEVMWithdrawalProcessor, amount);\n    }\n\n    /**\n     * @notice Internal function to deposit ETH to the zkEVM bridge\n     * @param amount The amount of ETH to deposit\n     * @dev Validates inputs and transfers ETH to the zkEVM bridge\n     */\n    function _depositETHToZKEVMBridge(uint256 amount, uint256 bridgeFee) private {\n        require(amount > 0, InvalidAmount());\n\n        uint256 balance = address(this).balance;\n        require(balance >= amount + bridgeFee, AmountExceedsBalance());\n\n        IRootERC20Bridge(zkEVMBridge).depositToETH{value: amount + bridgeFee}(zkEVMWithdrawalProcessor, amount);\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},"src/bridge/zkEVM/IRootERC20Bridge.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache 2.0\npragma solidity 0.8.27;\n\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @title Root ERC20 Bridge Interface\n * @notice Defines the key functions of an ERC20 bridge on the root chain, which enables bridging of standard ERC20 tokens, ETH, wETH, IMX and wIMX from the root chain to the child chain and back.\n * @dev Features:\n *     - Maps tokens from the root chain to the child chain.\n *     - Deposits tokens from the root chain to the child chain.\n *     - Deposits native ETH from the root chain to the child chain.\n */\ninterface IRootERC20Bridge {\n    /**\n     * @notice Deposit tokens to the bridge and issue corresponding tokens to `msg.sender` on the child chain.\n     * @custom:requires `rootToken` should already have been mapped with `mapToken()`.\n     * @param rootToken The address of the token on the root chain.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     */\n    function deposit(IERC20Metadata rootToken, uint256 amount) external payable;\n\n    /**\n     * @notice Deposit tokens to the bridge and issue corresponding tokens to `receiver` address on the child chain.\n     * @custom:requires `rootToken` should already have been mapped with `mapToken()`.\n     * @param rootToken The address of the token on the root chain.\n     * @param receiver The address of the receiver on the child chain, to credit tokens to.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     */\n    function depositTo(IERC20Metadata rootToken, address receiver, uint256 amount) external payable;\n\n    /**\n     * @notice Deposit ETH to the bridge and issue corresponding wrapped ETH to `msg.sender` on the child chain.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     * @dev the `msg.value` provided should cover the amount to send as well as the bridge fee.\n     */\n    function depositETH(uint256 amount) external payable;\n    /**\n     * @notice Deposit ETH to the bridge and issue corresponding wrapped ETH to `receiver` address on the child chain.\n     * @param receiver The address of the receiver on the child chain.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     * @dev the `msg.value` provided should cover the amount to send as well as the bridge fee.\n     */\n    function depositToETH(address receiver, uint256 amount) external payable;\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"src/bridge/starkex/IStarkExchangeMigration.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.27;\n\n/**\n * @title IStarkExchangeMigration\n * @notice Defines the interface for migrating holdings from Immutable X to zkEVM\n */\ninterface IStarkExchangeMigration {\n    struct TokenMigrationDetails {\n        address token;\n        uint256 amount;\n        uint256 bridgeFee;\n    }\n\n    /// @notice Thrown when no assets are provided for migration\n    error NoMigrationDetails();\n\n    /// @notice Thrown when a zero address is provided\n    error InvalidAddress();\n\n    /// @notice Thrown when a zero is provided as amount to migrate\n    error InvalidAmount();\n\n    /// @notice Thrown if the bridge does not have sufficient funds of the token to perform the specified migration amount\n    error AmountExceedsBalance();\n\n    /// @notice Thrown when the bridge fee provided is insufficient to cover the cost of bridging the assets to zkEVM\n    error InsufficientBridgeFee();\n\n    /// @notice Thrown when the bridge fee provided exceeds the required amount\n    error ExcessBridgeFeeProvided();\n\n    /// @notice Thrown when an unauthorized account attempts to initiate migration process\n    error UnauthorizedMigrationInitiator();\n\n    /**\n     * @notice Emitted when migration of ERC20 tokens is initiated\n     * @param token The address of the ERC20 token being migrated\n     * @param amount The amount of tokens being migrated\n     * @param recipient The address receiving the migrated tokens\n     * @param initiator The address that initiated the migration\n     */\n    event ERC20HoldingsMigration(\n        address indexed token, uint256 amount, address indexed recipient, address indexed initiator\n    );\n\n    /**\n     * @notice Emitted when ETH holdings migration is initiated\n     * @param amount The amount of ETH being migrated\n     * @param recipient The address receiving the migrated ETH\n     * @param initiator The address that initiated the migration\n     */\n    event ETHHoldingsMigration(uint256 amount, address indexed recipient, address indexed initiator);\n\n    /**\n     * @notice Migrates the bridge's holdings of the specified assets and amounts to zkEVM, by depositing the funds to the zkEVM bridge contract.\n     * @param assets The list of assets to migrate, each containing the token address and amount. ETH is represented by the address(0xeee)\n     * @dev Requires a bridge fee to be sent with this transaction.\n     */\n    function migrateHoldings(TokenMigrationDetails[] calldata assets) external payable;\n\n    /**\n     * @notice Sends the latest vault root data stored in this contract to the configured withdrawal processor contract on zkEVM.\n     * @dev Requires a bridge fee to be sent with the transaction\n     */\n    function migrateVaultRoot() external payable;\n}\n"},"src/bridge/messaging/VaultRootSenderAdapter.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.27;\n\nimport {IAxelarGasService} from \"@axelar-gmp-sdk-solidity/interfaces/IAxelarGasService.sol\";\nimport {AxelarExecutable} from \"@axelar-gmp-sdk-solidity/executable/AxelarExecutable.sol\";\nimport {IAxelarGateway} from \"@axelar-gmp-sdk-solidity/interfaces/IAxelarGateway.sol\";\n\n/**\n * @title Vault Root Sender Adapter\n * @notice Sends vault root hashes to a designated vault receiver contract on zkEVM.\n * @dev This contract relies on the Axelar GMP to send the vault root hash across chains.\n * @dev Only the configured vault root sender is authorized to send vault root hashes through this adapter. The sender is the StarkEx bridge contract on Ethereum.\n */\ncontract VaultRootSenderAdapter is AxelarExecutable {\n    /// @notice Thrown when an invalid chain ID is provided for the vault root destination.\n    error InvalidChainId();\n\n    /// @notice Thrown when any entity other than the authorised `vaultRootSender` attempts to send a vault root through this adapter\n    error UnauthorizedRootSender();\n\n    /// @notice Thrown when no destination gas fee is provided for the cross-chain transaction\n    error NoBridgeFee();\n\n    /// @notice Thrown when an invalid vault root (zero value) is provided\n    error InvalidVaultRoot();\n\n    /**\n     * @notice Emitted when a vault root is sent to the destination chain\n     * @param _destinationChain The chain ID of the destination chain\n     * @param _destinationReceiver The address of the vault receiver contract on the destination chain\n     * @param _payload The encoded vault root data being sent\n     */\n    event VaultRootSent(string indexed _destinationChain, string indexed _destinationReceiver, bytes indexed _payload);\n\n    bytes32 public constant SET_VAULT_ROOT = keccak256(\"SET_VAULT_ROOT\");\n\n    /// @notice The StarkEx bridge contract address that is authorized to send vault roots through this adapter\n    address public immutable VAULT_ROOT_SENDER;\n\n    /// @notice The Axelar gas service contract that handles gas payments for cross-chain transactions\n    IAxelarGasService public immutable AXELAR_GAS_SERVICE;\n\n    /// @notice The chain ID to which the vault root will be sent\n    /// @dev This is a string representation of the chain name, as used by Axelar\n    string public rootReceiverChain;\n\n    /// @notice The address of the vault root receiver contract on the destination chain\n    /// @dev This is a string representation of the contract address\n    string public rootReceiver;\n\n    /**\n     * @notice Constructs the VaultRootSender contract\n     * @param _vaultRootSender The address of the StarkEx bridge contract that can send vault roots\n     * @param _rootReceiver The address of the vault receiver contract on the destination zkEVM chain\n     * @param _rootReceiverChain The chain ID of the destination zkEVM chain\n     * @param _axelarGasService The address of the Axelar gas service contract\n     * @param _axelarGateway The address of the Axelar gateway contract\n     */\n    constructor(\n        address _vaultRootSender,\n        string memory _rootReceiver,\n        string memory _rootReceiverChain,\n        address _axelarGasService,\n        address _axelarGateway\n    ) AxelarExecutable(_axelarGateway) {\n        require(bytes(_rootReceiverChain).length > 0, InvalidChainId());\n        require(bytes(_rootReceiver).length > 0, InvalidAddress());\n        require(_vaultRootSender != address(0), InvalidAddress());\n        require(_axelarGasService != address(0), InvalidAddress());\n\n        rootReceiverChain = _rootReceiverChain;\n        rootReceiver = _rootReceiver;\n        VAULT_ROOT_SENDER = _vaultRootSender;\n        AXELAR_GAS_SERVICE = IAxelarGasService(_axelarGasService);\n    }\n\n    /**\n     * @notice Sends a vault root hash to the destination zkEVM chain via Axelar\n     * @dev Only the StarkEx bridge contract can call this function\n     * @dev Requires a bridge fee to be sent with the transaction for gas payment\n     * @param vaultRoot The vault root hash to send\n     * @param gasRefundReceiver The address that will receive any unused destination gas fee\n     */\n    function sendVaultRoot(uint256 vaultRoot, address gasRefundReceiver) external payable {\n        require(msg.sender == VAULT_ROOT_SENDER, UnauthorizedRootSender());\n\n        require(vaultRoot != 0, InvalidVaultRoot());\n        require(gasRefundReceiver != address(0), InvalidAddress());\n        require(msg.value > 0, NoBridgeFee());\n\n        string memory _receiverChain = rootReceiverChain;\n        string memory _receiverAddr = rootReceiver;\n        bytes memory payload = abi.encode(SET_VAULT_ROOT, vaultRoot);\n\n        AXELAR_GAS_SERVICE.payNativeGasForContractCall{value: msg.value}(\n            address(this), _receiverChain, _receiverAddr, payload, gasRefundReceiver\n        );\n\n        IAxelarGateway(gatewayAddress).callContract(_receiverChain, _receiverAddr, payload);\n\n        emit VaultRootSent(_receiverChain, _receiverAddr, payload);\n    }\n\n    function _execute(bytes32, string calldata, string calldata, bytes calldata) internal pure override {\n        revert(\"Not Supported\");\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    uint256 private _status;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        if (_status == ENTERED) {\n            revert ReentrancyGuardReentrantCall();\n        }\n\n        // Any calls to nonReentrant after this point will fail\n        _status = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == ENTERED;\n    }\n}\n"},"src/bridge/starkex/LegacyStarkExchangeBridge.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {MainStorage} from \"./MainStorage.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {Addresses} from \"./libraries/Common.sol\";\nimport {StarkCurveECDSA} from \"./libraries/StarkCurveECDSA.sol\";\n\n/**\n * @title Legacy StarkExchange Bridge\n * @notice This contract maintains part of the functionality of the old StarkExchange bridge, specifically the finalisation of pending withdrawals.\n */\nabstract contract LegacyStarkExchangeBridge is MainStorage {\n    using Addresses for address;\n    using Addresses for address payable;\n\n    /**\n     * @notice Emitted when a withdrawal of an already pending withdrawal is finalised\n     * @param ownerKey The Stark key of the vault owner\n     * @param assetType The type of asset being withdrawn\n     * @param nonQuantizedAmount The non-quantized amount withdrawn\n     * @param quantizedAmount The quantized amount withdrawn\n     * @param recipient The address receiving the withdrawn funds\n     */\n    event LogWithdrawalPerformed(\n        uint256 ownerKey, uint256 assetType, uint256 nonQuantizedAmount, uint256 quantizedAmount, address recipient\n    );\n\n    /// @notice Version identifier for the contract\n    string public constant VERSION = \"StarkEx-IMX-Migration-1.0.0\";\n\n    /// @dev Mask for extracting address from uint256 (160 bits)\n    uint256 internal constant MASK_ADDRESS = (1 << 160) - 1;\n\n    /// @dev Selector for ERC20 token type\n    bytes4 internal constant ERC20_SELECTOR = bytes4(keccak256(\"ERC20Token(address)\"));\n\n    /// @dev Selector for ETH token type\n    bytes4 internal constant ETH_SELECTOR = bytes4(keccak256(\"ETH()\"));\n\n    /// @dev Offset for selector in asset info\n    uint256 internal constant SELECTOR_OFFSET = 0x20;\n\n    /// @dev Size of selector in bytes\n    uint256 internal constant SELECTOR_SIZE = 4;\n\n    /// @dev Offset for token contract address in asset info\n    uint256 internal constant TOKEN_CONTRACT_ADDRESS_OFFSET = SELECTOR_OFFSET + SELECTOR_SIZE;\n\n    /**\n     * @notice Moves funds from the pending withdrawal account to the owner address\n     * @dev This function can be called by anyone\n     * @dev Can be called normally while frozen\n     * @param ownerKey The Stark key of the owner\n     * @param assetType The asset type to withdraw\n     */\n    function withdraw(uint256 ownerKey, uint256 assetType) external {\n        address payable recipient = payable(strictGetEthKey(ownerKey));\n        require(isFungibleAssetType(assetType), \"NON_FUNGIBLE_ASSET_TYPE\");\n        uint256 assetId = assetType;\n        // Fetch and clear quantized amount.\n        uint256 quantizedAmount = pendingWithdrawals[ownerKey][assetId];\n        require(quantizedAmount > 0, \"NO_PENDING_WITHDRAWAL\");\n        pendingWithdrawals[ownerKey][assetId] = 0;\n\n        // Transfer funds.\n        _transferOut(recipient, assetType, quantizedAmount);\n        emit LogWithdrawalPerformed(\n            ownerKey, assetType, _fromQuantized(assetType, quantizedAmount), quantizedAmount, recipient\n        );\n    }\n\n    /**\n     * @notice Gets the withdrawal balance for a specific owner and asset\n     * @param ownerKey The Stark key of the owner\n     * @param assetId The asset ID to check\n     * @return The withdrawal balance in non-quantized units\n     */\n    function getWithdrawalBalance(uint256 ownerKey, uint256 assetId) external view returns (uint256) {\n        uint256 presumedAssetType = assetId;\n        return _fromQuantized(presumedAssetType, pendingWithdrawals[ownerKey][assetId]);\n    }\n\n    /**\n     * @notice Returns whether the contract is frozen\n     * @return Always returns false as this contract is never frozen\n     */\n    function isFrozen() external pure returns (bool) {\n        return false;\n    }\n\n    /**\n     * @notice Returns the Ethereum public key (address) that owns the given ownerKey\n     * @dev If the ownerKey is registered, the registered key is returned.\n     *      If not, and the size is within the range of an Ethereum address (i.e. < 2**160)\n     *      the owner key itself is returned. Otherwise, the zero address is returned.\n     * @dev Note - prior to version 4.0 this function reverted on an unregistered starkKey.\n     *      For a variant of this function that reverts on an unregistered starkKey, use strictGetEthKey.\n     * @param ownerKey The Stark key to look up\n     * @return The Ethereum address associated with the Stark key\n     */\n    function getEthKey(uint256 ownerKey) public view returns (address) {\n        address registeredEth = ethKeys[ownerKey];\n\n        if (registeredEth != address(0x0)) {\n            return registeredEth;\n        }\n\n        return ownerKey == (ownerKey & MASK_ADDRESS) ? address(uint160(ownerKey)) : address(0x0);\n    }\n\n    /**\n     * @notice Gets the asset info for a given asset type\n     * @param assetType The asset type to get info for\n     * @return assetInfo The asset info bytes\n     * @dev Reverts if the asset type is not registered\n     */\n    function getAssetInfo(uint256 assetType) public view returns (bytes memory assetInfo) {\n        // Verify that the registration is set and valid.\n        require(registeredAssetType[assetType], \"ASSET_TYPE_NOT_REGISTERED\");\n\n        // Retrieve registration.\n        assetInfo = assetTypeToAssetInfo[assetType];\n    }\n\n    /**\n     * @notice Gets the quantum for an asset type\n     * @param presumedAssetType The asset type to get quantum for\n     * @return quantum The quantum value for the asset type\n     * @dev Returns 1 as default quantum for unregistered asset types (e.g., NFTs)\n     */\n    function getQuantum(uint256 presumedAssetType) public view returns (uint256 quantum) {\n        if (!registeredAssetType[presumedAssetType]) {\n            // Default quantization, for NFTs\n            quantum = 1;\n        } else {\n            // Retrieve registration.\n            quantum = assetTypeToQuantum[presumedAssetType];\n        }\n    }\n\n    /**\n     * @notice Transfers funds from the exchange to recipient\n     * @param recipient The address to receive the funds\n     * @param assetType The type of asset to transfer\n     * @param quantizedAmount The quantized amount to transfer\n     * @dev Handles both ERC20 tokens and ETH transfers\n     */\n    function _transferOut(address payable recipient, uint256 assetType, uint256 quantizedAmount) internal {\n        // Make sure we don't accidentally burn funds.\n        require(recipient != address(0x0), \"INVALID_RECIPIENT\");\n        uint256 amount = _fromQuantized(assetType, quantizedAmount);\n        if (isERC20(assetType)) {\n            if (quantizedAmount == 0) return;\n            address tokenAddress = _extractContractAddress(assetType);\n            IERC20 token = IERC20(tokenAddress);\n            uint256 exchangeBalanceBefore = token.balanceOf(address(this));\n            bytes memory callData = abi.encodeWithSelector(token.transfer.selector, recipient, amount);\n            tokenAddress.safeTokenContractCall(callData);\n            uint256 exchangeBalanceAfter = token.balanceOf(address(this));\n            require(exchangeBalanceAfter <= exchangeBalanceBefore, \"UNDERFLOW\");\n            // NOLINTNEXTLINE(incorrect-equality): strict equality needed.\n            require(exchangeBalanceAfter == exchangeBalanceBefore - amount, \"INCORRECT_AMOUNT_TRANSFERRED\");\n        } else if (isEther(assetType)) {\n            if (quantizedAmount == 0) return;\n            recipient.performEthTransfer(amount);\n        } else {\n            revert(\"UNSUPPORTED_TOKEN_TYPE\");\n        }\n    }\n\n    /**\n     * @notice Extracts the contract address from an asset type\n     * @param assetType The asset type to extract address from\n     * @return The contract address\n     */\n    function _extractContractAddress(uint256 assetType) internal view returns (address) {\n        return _extractContractAddressFromAssetInfo(getAssetInfo(assetType));\n    }\n\n    /**\n     * @notice Converts a quantized amount to a non-quantized amount\n     * @param presumedAssetType The asset type for quantization\n     * @param quantizedAmount The quantized amount to convert\n     * @return amount The non-quantized amount\n     * @dev Reverts if dequantization would overflow\n     */\n    function _fromQuantized(uint256 presumedAssetType, uint256 quantizedAmount) internal view returns (uint256 amount) {\n        uint256 quantum = getQuantum(presumedAssetType);\n        amount = quantizedAmount * quantum;\n    }\n\n    /**\n     * @notice Checks if an asset type is fungible\n     * @param assetType The asset type to check\n     * @return True if the asset type is fungible (ETH or ERC20)\n     */\n    function isFungibleAssetType(uint256 assetType) internal view returns (bool) {\n        bytes4 tokenSelector = _extractTokenSelectorFromAssetType(assetType);\n        return tokenSelector == ETH_SELECTOR || tokenSelector == ERC20_SELECTOR;\n    }\n\n    /**\n     * @notice Same as getEthKey, but fails when a stark key is not registered\n     * @param ownerKey The Stark key to look up\n     * @return ethKey The Ethereum address associated with the Stark key\n     * @dev Reverts if the Stark key is not registered\n     */\n    function strictGetEthKey(uint256 ownerKey) internal view returns (address ethKey) {\n        ethKey = getEthKey(ownerKey);\n        require(ethKey != address(0x0), \"USER_UNREGISTERED\");\n    }\n\n    /**\n     * @notice Checks if the message sender is the owner of the given Stark key\n     * @param ownerKey The Stark key to check\n     * @return True if the message sender owns the Stark key\n     */\n    function isMsgSenderKeyOwner(uint256 ownerKey) internal view returns (bool) {\n        return msg.sender == getEthKey(ownerKey);\n    }\n\n    /**\n     * @notice Checks if an asset type represents ETH\n     * @param assetType The asset type to check\n     * @return True if the asset type is ETH\n     */\n    function isEther(uint256 assetType) internal view returns (bool) {\n        return _extractTokenSelectorFromAssetType(assetType) == ETH_SELECTOR;\n    }\n\n    /**\n     * @notice Checks if an asset type represents an ERC20 token\n     * @param assetType The asset type to check\n     * @return True if the asset type is an ERC20 token\n     */\n    function isERC20(uint256 assetType) internal view returns (bool) {\n        return _extractTokenSelectorFromAssetType(assetType) == ERC20_SELECTOR;\n    }\n    /**\n     * @notice Extracts the token selector from an asset type\n     * @param assetType The asset type to extract selector from\n     * @return The token selector\n     */\n\n    function _extractTokenSelectorFromAssetType(uint256 assetType) private view returns (bytes4) {\n        return _extractTokenSelectorFromAssetInfo(getAssetInfo(assetType));\n    }\n\n    /**\n     * @notice Extract the tokenSelector from assetInfo\n     * @dev Works like bytes4 tokenSelector = abi.decode(assetInfo, (bytes4))\n     *      but does not revert when assetInfo.length < SELECTOR_OFFSET\n     * @param assetInfo The asset info bytes to extract selector from\n     * @return selector The extracted token selector\n     */\n    function _extractTokenSelectorFromAssetInfo(bytes memory assetInfo) private pure returns (bytes4 selector) {\n        assembly {\n            selector := and(\n                0xffffffff00000000000000000000000000000000000000000000000000000000,\n                mload(add(assetInfo, SELECTOR_OFFSET))\n            )\n        }\n    }\n\n    /**\n     * @notice Extracts the contract address from asset info\n     * @param assetInfo The asset info bytes\n     * @return The contract address\n     */\n    function _extractContractAddressFromAssetInfo(bytes memory assetInfo) private pure returns (address) {\n        uint256 offset = TOKEN_CONTRACT_ADDRESS_OFFSET;\n        uint256 res;\n        assembly {\n            res := mload(add(assetInfo, offset))\n        }\n        return address(uint160(res));\n    }\n\n    // -----------------------------------------------------------------------\n    //  Stark key registration (ported from original StarkEx Users.sol)\n    // -----------------------------------------------------------------------\n\n    /// @notice Stark-friendly elliptic curve prime field modulus\n    uint256 private constant K_MODULUS = 0x800000000000011000000000000000000000000000000000000000000000001;\n\n    /// @notice Stark curve beta constant\n    uint256 private constant K_BETA = 0x6f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89;\n\n    /// @notice Emitted when a user registers their Stark key to an Ethereum address\n    event LogUserRegistered(address ethKey, uint256 starkKey, address sender);\n\n    /**\n     * @notice Convenience function: registers msg.sender as the Ethereum address for the given Stark key.\n     * @param starkKey The Stark public key (x-coordinate on the Stark curve)\n     * @param starkSignature 96-byte signature: abi.encode(r, s, starkKeyY)\n     */\n    function registerSender(uint256 starkKey, bytes calldata starkSignature) external {\n        registerEthAddress(msg.sender, starkKey, starkSignature);\n    }\n\n    /**\n     * @notice Associates an Ethereum address with a Stark key, verified by a STARK-curve ECDSA signature.\n     * @param ethKey The Ethereum address to associate\n     * @param starkKey The Stark public key (x-coordinate on the Stark curve)\n     * @param starkSignature 96-byte signature: abi.encode(r, s, starkKeyY)\n     * @dev Ported from the original StarkEx Users.sol contract.\n     */\n    function registerEthAddress(address ethKey, uint256 starkKey, bytes calldata starkSignature) public {\n        require(starkKey != 0, \"INVALID_STARK_KEY\");\n        require(starkKey < K_MODULUS, \"INVALID_STARK_KEY\");\n        require(ethKey != address(0), \"INVALID_ETH_ADDRESS\");\n        require(ethKeys[starkKey] == address(0), \"STARK_KEY_UNAVAILABLE\");\n        require(_isOnCurve(starkKey), \"INVALID_STARK_KEY\");\n        require(starkSignature.length == 32 * 3, \"INVALID_STARK_SIGNATURE_LENGTH\");\n\n        bytes memory sig = starkSignature;\n        (uint256 r, uint256 s, uint256 starkKeyY) = abi.decode(sig, (uint256, uint256, uint256));\n\n        uint256 msgHash =\n            uint256(keccak256(abi.encodePacked(\"UserRegistration:\", ethKey, starkKey))) % StarkCurveECDSA.EC_ORDER;\n\n        StarkCurveECDSA.verify(msgHash, r, s, starkKey, starkKeyY);\n\n        ethKeys[starkKey] = ethKey;\n\n        emit LogUserRegistered(ethKey, starkKey, msg.sender);\n    }\n\n    /**\n     * @notice Checks if a Stark key x-coordinate lies on the Stark curve.\n     * @dev Verifies that x^3 + alpha*x + beta is a quadratic residue mod p (alpha = 1).\n     */\n    function _isOnCurve(uint256 starkKey) private view returns (bool) {\n        uint256 xCubed = mulmod(mulmod(starkKey, starkKey, K_MODULUS), starkKey, K_MODULUS);\n        return _isQuadraticResidue(addmod(addmod(xCubed, starkKey, K_MODULUS), K_BETA, K_MODULUS));\n    }\n\n    /**\n     * @notice Checks if a field element is a quadratic residue using Euler's criterion.\n     */\n    function _isQuadraticResidue(uint256 fieldElement) private view returns (bool) {\n        return 1 == _fieldPow(fieldElement, ((K_MODULUS - 1) / 2));\n    }\n\n    /**\n     * @notice Modular exponentiation using the modexp precompile (address 0x05).\n     */\n    function _fieldPow(uint256 base, uint256 exponent) private view returns (uint256) {\n        (bool success, bytes memory returndata) =\n            address(5).staticcall(abi.encode(0x20, 0x20, 0x20, base, exponent, K_MODULUS));\n        require(success, \"FIELD_POW_FAILED\");\n        return abi.decode(returndata, (uint256));\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { GasInfo } from '../types/GasEstimationTypes.sol';\nimport { IInterchainGasEstimation } from './IInterchainGasEstimation.sol';\nimport { IUpgradable } from './IUpgradable.sol';\n\n/**\n * @title IAxelarGasService Interface\n * @notice This is an interface for the AxelarGasService contract which manages gas payments\n * and refunds for cross-chain communication on the Axelar network.\n * @dev This interface inherits IUpgradable\n */\ninterface IAxelarGasService is IInterchainGasEstimation, IUpgradable {\n    error InvalidAddress();\n    error NotCollector();\n    error InvalidAmounts();\n    error InvalidGasUpdates();\n    error InvalidParams();\n    error InsufficientGasPayment(uint256 required, uint256 provided);\n\n    event GasPaidForContractCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasPaidForContractCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForContractCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForContractCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasPaidForExpressCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasPaidForExpressCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForExpressCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForExpressCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasAdded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress);\n\n    event ExpressGasAdded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeExpressGasAdded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event Refunded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        address payable receiver,\n        address token,\n        uint256 amount\n    );\n\n    /**\n     * @notice Pay for gas for any type of contract execution on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @dev If estimateOnChain is true, the function will estimate the gas cost and revert if the payment is insufficient.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param executionGasLimit The gas limit for the contract call\n     * @param estimateOnChain Flag to enable on-chain gas estimation\n     * @param refundAddress The address where refunds, if any, should be sent\n     * @param params Additional parameters for gas payment. This can be left empty for normal contract call payments.\n     */\n    function payGas(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        uint256 executionGasLimit,\n        bool estimateOnChain,\n        address refundAddress,\n        bytes calldata params\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for a contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForContractCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for a contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForContractCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using native currency for a contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForContractCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using native currency for a contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForContractCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for an express contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to express execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForExpressCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for an express contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to express execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForExpressCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using native currency for an express contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForExpressCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using native currency for an express contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForExpressCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Add additional gas payment using ERC20 tokens after initiating a cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param gasToken The ERC20 token address used to add gas\n     * @param gasFeeAmount The amount of tokens to add as gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Add additional gas payment using native currency after initiating a cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addNativeGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Add additional gas payment using ERC20 tokens after initiating an express cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param gasToken The ERC20 token address used to add gas\n     * @param gasFeeAmount The amount of tokens to add as gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addExpressGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Add additional gas payment using native currency after initiating an express cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addNativeExpressGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Updates the gas price for a specific chain.\n     * @dev This function is called by the gas oracle to update the gas prices for a specific chains.\n     * @param chains Array of chain names\n     * @param gasUpdates Array of gas updates\n     */\n    function updateGasInfo(string[] calldata chains, GasInfo[] calldata gasUpdates) external;\n\n    /**\n     * @notice Allows the gasCollector to collect accumulated fees from the contract.\n     * @dev Use address(0) as the token address for native currency.\n     * @param receiver The address to receive the collected fees\n     * @param tokens Array of token addresses to be collected\n     * @param amounts Array of amounts to be collected for each respective token address\n     */\n    function collectFees(\n        address payable receiver,\n        address[] calldata tokens,\n        uint256[] calldata amounts\n    ) external;\n\n    /**\n     * @notice Refunds gas payment to the receiver in relation to a specific cross-chain transaction.\n     * @dev Only callable by the gasCollector.\n     * @dev Use address(0) as the token address to refund native currency.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param receiver The address to receive the refund\n     * @param token The token address to be refunded\n     * @param amount The amount to refund\n     */\n    function refund(\n        bytes32 txHash,\n        uint256 logIndex,\n        address payable receiver,\n        address token,\n        uint256 amount\n    ) external;\n\n    /**\n     * @notice Returns the address of the designated gas collector.\n     * @return address of the gas collector\n     */\n    function gasCollector() external returns (address);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';\nimport { IAxelarExecutable } from '../interfaces/IAxelarExecutable.sol';\n\n/**\n * @title AxelarExecutable\n * @dev Abstract contract to be inherited by contracts that need to execute cross-chain commands via Axelar's Gateway.\n * It implements the IAxelarExecutable interface.\n */\nabstract contract AxelarExecutable is IAxelarExecutable {\n    /// @dev Reference to the Axelar Gateway contract.\n    address internal immutable gatewayAddress;\n\n    /**\n     * @dev Contract constructor that sets the Axelar Gateway address.\n     * Reverts if the provided address is the zero address.\n     * @param gateway_ The address of the Axelar Gateway contract.\n     */\n    constructor(address gateway_) {\n        if (gateway_ == address(0)) revert InvalidAddress();\n\n        gatewayAddress = gateway_;\n    }\n\n    /**\n     * @notice Executes the cross-chain command after validating it with the Axelar Gateway.\n     * @dev This function ensures the call is approved by Axelar Gateway before execution.\n     * It uses a hash of the payload for validation and internally calls _execute for the actual command execution.\n     * Reverts if the validation fails.\n     * @param commandId The unique identifier of the cross-chain message being executed.\n     * @param sourceChain The name of the source chain from which the message originated.\n     * @param sourceAddress The address on the source chain that sent the message.\n     * @param payload The payload of the message payload.\n     */\n    function execute(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes calldata payload\n    ) external virtual {\n        bytes32 payloadHash = keccak256(payload);\n\n        if (!gateway().validateContractCall(commandId, sourceChain, sourceAddress, payloadHash))\n            revert NotApprovedByGateway();\n\n        _execute(commandId, sourceChain, sourceAddress, payload);\n    }\n\n    /**\n     * @dev Internal virtual function to be overridden by child contracts to execute the command.\n     * It allows child contracts to define their custom command execution logic.\n     * @param commandId The identifier of the command to execute.\n     * @param sourceChain The name of the source chain from which the command originated.\n     * @param sourceAddress The address on the source chain that sent the command.\n     * @param payload The payload of the command to be executed.\n     */\n    function _execute(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes calldata payload\n    ) internal virtual;\n\n    /**\n     * @notice Returns the address of the AxelarGateway contract.\n     * @return The Axelar Gateway instance.\n     */\n    function gateway() public view returns (IAxelarGateway) {\n        return IAxelarGateway(gatewayAddress);\n    }\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title IAxelarGateway\n * @dev Interface for the Axelar Gateway that supports general message passing and contract call execution.\n */\ninterface IAxelarGateway {\n    /**\n     * @notice Emitted when a contract call is made through the gateway.\n     * @dev Logs the attempt to call a contract on another chain.\n     * @param sender The address of the sender who initiated the contract call.\n     * @param destinationChain The name of the destination chain.\n     * @param destinationContractAddress The address of the contract on the destination chain.\n     * @param payloadHash The keccak256 hash of the sent payload data.\n     * @param payload The payload data used for the contract call.\n     */\n    event ContractCall(\n        address indexed sender,\n        string destinationChain,\n        string destinationContractAddress,\n        bytes32 indexed payloadHash,\n        bytes payload\n    );\n\n    /**\n     * @notice Sends a contract call to another chain.\n     * @dev Initiates a cross-chain contract call through the gateway to the specified destination chain and contract.\n     * @param destinationChain The name of the destination chain.\n     * @param contractAddress The address of the contract on the destination chain.\n     * @param payload The payload data to be used in the contract call.\n     */\n    function callContract(\n        string calldata destinationChain,\n        string calldata contractAddress,\n        bytes calldata payload\n    ) external;\n\n    /**\n     * @notice Checks if a contract call is approved.\n     * @dev Determines whether a given contract call, identified by the commandId and payloadHash, is approved.\n     * @param commandId The identifier of the command to check.\n     * @param sourceChain The name of the source chain.\n     * @param sourceAddress The address of the sender on the source chain.\n     * @param contractAddress The address of the contract where the call will be executed.\n     * @param payloadHash The keccak256 hash of the payload data.\n     * @return True if the contract call is approved, false otherwise.\n     */\n    function isContractCallApproved(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        address contractAddress,\n        bytes32 payloadHash\n    ) external view returns (bool);\n\n    /**\n     * @notice Validates and approves a contract call.\n     * @dev Validates the given contract call information and marks it as approved if valid.\n     * @param commandId The identifier of the command to validate.\n     * @param sourceChain The name of the source chain.\n     * @param sourceAddress The address of the sender on the source chain.\n     * @param payloadHash The keccak256 hash of the payload data.\n     * @return True if the contract call is validated and approved, false otherwise.\n     */\n    function validateContractCall(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes32 payloadHash\n    ) external returns (bool);\n\n    /**\n     * @notice Checks if a command has been executed.\n     * @dev Determines whether a command, identified by the commandId, has been executed.\n     * @param commandId The identifier of the command to check.\n     * @return True if the command has been executed, false otherwise.\n     */\n    function isCommandExecuted(bytes32 commandId) external view returns (bool);\n}\n"},"src/bridge/starkex/MainStorage.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {ProxyStorage} from \"./ProxyStorage.sol\";\nimport {StarkExTypes} from \"./libraries/Common.sol\";\nimport {VaultRootSenderAdapter} from \"../messaging/VaultRootSenderAdapter.sol\";\n\n/*\n * NOTE: This code is imported from starkex-contracts repository, with minor modifications:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/components/MainStorage.sol\n */\n\n/**\n * @title MainStorage\n * @notice Contract that holds ALL the main contract state (storage) variables\n * @dev This contract contains all the storage variables for the StarkEx migration system,\n *      including vault management, asset tracking, and migration functionality\n */\ncontract MainStorage is ProxyStorage {\n    /// @dev Layout length constant for storage gap management\n    uint256 internal constant LAYOUT_LENGTH = 2 ** 64;\n\n    /// @notice NO_LONGER_USED: Address of the escape verifier contract\n    address escapeVerifierAddress; // NOLINT: constable-states.\n\n    /// @notice NO_LONGER_USED: Global flag indicating if the DEX state is frozen\n    bool stateFrozen; // NOLINT: constable-states.\n\n    /// @notice NO_LONGER_USED: Time when unFreeze can be successfully called (UNFREEZE_DELAY after freeze)\n    uint256 unFreezeTime; // NOLINT: constable-states.\n\n    /// @notice NO_LONGER_USED: Pending deposits mapping: STARK key => asset id => vault id => quantized amount\n    mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256))) pendingDeposits;\n\n    /// @notice NO_LONGER_USED: Cancellation requests mapping: STARK key => asset id => vault id => request timestamp\n    mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256))) cancellationRequests;\n\n    /// @notice no_longer_used: Pending withdrawals mapping: STARK key => asset id => quantized amount\n    mapping(uint256 => mapping(uint256 => uint256)) pendingWithdrawals;\n\n    /// @notice NO_LONGER_USED: Mapping of vault_id => escape used boolean\n    mapping(uint256 => bool) escapesUsed;\n\n    /// @notice NO_LONGER_USED: Number of escapes that were performed when frozen\n    uint256 escapesUsedCount; // NOLINT: constable-states.\n\n    /// @notice DEPRECATED: Full withdrawal requests mapping (replaced by forcedActionRequests)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(uint256 => mapping(uint256 => uint256)) fullWithdrawalRequests_DEPRECATED;\n\n    /// @notice NO_LONGER_USED: State sequence number\n    uint256 sequenceNumber; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice Vaults Tree Root\n    uint256 public vaultRoot; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Vault Tree Height\n    uint256 vaultTreeHeight; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Order Tree Root\n    uint256 orderRoot; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Order Tree Height\n    uint256 orderTreeHeight; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Mapping of addresses that are allowed to add tokens\n    mapping(address => bool) tokenAdmins;\n\n    /// @notice DEPRECATED: User admins mapping (no longer in use, remains for backwards compatibility)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(address => bool) userAdmins_DEPRECATED;\n\n    /// @notice NO_LONGER_USED: Mapping of addresses that are operators (allowed to update state)\n    mapping(address => bool) operators;\n\n    /// @notice Mapping of contract ID to asset data\n    mapping(uint256 => bytes) assetTypeToAssetInfo; // NOLINT: uninitialized-state.\n\n    /// @notice Mapping of registered contract IDs\n    mapping(uint256 => bool) registeredAssetType; // NOLINT: uninitialized-state.\n\n    /// @notice Mapping from contract ID to quantum\n    mapping(uint256 => uint256) assetTypeToQuantum; // NOLINT: uninitialized-state.\n\n    /// @notice DEPRECATED: Stark keys mapping (no longer in use, remains for backwards compatibility)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(address => uint256) starkKeys_DEPRECATED;\n\n    /// @notice Mapping from STARK public key to the Ethereum public key of its owner\n    mapping(uint256 => address) ethKeys; // NOLINT: uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Timelocked state transition and availability verification chain\n    StarkExTypes.ApprovalChainData verifiersChain;\n    StarkExTypes.ApprovalChainData availabilityVerifiersChain;\n\n    /// @notice NO_LONGER_USED: Batch id of last accepted proof\n    uint256 lastBatchId; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Mapping between sub-contract index to sub-contract address\n    mapping(uint256 => address) subContracts; // NOLINT: uninitialized-state.\n\n    /// @notice DEPRECATED: Permissive asset type mapping (no longer in use, remains for backwards compatibility)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(uint256 => bool) permissiveAssetType_DEPRECATED;\n    // ---- END OF MAIN STORAGE AS DEPLOYED IN STARKEX2.0 ----\n\n    /// @notice NO_LONGER_USED: Onchain-data version configured for the system\n    uint256 onchainDataVersion; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Counter of forced action request in block. The key is the block number\n    mapping(uint256 => uint256) forcedRequestsInBlock;\n\n    /// @notice NO_LONGER_USED: ForcedAction requests: actionHash => requestTime\n    mapping(bytes32 => uint256) forcedActionRequests;\n\n    /// @notice NO_LONGER_USED: Mapping for timelocked actions: actionKey => activation time\n    mapping(bytes32 => uint256) actionsTimeLock;\n\n    /// @notice NO_LONGER_USED: Append only list of requested forced action hashes\n    bytes32[] actionHashList;\n\n    // ---- START OF STORAGE CHANGES FOR IMMUTABLE X BRIDGE MIGRATION UPGRADE ----\n\n    /// @notice Address of the zkEVM bridge contract\n    address public zkEVMBridge; // NOLINT: constable-states uninitialized-state.\n    /// @notice Address of the zkEVM vault processor contract\n    address public zkEVMWithdrawalProcessor; // NOLINT: constable-states uninitialized-state.\n    /// @notice Address of the migration initiator\n    address public migrationManager; // NOLINT: constable-states uninitialized-state.\n    /// @notice The vault root sender contract for cross-chain messaging\n    VaultRootSenderAdapter public rootSenderAdapter; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice Reserved storage space for Extensibility\n    /// @dev Every added variable MUST be added above the end gap, and the __endGap size must be reduced accordingly\n    /// @dev NOLINTNEXTLINE: naming-convention\n    uint256[LAYOUT_LENGTH - 41] private __endGap; // __endGap complements layout to LAYOUT_LENGTH.\n}\n"},"src/bridge/starkex/libraries/Common.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\n/*\n * NOTE: This code is imported as is from starkex-contracts repository:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/libraries/Common.sol\n */\n\n/*\n  Common Utility libraries.\n  I. Addresses (extending address).\n*/\nlibrary Addresses {\n    function isContract(address account) internal view returns (bool) {\n        uint256 size;\n        assembly {\n            size := extcodesize(account)\n        }\n        return size > 0;\n    }\n\n    function performEthTransfer(address recipient, uint256 amount) internal {\n        (bool success,) = recipient.call{value: amount}(\"\"); // NOLINT: low-level-calls.\n        require(success, \"ETH_TRANSFER_FAILED\");\n    }\n\n    /*\n      Safe wrapper around ERC20/ERC721 calls.\n      This is required because many deployed ERC20 contracts don't return a value.\n      See https://github.com/ethereum/solidity/issues/4116.\n    */\n    function safeTokenContractCall(address tokenAddress, bytes memory callData) internal {\n        require(isContract(tokenAddress), \"BAD_TOKEN_ADDRESS\");\n        // NOLINTNEXTLINE: low-level-calls.\n        (bool success, bytes memory returndata) = tokenAddress.call(callData);\n        require(success, string(returndata));\n\n        if (returndata.length > 0) {\n            require(abi.decode(returndata, (bool)), \"TOKEN_OPERATION_FAILED\");\n        }\n    }\n\n    /*\n      Validates that the passed contract address is of a real contract,\n      and that its id hash (as infered fromn identify()) matched the expected one.\n    */\n    function validateContractId(address contractAddress, bytes32 expectedIdHash) internal {\n        require(isContract(contractAddress), \"ADDRESS_NOT_CONTRACT\");\n        (bool success, bytes memory returndata) =\n            contractAddress.call( // NOLINT: low-level-calls.\n                abi.encodeWithSignature(\"identify()\")\n            );\n        require(success, \"FAILED_TO_IDENTIFY_CONTRACT\");\n        string memory realContractId = abi.decode(returndata, (string));\n        require(keccak256(abi.encodePacked(realContractId)) == expectedIdHash, \"UNEXPECTED_CONTRACT_IDENTIFIER\");\n    }\n}\n\n/*\n  II. StarkExTypes - Common data types.\n*/\nlibrary StarkExTypes {\n    // Structure representing a list of verifiers (validity/availability).\n    // A statement is valid only if all the verifiers in the list agree on it.\n    // Adding a verifier to the list is immediate - this is used for fast resolution of\n    // any soundness issues.\n    // Removing from the list is time-locked, to ensure that any user of the system\n    // not content with the announced removal has ample time to leave the system before it is\n    // removed.\n    struct ApprovalChainData {\n        address[] list;\n        // Represents the time after which the verifier with the given address can be removed.\n        // Removal of the verifier with address A is allowed only in the case the value\n        // of unlockedForRemovalTime[A] != 0 and unlockedForRemovalTime[A] < (current time).\n        mapping(address => uint256) unlockedForRemovalTime;\n    }\n}\n"},"src/bridge/starkex/libraries/StarkCurveECDSA.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\n/*\n  Ported from Solidity ^0.6.12 to ^0.8.27 for the Immutable X migration contracts.\n  Original source: https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/components/ECDSA.sol\n*/\npragma solidity ^0.8.27;\n\nimport {EllipticCurve} from \"./EllipticCurve.sol\";\n\nlibrary StarkCurveECDSA {\n    using EllipticCurve for uint256;\n\n    uint256 internal constant FIELD_PRIME = 0x800000000000011000000000000000000000000000000000000000000000001;\n    uint256 internal constant ALPHA = 1;\n    uint256 internal constant BETA = 3141592653589793238462643383279502884197169399375105820974944592307816406665;\n    uint256 internal constant EC_ORDER = 3618502788666131213697322783095070105526743751716087489154079457884512865583;\n    uint256 internal constant N_ELEMENT_BITS_ECDSA = 251;\n    uint256 internal constant EC_GEN_X = 0x1ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca;\n    uint256 internal constant EC_GEN_Y = 0x5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f;\n\n    function verify(uint256 msgHash, uint256 r, uint256 s, uint256 pubX, uint256 pubY) internal pure {\n        require(msgHash % EC_ORDER == msgHash, \"msgHash out of range\");\n        require((1 <= s) && (s < EC_ORDER), \"s out of range\");\n        uint256 w = s.invMod(EC_ORDER);\n        require((1 <= r) && (r < (1 << N_ELEMENT_BITS_ECDSA)), \"r out of range\");\n        require((1 <= w) && (w < (1 << N_ELEMENT_BITS_ECDSA)), \"w out of range\");\n\n        // Verify that pub is a valid point (y^2 = x^3 + x + BETA).\n        {\n            uint256 x3 = mulmod(mulmod(pubX, pubX, FIELD_PRIME), pubX, FIELD_PRIME);\n            uint256 y2 = mulmod(pubY, pubY, FIELD_PRIME);\n            require(y2 == addmod(addmod(x3, pubX, FIELD_PRIME), BETA, FIELD_PRIME), \"INVALID_STARK_KEY\");\n        }\n\n        // Verify signature.\n        uint256 b_x;\n        uint256 b_y;\n        {\n            (uint256 zG_x, uint256 zG_y) = msgHash.ecMul(EC_GEN_X, EC_GEN_Y, ALPHA, FIELD_PRIME);\n            (uint256 rQ_x, uint256 rQ_y) = r.ecMul(pubX, pubY, ALPHA, FIELD_PRIME);\n            (b_x, b_y) = zG_x.ecAdd(zG_y, rQ_x, rQ_y, ALPHA, FIELD_PRIME);\n        }\n        (uint256 res_x,) = w.ecMul(b_x, b_y, ALPHA, FIELD_PRIME);\n\n        require(res_x == r, \"INVALID_STARK_SIGNATURE\");\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/axelar-gmp-sdk-solidity/contracts/types/GasEstimationTypes.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title GasEstimationType\n * @notice This enum represents the gas estimation types for different chains.\n */\nenum GasEstimationType {\n    Default,\n    OptimismEcotone,\n    OptimismBedrock,\n    Arbitrum,\n    Scroll\n}\n\n/**\n * @title GasInfo\n * @notice This struct represents the gas pricing information for a specific chain.\n * @dev Smaller uint types are used for efficient struct packing to save storage costs.\n */\nstruct GasInfo {\n    /// @dev Custom gas pricing rule, such as L1 data fee on L2s\n    uint64 gasEstimationType;\n    /// @dev Scalar value needed for specific gas estimation types, expected to be less than 1e10\n    uint64 l1FeeScalar;\n    /// @dev Axelar base fee for cross-chain message approval on destination, in terms of source native gas token\n    uint128 axelarBaseFee;\n    /// @dev Gas price of destination chain, in terms of the source chain token, i.e dest_gas_price * dest_token_market_price / src_token_market_price\n    uint128 relativeGasPrice;\n    /// @dev Needed for specific gas estimation types. Blob base fee of destination chain, in terms of the source chain token, i.e dest_blob_base_fee * dest_token_market_price / src_token_market_price\n    uint128 relativeBlobBaseFee;\n    /// @dev Axelar express fee for express execution, in terms of source chain token\n    uint128 expressFee;\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IInterchainGasEstimation.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { GasEstimationType, GasInfo } from '../types/GasEstimationTypes.sol';\n\n/**\n * @title IInterchainGasEstimation Interface\n * @notice This is an interface for the InterchainGasEstimation contract\n * which allows for estimating gas fees for cross-chain communication on the Axelar network.\n */\ninterface IInterchainGasEstimation {\n    error UnsupportedEstimationType(GasEstimationType gasEstimationType);\n\n    /**\n     * @notice Event emitted when the gas price for a specific chain is updated.\n     * @param chain The name of the chain\n     * @param info The gas info for the chain\n     */\n    event GasInfoUpdated(string chain, GasInfo info);\n\n    /**\n     * @notice Returns the gas price for a specific chain.\n     * @param chain The name of the chain\n     * @return gasInfo The gas info for the chain\n     */\n    function getGasInfo(string calldata chain) external view returns (GasInfo memory);\n\n    /**\n     * @notice Estimates the gas fee for a cross-chain contract call.\n     * @param destinationChain Axelar registered name of the destination chain\n     * @param destinationAddress Destination contract address being called\n     * @param executionGasLimit The gas limit to be used for the destination contract execution,\n     *        e.g. pass in 200k if your app consumes needs upto 200k for this contract call\n     * @param params Additional parameters for the gas estimation\n     * @return gasEstimate The cross-chain gas estimate, in terms of source chain's native gas token that should be forwarded to the gas service.\n     */\n    function estimateGasFee(\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        uint256 executionGasLimit,\n        bytes calldata params\n    ) external view returns (uint256 gasEstimate);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IUpgradable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IOwnable } from './IOwnable.sol';\nimport { IImplementation } from './IImplementation.sol';\n\n// General interface for upgradable contracts\ninterface IUpgradable is IOwnable, IImplementation {\n    error InvalidCodeHash();\n    error InvalidImplementation();\n    error SetupFailed();\n\n    event Upgraded(address indexed newImplementation);\n\n    function implementation() external view returns (address);\n\n    function upgrade(\n        address newImplementation,\n        bytes32 newImplementationCodeHash,\n        bytes calldata params\n    ) external;\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IAxelarGateway } from './IAxelarGateway.sol';\n\n/**\n * @title IAxelarExecutable\n * @dev Interface for a contract that is executable by Axelar Gateway's cross-chain message passing.\n * It defines a standard interface to execute commands sent from another chain.\n */\ninterface IAxelarExecutable {\n    /**\n     * @dev Thrown when a function is called with an invalid address.\n     */\n    error InvalidAddress();\n\n    /**\n     * @dev Thrown when the call is not approved by the Axelar Gateway.\n     */\n    error NotApprovedByGateway();\n\n    /**\n     * @notice Returns the address of the AxelarGateway contract.\n     * @return The Axelar Gateway contract associated with this executable contract.\n     */\n    function gateway() external view returns (IAxelarGateway);\n\n    /**\n     * @notice Executes the specified command sent from another chain.\n     * @dev This function is called by the Axelar Gateway to carry out cross-chain commands.\n     * Reverts if the call is not approved by the gateway or other checks fail.\n     * @param commandId The identifier of the command to execute.\n     * @param sourceChain The name of the source chain from where the command originated.\n     * @param sourceAddress The address on the source chain that sent the command.\n     * @param payload The payload of the command to be executed. This typically includes the function selector and encoded arguments.\n     */\n    function execute(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes calldata payload\n    ) external;\n}\n"},"src/bridge/starkex/ProxyStorage.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {GovernanceStorage} from \"./GovernanceStorage.sol\";\n\n/*\n * NOTE: This code is imported as is from starkex-contracts repository:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/upgrade/ProxyStorage.sol\n */\n\n/**\n * @title ProxyStorage\n * @notice Contract that holds Proxy-specific state variables\n * @dev This contract is inherited by the GovernanceStorage (and indirectly by MainStorage)\n *      to prevent collision hazard between different storage contracts\n */\ncontract ProxyStorage is GovernanceStorage {\n    /// @notice DEPRECATED: Mapping of addresses to initialization hashes\n    /// @dev NOLINTNEXTLINE: naming-convention uninitialized-state - this is intentional as it's a storage contract\n    mapping(address => bytes32) internal initializationHash_DEPRECATED;\n\n    /// @notice NO_LONGER_USED: Mapping of implementation hashes to their enabled time\n    /// @dev The time after which we can switch to the implementation\n    /// @dev Hash(implementation, data, finalize) => time\n    mapping(bytes32 => uint256) internal enabledTime;\n\n    /// @notice Central storage of flags indicating whether implementations have been initialized\n    /// @dev Can be used flexibly enough to accommodate multiple levels of initialization\n    ///      (i.e. using different key salting schemes for different initialization levels)\n    mapping(bytes32 => bool) internal initialized;\n}\n"},"src/bridge/starkex/libraries/EllipticCurve.sol":{"content":"// SPDX-License-Identifier: MIT\n/*\n  MIT License\n  Copyright (c) 2019 Witnet Project\n  https://github.com/witnet/elliptic-curve-solidity/blob/master/contracts/EllipticCurve.sol\n\n  Ported from Solidity >=0.5.3 <0.7.0 to ^0.8.27 for the Immutable X migration contracts.\n  Original source: https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/third_party/EllipticCurve.sol\n*/\npragma solidity ^0.8.27;\n\n/**\n * @title Elliptic Curve Library\n * @dev Library providing arithmetic operations over elliptic curves.\n * @author Witnet Foundation\n */\nlibrary EllipticCurve {\n    uint256 private constant U255_MAX_PLUS_1 =\n        57896044618658097711785492504343953926634992332820282019728792003956564819968;\n\n    /// @dev Modular euclidean inverse of a number (mod p).\n    function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) {\n        require(_x != 0 && _x != _pp && _pp != 0, \"Invalid number\");\n        uint256 q = 0;\n        uint256 newT = 1;\n        uint256 r = _pp;\n        uint256 t;\n        while (_x != 0) {\n            t = r / _x;\n            (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp));\n            (r, _x) = (_x, r - t * _x);\n        }\n        return q;\n    }\n\n    /// @dev Modular exponentiation, b^e % _pp.\n    function expMod(uint256 _base, uint256 _exp, uint256 _pp) internal pure returns (uint256) {\n        require(_pp != 0, \"Modulus is zero\");\n        if (_base == 0) return 0;\n        if (_exp == 0) return 1;\n\n        uint256 r = 1;\n        uint256 bit = U255_MAX_PLUS_1;\n        assembly {\n            for {} gt(bit, 0) {} {\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, bit)))), _pp)\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 2))))), _pp)\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 4))))), _pp)\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 8))))), _pp)\n                bit := div(bit, 16)\n            }\n        }\n        return r;\n    }\n\n    /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).\n    function toAffine(uint256 _x, uint256 _y, uint256 _z, uint256 _pp) internal pure returns (uint256, uint256) {\n        uint256 zInv = invMod(_z, _pp);\n        uint256 zInv2 = mulmod(zInv, zInv, _pp);\n        uint256 x2 = mulmod(_x, zInv2, _pp);\n        uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp);\n        return (x2, y2);\n    }\n\n    /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates.\n    function ecAdd(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256)\n    {\n        uint256 x = 0;\n        uint256 y = 0;\n        uint256 z = 0;\n        if (_x1 == _x2) {\n            if (addmod(_y1, _y2, _pp) == 0) {\n                return (0, 0);\n            } else {\n                (x, y, z) = jacDouble(_x1, _y1, 1, _aa, _pp);\n            }\n        } else {\n            (x, y, z) = jacAdd(_x1, _y1, 1, _x2, _y2, 1, _pp);\n        }\n        return toAffine(x, y, z, _pp);\n    }\n\n    /// @dev Multiply point (x1, y1, z1) times d in affine coordinates.\n    function ecMul(uint256 _k, uint256 _x, uint256 _y, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256)\n    {\n        (uint256 x1, uint256 y1, uint256 z1) = jacMul(_k, _x, _y, 1, _aa, _pp);\n        return toAffine(x1, y1, z1, _pp);\n    }\n\n    /// @dev Adds two points (x1, y1, z1) and (x2 y2, z2) in Jacobian coordinates.\n    function jacAdd(uint256 _x1, uint256 _y1, uint256 _z1, uint256 _x2, uint256 _y2, uint256 _z2, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256, uint256)\n    {\n        if (_x1 == 0 && _y1 == 0) return (_x2, _y2, _z2);\n        if (_x2 == 0 && _y2 == 0) return (_x1, _y1, _z1);\n\n        uint256[4] memory zs;\n        zs[0] = mulmod(_z1, _z1, _pp);\n        zs[1] = mulmod(_z1, zs[0], _pp);\n        zs[2] = mulmod(_z2, _z2, _pp);\n        zs[3] = mulmod(_z2, zs[2], _pp);\n\n        zs = [mulmod(_x1, zs[2], _pp), mulmod(_y1, zs[3], _pp), mulmod(_x2, zs[0], _pp), mulmod(_y2, zs[1], _pp)];\n\n        require(zs[0] != zs[2] || zs[1] != zs[3], \"Use jacDouble function instead\");\n\n        uint256[4] memory hr;\n        hr[0] = addmod(zs[2], _pp - zs[0], _pp);\n        hr[1] = addmod(zs[3], _pp - zs[1], _pp);\n        hr[2] = mulmod(hr[0], hr[0], _pp);\n        hr[3] = mulmod(hr[2], hr[0], _pp);\n\n        uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp);\n        qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp);\n\n        uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp);\n        qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp);\n\n        uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp);\n        return (qx, qy, qz);\n    }\n\n    /// @dev Doubles a point (x, y, z) in Jacobian coordinates.\n    function jacDouble(uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256, uint256)\n    {\n        if (_z == 0) return (_x, _y, _z);\n\n        uint256 x = mulmod(_x, _x, _pp);\n        uint256 y = mulmod(_y, _y, _pp);\n        uint256 z = mulmod(_z, _z, _pp);\n\n        uint256 s = mulmod(4, mulmod(_x, y, _pp), _pp);\n        uint256 m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp);\n\n        x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp);\n        y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp);\n        z = mulmod(2, mulmod(_y, _z, _pp), _pp);\n\n        return (x, y, z);\n    }\n\n    /// @dev Multiply point (x, y, z) times d in Jacobian coordinates.\n    function jacMul(uint256 _d, uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256, uint256)\n    {\n        if (_d == 0) return (_x, _y, _z);\n\n        uint256 remaining = _d;\n        uint256 qx = 0;\n        uint256 qy = 0;\n        uint256 qz = 1;\n\n        while (remaining != 0) {\n            if ((remaining & 1) != 0) {\n                (qx, qy, qz) = jacAdd(qx, qy, qz, _x, _y, _z, _pp);\n            }\n            remaining = remaining / 2;\n            (_x, _y, _z) = jacDouble(_x, _y, _z, _aa, _pp);\n        }\n        return (qx, qy, qz);\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IOwnable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title IOwnable Interface\n * @notice IOwnable is an interface that abstracts the implementation of a\n * contract with ownership control features. It's commonly used in upgradable\n * contracts and includes the functionality to get current owner, transfer\n * ownership, and propose and accept ownership.\n */\ninterface IOwnable {\n    error NotOwner();\n    error InvalidOwner();\n    error InvalidOwnerAddress();\n\n    event OwnershipTransferStarted(address indexed newOwner);\n    event OwnershipTransferred(address indexed newOwner);\n\n    /**\n     * @notice Returns the current owner of the contract.\n     * @return address The address of the current owner\n     */\n    function owner() external view returns (address);\n\n    /**\n     * @notice Returns the address of the pending owner of the contract.\n     * @return address The address of the pending owner\n     */\n    function pendingOwner() external view returns (address);\n\n    /**\n     * @notice Transfers ownership of the contract to a new address\n     * @param newOwner The address to transfer ownership to\n     */\n    function transferOwnership(address newOwner) external;\n\n    /**\n     * @notice Proposes to transfer the contract's ownership to a new address.\n     * The new owner needs to accept the ownership explicitly.\n     * @param newOwner The address to transfer ownership to\n     */\n    function proposeOwnership(address newOwner) external;\n\n    /**\n     * @notice Transfers ownership to the pending owner.\n     * @dev Can only be called by the pending owner\n     */\n    function acceptOwnership() external;\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IImplementation.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IContractIdentifier } from './IContractIdentifier.sol';\n\ninterface IImplementation is IContractIdentifier {\n    error NotProxy();\n\n    function setup(bytes calldata data) external;\n}\n"},"src/bridge/starkex/GovernanceStorage.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\n/*\n * NOTE: This code is imported as is from starkex-contracts repository:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/components/GovernanceStorage.sol\n */\n\n/**\n * @notice Struct containing governance information for a specific entity\n * @param effectiveGovernors Mapping of addresses to their governor status\n * @param candidateGovernor Address of the candidate governor waiting to be confirmed\n * @param initialized Flag indicating whether the governance has been initialized\n */\nstruct GovernanceInfoStruct {\n    mapping(address => bool) effectiveGovernors;\n    address candidateGovernor;\n    bool initialized;\n}\n\n/**\n * @title GovernanceStorage\n * @notice Contract that holds governance slots for all entities, including proxy and main contracts\n * @dev This contract provides a centralized storage for governance information across multiple entities\n */\ncontract GovernanceStorage {\n    /// @notice NO_LONGER_USED: Mapping from governor tag to its corresponding GovernanceInfoStruct\n    /// @dev NOLINT uninitialized-state - this is intentional as it's a storage contract\n    mapping(string => GovernanceInfoStruct) internal governanceInfo;\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IContractIdentifier.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// General interface for upgradable contracts\ninterface IContractIdentifier {\n    /**\n     * @notice Returns the contract ID. It can be used as a check during upgrades.\n     * @dev Meant to be overridden in derived contracts.\n     * @return bytes32 The contract ID\n     */\n    function contractId() external pure returns (bytes32);\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.27+commit.40a35a09","compilerSettings":{"viaIR":true,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"runs":200,"enabled":false},"evmVersion":"prague","remappings":["@openzeppelin/=lib/openzeppelin-contracts/","@axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/","@src/=src/","axelar-cgp-solidity/=lib/axelar-cgp-solidity/contracts/","axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"]},"name":"StarkExchangeMigrationV2","fullyQualifiedName":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},"abi":[{"name":"AmountExceedsBalance","type":"error","inputs":[]},{"name":"ExcessBridgeFeeProvided","type":"error","inputs":[]},{"name":"InsufficientBridgeFee","type":"error","inputs":[]},{"name":"InvalidAddress","type":"error","inputs":[]},{"name":"InvalidAmount","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"NoMigrationDetails","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"ReentrancyGuardReentrantCall","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"UnauthorizedMigrationInitiator","type":"error","inputs":[]},{"name":"ERC20HoldingsMigration","type":"event","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"initiator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ETHHoldingsMigration","type":"event","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"initiator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"LogUserRegistered","type":"event","inputs":[{"name":"ethKey","type":"address","indexed":false,"internalType":"address"},{"name":"starkKey","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"sender","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"LogWithdrawalPerformed","type":"event","inputs":[{"name":"ownerKey","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"assetType","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"nonQuantizedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"quantizedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"HOLDER_1_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_1_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_1_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_2_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_2_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_2_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_3_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_3_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_3_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_4_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_4_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_4_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_5_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_5_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_5_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_6_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_6_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_6_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_7_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_7_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_7_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"NATIVE_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"VCO_ASSET_TYPE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"VERSION","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"getAssetInfo","type":"function","inputs":[{"name":"assetType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assetInfo","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"getEthKey","type":"function","inputs":[{"name":"ownerKey","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getQuantum","type":"function","inputs":[{"name":"presumedAssetType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"quantum","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getWithdrawalBalance","type":"function","inputs":[{"name":"ownerKey","type":"uint256","internalType":"uint256"},{"name":"assetId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isFrozen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"migrateHoldings","type":"function","inputs":[{"name":"tokens","type":"tuple[]","components":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"bridgeFee","type":"uint256","internalType":"uint256"}],"internalType":"struct IStarkExchangeMigration.TokenMigrationDetails[]"}],"outputs":[],"stateMutability":"payable"},{"name":"migrateVaultRoot","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"migrationManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"registerEthAddress","type":"function","inputs":[{"name":"ethKey","type":"address","internalType":"address"},{"name":"starkKey","type":"uint256","internalType":"uint256"},{"name":"starkSignature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"registerSender","type":"function","inputs":[{"name":"starkKey","type":"uint256","internalType":"uint256"},{"name":"starkSignature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"rootSenderAdapter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract VaultRootSenderAdapter"}],"stateMutability":"view"},{"name":"vaultRoot","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"withdraw","type":"function","inputs":[{"name":"ownerKey","type":"uint256","internalType":"uint256"},{"name":"assetType","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"zkEVMBridge","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"zkEVMWithdrawalProcessor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"}],"metadata":{"compiler":{"version":"0.8.27+commit.40a35a09"},"language":"Solidity","output":{"abi":[{"inputs":[],"name":"AmountExceedsBalance","type":"error"},{"inputs":[],"name":"ExcessBridgeFeeProvided","type":"error"},{"inputs":[],"name":"InsufficientBridgeFee","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NoMigrationDetails","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnauthorizedMigrationInitiator","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"}],"name":"ERC20HoldingsMigration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"}],"name":"ETHHoldingsMigration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ethKey","type":"address"},{"indexed":false,"internalType":"uint256","name":"starkKey","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"LogUserRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ownerKey","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nonQuantizedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantizedAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"LogWithdrawalPerformed","type":"event"},{"inputs":[],"name":"HOLDER_1_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_1_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_1_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_2_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_2_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_2_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_3_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_3_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_3_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_4_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_4_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_4_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_5_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_5_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_5_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_6_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_6_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_6_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_7_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_7_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HOLDER_7_KEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NATIVE_ETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VCO_ASSET_TYPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetType","type":"uint256"}],"name":"getAssetInfo","outputs":[{"internalType":"bytes","name":"assetInfo","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ownerKey","type":"uint256"}],"name":"getEthKey","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"presumedAssetType","type":"uint256"}],"name":"getQuantum","outputs":[{"internalType":"uint256","name":"quantum","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ownerKey","type":"uint256"},{"internalType":"uint256","name":"assetId","type":"uint256"}],"name":"getWithdrawalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"bridgeFee","type":"uint256"}],"internalType":"struct IStarkExchangeMigration.TokenMigrationDetails[]","name":"tokens","type":"tuple[]"}],"name":"migrateHoldings","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"migrateVaultRoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"migrationManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ethKey","type":"address"},{"internalType":"uint256","name":"starkKey","type":"uint256"},{"internalType":"bytes","name":"starkSignature","type":"bytes"}],"name":"registerEthAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"starkKey","type":"uint256"},{"internalType":"bytes","name":"starkSignature","type":"bytes"}],"name":"registerSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rootSenderAdapter","outputs":[{"internalType":"contract VaultRootSenderAdapter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultRoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ownerKey","type":"uint256"},{"internalType":"uint256","name":"assetType","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zkEVMBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"zkEVMWithdrawalProcessor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}],"devdoc":{"details":"VCO tokens were not migrated during the original migration due to a bug in the VCO token's      `approve` method. This contract populates `pendingWithdrawals` and `ethKeys` entries for      the 7 VCO holders during initialization. Holders can then withdraw using the standard      `withdraw(uint256, uint256)` function inherited from LegacyStarkExchangeBridge.      All existing StarkExchangeMigration functionality is preserved.","errors":{"InvalidInitialization()":[{"details":"The contract is already initialized."}],"NotInitializing()":[{"details":"The contract is not initializing."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"ERC20HoldingsMigration(address,uint256,address,address)":{"params":{"amount":"The amount of tokens being migrated","initiator":"The address that initiated the migration","recipient":"The address receiving the migrated tokens","token":"The address of the ERC20 token being migrated"}},"ETHHoldingsMigration(uint256,address,address)":{"params":{"amount":"The amount of ETH being migrated","initiator":"The address that initiated the migration","recipient":"The address receiving the migrated ETH"}},"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)":{"params":{"assetType":"The type of asset being withdrawn","nonQuantizedAmount":"The non-quantized amount withdrawn","ownerKey":"The Stark key of the vault owner","quantizedAmount":"The quantized amount withdrawn","recipient":"The address receiving the withdrawn funds"}}},"kind":"dev","methods":{"getAssetInfo(uint256)":{"details":"Reverts if the asset type is not registered","params":{"assetType":"The asset type to get info for"},"returns":{"assetInfo":"The asset info bytes"}},"getEthKey(uint256)":{"details":"If the ownerKey is registered, the registered key is returned.      If not, and the size is within the range of an Ethereum address (i.e. < 2**160)      the owner key itself is returned. Otherwise, the zero address is returned.Note - prior to version 4.0 this function reverted on an unregistered starkKey.      For a variant of this function that reverts on an unregistered starkKey, use strictGetEthKey.","params":{"ownerKey":"The Stark key to look up"},"returns":{"_0":"The Ethereum address associated with the Stark key"}},"getQuantum(uint256)":{"details":"Returns 1 as default quantum for unregistered asset types (e.g., NFTs)","params":{"presumedAssetType":"The asset type to get quantum for"},"returns":{"quantum":"The quantum value for the asset type"}},"getWithdrawalBalance(uint256,uint256)":{"params":{"assetId":"The asset ID to check","ownerKey":"The Stark key of the owner"},"returns":{"_0":"The withdrawal balance in non-quantized units"}},"initialize(bytes)":{"details":"The bytes parameter is unused but required to match the parent function signature for StarkEx proxy compatibility.      Uses `reinitializer(2)` because the parent's `initialize` used `initializer` (equivalent to      reinitializer(1)). This ensures the function can only execute once."},"isFrozen()":{"returns":{"_0":"Always returns false as this contract is never frozen"}},"migrateHoldings((address,uint256,uint256)[])":{"details":"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset","params":{"assets":"The list of assets to migrate, each containing the token address and amount. ETH is represented by the address(0xeee)"}},"migrateVaultRoot()":{"details":"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset"},"registerEthAddress(address,uint256,bytes)":{"details":"Ported from the original StarkEx Users.sol contract.","params":{"ethKey":"The Ethereum address to associate","starkKey":"The Stark public key (x-coordinate on the Stark curve)","starkSignature":"96-byte signature: abi.encode(r, s, starkKeyY)"}},"registerSender(uint256,bytes)":{"params":{"starkKey":"The Stark public key (x-coordinate on the Stark curve)","starkSignature":"96-byte signature: abi.encode(r, s, starkKeyY)"}},"withdraw(uint256,uint256)":{"details":"This function can be called by anyoneCan be called normally while frozen","params":{"assetType":"The asset type to withdraw","ownerKey":"The Stark key of the owner"}}},"title":"StarkExchangeMigrationV2","version":1},"userdoc":{"errors":{"AmountExceedsBalance()":[{"notice":"Thrown if the bridge does not have sufficient funds of the token to perform the specified migration amount"}],"ExcessBridgeFeeProvided()":[{"notice":"Thrown when the bridge fee provided exceeds the required amount"}],"InsufficientBridgeFee()":[{"notice":"Thrown when the bridge fee provided is insufficient to cover the cost of bridging the assets to zkEVM"}],"InvalidAddress()":[{"notice":"Thrown when a zero address is provided"}],"InvalidAmount()":[{"notice":"Thrown when a zero is provided as amount to migrate"}],"NoMigrationDetails()":[{"notice":"Thrown when no assets are provided for migration"}],"UnauthorizedMigrationInitiator()":[{"notice":"Thrown when an unauthorized account attempts to initiate migration process"}]},"events":{"ERC20HoldingsMigration(address,uint256,address,address)":{"notice":"Emitted when migration of ERC20 tokens is initiated"},"ETHHoldingsMigration(uint256,address,address)":{"notice":"Emitted when ETH holdings migration is initiated"},"LogUserRegistered(address,uint256,address)":{"notice":"Emitted when a user registers their Stark key to an Ethereum address"},"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)":{"notice":"Emitted when a withdrawal of an already pending withdrawal is finalised"}},"kind":"user","methods":{"VCO_ASSET_TYPE()":{"notice":"VCO token asset type ID from the StarkEx system"},"VERSION()":{"notice":"Version identifier for the contract"},"getAssetInfo(uint256)":{"notice":"Gets the asset info for a given asset type"},"getEthKey(uint256)":{"notice":"Returns the Ethereum public key (address) that owns the given ownerKey"},"getQuantum(uint256)":{"notice":"Gets the quantum for an asset type"},"getWithdrawalBalance(uint256,uint256)":{"notice":"Gets the withdrawal balance for a specific owner and asset"},"initialize(bytes)":{"notice":"Populates `pendingWithdrawals` with VCO token entries for the 7 holders and registers         Stark key → Ethereum address associations for holders not yet registered on-chain."},"isFrozen()":{"notice":"Returns whether the contract is frozen"},"migrateHoldings((address,uint256,uint256)[])":{"notice":"Migrates the bridge's holdings of the specified assets and amounts to zkEVM, by depositing the funds to the zkEVM bridge contract."},"migrateVaultRoot()":{"notice":"Sends the latest vault root data stored in this contract to the configured withdrawal processor contract on zkEVM."},"migrationManager()":{"notice":"Address of the migration initiator"},"registerEthAddress(address,uint256,bytes)":{"notice":"Associates an Ethereum address with a Stark key, verified by a STARK-curve ECDSA signature."},"registerSender(uint256,bytes)":{"notice":"Convenience function: registers msg.sender as the Ethereum address for the given Stark key."},"rootSenderAdapter()":{"notice":"The vault root sender contract for cross-chain messaging"},"vaultRoot()":{"notice":"Vaults Tree Root"},"withdraw(uint256,uint256)":{"notice":"Moves funds from the pending withdrawal account to the owner address"},"zkEVMBridge()":{"notice":"Address of the zkEVM bridge contract"},"zkEVMWithdrawalProcessor()":{"notice":"Address of the zkEVM vault processor contract"}},"notice":"Upgrades the StarkEx bridge to register Stark key → Ethereum address associations for         holders whose keys are not yet registered on-chain, enabling them to call `withdraw`.","version":1}},"settings":{"compilationTarget":{"src/bridge/starkex/StarkExchangeMigrationV2.sol":"StarkExchangeMigrationV2"},"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[":@axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/",":@openzeppelin/=lib/openzeppelin-contracts/",":@src/=src/",":axelar-cgp-solidity/=lib/axelar-cgp-solidity/contracts/",":axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",":openzeppelin-contracts/=lib/openzeppelin-contracts/"],"viaIR":true},"sources":{"lib/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol":{"keccak256":"0x89078799d3ff3501cb859e3b87c9ac9541dd54bcdeb194b230324a2d74f6a74a","license":"MIT","urls":["bzz-raw://d7e24a3b23e54b4fa45e2184da956a04a76b68dbc27b5706f465d8989ecb7109","dweb:/ipfs/QmeFzVaUCYWgHAt9sCF62cUkGpvFfchH3riu7ZQCd5f8RP"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol":{"keccak256":"0xc62de7533d4891bfd5bd8792e6638cb1d3ff4389dee2ce1f1dc8de235a057daa","license":"MIT","urls":["bzz-raw://f934a6afcebde328dbf271af65a24370618f173c65f705739fb16e7f99195c15","dweb:/ipfs/QmZ61TPX1wPk3UDhpGxktTdYvgei3kBG1iCMYLt99ANwhN"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol":{"keccak256":"0x7ad77d3af41f342e9032889a7b5aa224ab0c6dfaf9ce9350fe403d4a596c5eae","license":"MIT","urls":["bzz-raw://cc2358f1f1138cd742a7cfdfc83420c488c19c3b3e39d703482e124e453953ee","dweb:/ipfs/QmYki4j2yWrixJVs955DyS1ZmLD5zcxe8ss52w6DLBLRi4"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol":{"keccak256":"0xbd92798eade563d8a663db59f6f04db5acdee5beda3a6d091e44a7d5c6b2f68e","license":"MIT","urls":["bzz-raw://1519882aed7b6de2ee1e316e5188d2bda1e305fc18a96b3895831f49dc9f90b0","dweb:/ipfs/QmYTLwLGwmDkyX6GSE6PU93TkWP5mFz8qhmFyBrWfj6gaB"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IContractIdentifier.sol":{"keccak256":"0x21a94655f7f1ed3d7188bd38ce6187892c615b80f9a74e123cbc38113d855a35","license":"MIT","urls":["bzz-raw://e7e1f30e159d40a9f8431c26955a584507bc23a30f19380c723acdb4182ba7c1","dweb:/ipfs/QmXb965di5pU3m3W36k19ZX8m6qCDaEi1jEt6NocqrGPXj"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IImplementation.sol":{"keccak256":"0xa7f275514d44bec3ab8ab8c768736329174d7cc6c5cd329c3509a66bce9cd468","license":"MIT","urls":["bzz-raw://983e8c97e4916b47244d71fa104fc368100991561fe8c28f1a6bae043763754d","dweb:/ipfs/QmeFeJsCowShVsAe6RMiz3qjY2JTyRNYRRu1oYQcN9T6uV"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IInterchainGasEstimation.sol":{"keccak256":"0x5463c0d3632e53d3906796d4283a627bd7ebc63d0092685715d98340db9516ff","license":"MIT","urls":["bzz-raw://9cd73f4b82b70f3e93b23ac591696de14b1cc88e1e60a5f66b1ac8b0e2ecd2ec","dweb:/ipfs/Qmd8psz6tmcmop1iD6fqX8vCRfrkVm7aGMZCXEbsiVjBV8"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IOwnable.sol":{"keccak256":"0x5cb5691c9293e3011e1b133485411e8933ca1e110f2436a663df12991d134bf7","license":"MIT","urls":["bzz-raw://cdbeb0f7ec37155f976a3bdd9f13055c80f1b2d17043740d387403cb8d65a096","dweb:/ipfs/QmXKLyWetJGgwUuEtexjPxfeZdgUywhrHS4898fQSFkC5y"]},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IUpgradable.sol":{"keccak256":"0x4e1f84c9711c3c15c77aee5fce8de99fcb49a902c7e6ff24626c924a60b8c22d","license":"MIT","urls":["bzz-raw://b2f36d8fb4b365e78663579bfd0d3252a6e290f6dd763d9275f4c6f5f51577d9","dweb:/ipfs/QmZjhnPbjqnRztwbYYs1BdxRbSsAmSLkCfE9SNRk4jMFMe"]},"lib/axelar-gmp-sdk-solidity/contracts/types/GasEstimationTypes.sol":{"keccak256":"0x7da6d20700698dfae8f8252c442e4bebd29030ffcdac4fbbe986f1ddbcb6365c","license":"MIT","urls":["bzz-raw://992662e49dbc87ab994d8b68c5183dcd5453c71d04f98816b68cb00589938058","dweb:/ipfs/QmYiuEMnYZod1iRTaEcqbJcUp3LwdDPyt2M7KUaqECivau"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"keccak256":"0x9b6b3e7803bc5f2f8cd7ad57db8ac1def61a9930a5a3107df4882e028a9605d7","license":"MIT","urls":["bzz-raw://da62d6be1f5c6edf577f0cb45666a8aa9c2086a4bac87d95d65f02e2f4c36a4b","dweb:/ipfs/QmNkpvBpoCMvX8JwAFNSc5XxJ2q5BXJpL5L1txb4QkqVFF"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"keccak256":"0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724","license":"MIT","urls":["bzz-raw://11fea9f8bc98949ac6709f0c1699db7430d2948137aa94d5a9e95a91f61a710a","dweb:/ipfs/QmQdfRXxQjwP6yn3DVo1GHPpriKNcFghSPi94Z1oKEFUNS"]},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"keccak256":"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c","license":"MIT","urls":["bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba","dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1"]},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"keccak256":"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05","license":"MIT","urls":["bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08","dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q"]},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7","license":"MIT","urls":["bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db","dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"]},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x70f2f713b13b7ce4610bcd0ac9fec0f3cc43693b043abcb8dc40a42a726eb330","license":"MIT","urls":["bzz-raw://c13d13304ac79a83ab1c30168967d19e2203342ebbd6a9bbce4db7550522dcbf","dweb:/ipfs/QmeN5jKMN2vw5bhacr6tkg78afbTTZUeaacNHqjWt4Ew1r"]},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5","license":"MIT","urls":["bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508","dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB"]},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"keccak256":"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3","license":"MIT","urls":["bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a","dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA"]},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"keccak256":"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8","license":"MIT","urls":["bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621","dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL"]},"src/bridge/messaging/VaultRootSenderAdapter.sol":{"keccak256":"0xd62dedc49c33a5ae9ce9a8c29b4652a4dd3a94706938d1c84003e1260b1504ab","license":"MIT","urls":["bzz-raw://499235db923fbf3a69692c8abb269994802c5dc6ddbe1256cb62df3a9ab048c1","dweb:/ipfs/QmSc6yDZnF6ex6TA4fjaS6ABNuhX714biVqRpf64s9EgGB"]},"src/bridge/starkex/GovernanceStorage.sol":{"keccak256":"0x7cc572e77746cf378cce6ea571ea44c1e07ccf0b2a538f29f3a3b9d15e5ccabf","license":"Apache-2.0.","urls":["bzz-raw://6e9ef1fd6cf1fbbf8ae74b10da670240558cf252d88d077e8d71b8e7398f4b14","dweb:/ipfs/QmPVfndKEW99TDDVRoW7o4QC82My3iG2VfyuCmfLiqFHhq"]},"src/bridge/starkex/IStarkExchangeMigration.sol":{"keccak256":"0xaf8d2807f037b446cdab526412d4dd02c616dd4135ccb5c64c268fcd0b05ed6b","license":"MIT","urls":["bzz-raw://260072e79063ed88e25bbadec7b05f16538318804f27de56368fb851e4285571","dweb:/ipfs/QmeEfRD67mgvLanAZEpsCRPRFWhXJmUPqsokTUAvnECkuy"]},"src/bridge/starkex/LegacyStarkExchangeBridge.sol":{"keccak256":"0x464e545a0e1544d925becdd084f7bde839cf6b3e30bc80361fd3ab46017711ee","license":"Apache-2.0.","urls":["bzz-raw://19aeefba645761b6ddb547844a914a92bbd3a4efff94777eb0ad217dd1343f6e","dweb:/ipfs/QmefHu2Qx3JSN8kLDNsjykQmtRktKu9KC7f7UoagrcvqWK"]},"src/bridge/starkex/MainStorage.sol":{"keccak256":"0xc8c3a12f1411658e08884469f1532e05ce854d822a667c61517ce2ae88f262ae","license":"Apache-2.0.","urls":["bzz-raw://95bb367c297651b8a9555921066bd49a656f22e61de99197f2db4466bfd52725","dweb:/ipfs/QmW97uKEn6ABxArv1vcdpCeJYrt8FQzC9hoSQxChGks682"]},"src/bridge/starkex/ProxyStorage.sol":{"keccak256":"0x6ccf1df534efceda5942c898aa3aeebe8ffbc34ce05ffa944e4060f268fe0aa1","license":"Apache-2.0.","urls":["bzz-raw://1bb4187dc190b1dd6fbd1f2469f1cd2ecc26f156e8c30a71f58fc536e0d312f6","dweb:/ipfs/QmYnxs4tStm6pkV3tPom8Frw6N9DJRnruDdGmpsxRumUHv"]},"src/bridge/starkex/StarkExchangeMigration.sol":{"keccak256":"0x618ce263f2eb9a7bbd7ba3caa7d47585719e398ac434be2eb39e3b7bcb392ba7","license":"Apache-2.0.","urls":["bzz-raw://0af30a566b0afa8dcaf0a55492eb58b7e375423b4d70e293ffd99981c0703427","dweb:/ipfs/QmTzUaTfj6AVxPb2SzxTyS8uQwTU1p2VFtcRre3FBYDQby"]},"src/bridge/starkex/StarkExchangeMigrationV2.sol":{"keccak256":"0xe8b890446e87eea527ad58b5bf310999a957b4fea98d3ca2604aa92c61275ae0","license":"Apache-2.0.","urls":["bzz-raw://f30356cdfc980b1bf9c0f152f79c4222b0156a80a5d0e3dc01fc356a7dba075d","dweb:/ipfs/Qmf3SBBYcnPDmAQnM8GhkAXB6aGKv7amqBLXW5Rs6D4oNP"]},"src/bridge/starkex/libraries/Common.sol":{"keccak256":"0x9a8cf6a0392569b1ac83cf01c65b97620a3eac6a886e4bab79831b3747f7df9b","license":"Apache-2.0.","urls":["bzz-raw://24ed71c1fef447261234f1b62a3b15a9fc0ddbb715a498d12648922cbbac38b7","dweb:/ipfs/QmbocKu8w4xMyANJuZCQZf4Et1U7qn64H3rHX924sxDG7s"]},"src/bridge/starkex/libraries/EllipticCurve.sol":{"keccak256":"0x95029e954a0358fec3a9b83a67cadcf805b10497a57afb088353d40feebbf2a7","license":"MIT","urls":["bzz-raw://df1394afb46c5b9b25b1c3cd533057d86d00cfc426acc41105a6b4475e900ac8","dweb:/ipfs/QmZqEikptNKCvMRGGk5ts1yXYsATbF3saY55wMxHHdHsj2"]},"src/bridge/starkex/libraries/StarkCurveECDSA.sol":{"keccak256":"0x7d54ba02b596dee3a6c7de30949eefc1461762db54214daddb5b7933732c5097","license":"Apache-2.0.","urls":["bzz-raw://16fb4c59745e7bb7a158192d84c14c44eeaab8b23926567850bc68905f6f16c1","dweb:/ipfs/QmNeKBWAXHhhVui9RYnk2JXg2SsjSQGSw2KATWNKLgwe8p"]},"src/bridge/zkEVM/IRootERC20Bridge.sol":{"keccak256":"0x8789e115ec3c3655e34b6e907e0a244a60291ec20619fec41371c6c415aaff5d","license":"Apache 2.0","urls":["bzz-raw://c463a8b6bbf587b19233e110a626b4018257f8545848df23dd0c57abbcf95821","dweb:/ipfs/QmPY2AL2wgk4joXeeZGryb5JEysjcFeAWban6mbusMB3F5"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_bytes_storage":{"label":"bytes","encoding":"bytes","numberOfBytes":"32"},"t_string_memory_ptr":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_bool)":{"key":"t_bytes32","label":"mapping(bytes32 => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_bool)":{"key":"t_uint256","label":"mapping(uint256 => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_array(t_bytes32)dyn_storage":{"base":"t_bytes32","label":"bytes32[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_address,t_bytes32)":{"key":"t_address","label":"mapping(address => bytes32)","value":"t_bytes32","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_uint256)":{"key":"t_bytes32","label":"mapping(bytes32 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_address)":{"key":"t_uint256","label":"mapping(uint256 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_bytes_storage)":{"key":"t_uint256","label":"mapping(uint256 => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_contract(VaultRootSenderAdapter)2097":{"label":"contract VaultRootSenderAdapter","encoding":"inplace","numberOfBytes":"20"},"t_struct(ApprovalChainData)4037_storage":{"label":"struct StarkExTypes.ApprovalChainData","members":[{"slot":"0","type":"t_array(t_address)dyn_storage","astId":4032,"label":"list","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_mapping(t_address,t_uint256)","astId":4036,"label":"unlockedForRemovalTime","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"}],"encoding":"inplace","numberOfBytes":"64"},"t_struct(GovernanceInfoStruct)2109_storage":{"label":"struct GovernanceInfoStruct","members":[{"slot":"0","type":"t_mapping(t_address,t_bool)","astId":2104,"label":"effectiveGovernors","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_address","astId":2106,"label":"candidateGovernor","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_bool","astId":2108,"label":"initialized","offset":20,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"}],"encoding":"inplace","numberOfBytes":"64"},"t_array(t_uint256)18446744073709551575_storage":{"base":"t_uint256","label":"uint256[18446744073709551575]","encoding":"inplace","numberOfBytes":"590295810358705650400"},"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))":{"key":"t_uint256","label":"mapping(uint256 => mapping(uint256 => uint256))","value":"t_mapping(t_uint256,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_uint256,t_uint256)))":{"key":"t_uint256","label":"mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256)))","value":"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_string_memory_ptr,t_struct(GovernanceInfoStruct)2109_storage)":{"key":"t_string_memory_ptr","label":"mapping(string => struct GovernanceInfoStruct)","value":"t_struct(GovernanceInfoStruct)2109_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_mapping(t_string_memory_ptr,t_struct(GovernanceInfoStruct)2109_storage)","astId":2116,"label":"governanceInfo","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_mapping(t_address,t_bytes32)","astId":3214,"label":"initializationHash_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"2","type":"t_mapping(t_bytes32,t_uint256)","astId":3219,"label":"enabledTime","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"3","type":"t_mapping(t_bytes32,t_bool)","astId":3224,"label":"initialized","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"4","type":"t_address","astId":3038,"label":"escapeVerifierAddress","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"4","type":"t_bool","astId":3041,"label":"stateFrozen","offset":20,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"5","type":"t_uint256","astId":3044,"label":"unFreezeTime","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"6","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_uint256,t_uint256)))","astId":3053,"label":"pendingDeposits","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"7","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_uint256,t_uint256)))","astId":3062,"label":"cancellationRequests","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"8","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))","astId":3069,"label":"pendingWithdrawals","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"9","type":"t_mapping(t_uint256,t_bool)","astId":3074,"label":"escapesUsed","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"10","type":"t_uint256","astId":3077,"label":"escapesUsedCount","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"11","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))","astId":3084,"label":"fullWithdrawalRequests_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"12","type":"t_uint256","astId":3087,"label":"sequenceNumber","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"13","type":"t_uint256","astId":3090,"label":"vaultRoot","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"14","type":"t_uint256","astId":3093,"label":"vaultTreeHeight","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"15","type":"t_uint256","astId":3096,"label":"orderRoot","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"16","type":"t_uint256","astId":3099,"label":"orderTreeHeight","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"17","type":"t_mapping(t_address,t_bool)","astId":3104,"label":"tokenAdmins","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"18","type":"t_mapping(t_address,t_bool)","astId":3109,"label":"userAdmins_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"19","type":"t_mapping(t_address,t_bool)","astId":3114,"label":"operators","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"20","type":"t_mapping(t_uint256,t_bytes_storage)","astId":3119,"label":"assetTypeToAssetInfo","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"21","type":"t_mapping(t_uint256,t_bool)","astId":3124,"label":"registeredAssetType","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"22","type":"t_mapping(t_uint256,t_uint256)","astId":3129,"label":"assetTypeToQuantum","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"23","type":"t_mapping(t_address,t_uint256)","astId":3134,"label":"starkKeys_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"24","type":"t_mapping(t_uint256,t_address)","astId":3139,"label":"ethKeys","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"25","type":"t_struct(ApprovalChainData)4037_storage","astId":3143,"label":"verifiersChain","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"27","type":"t_struct(ApprovalChainData)4037_storage","astId":3146,"label":"availabilityVerifiersChain","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"29","type":"t_uint256","astId":3149,"label":"lastBatchId","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"30","type":"t_mapping(t_uint256,t_address)","astId":3154,"label":"subContracts","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"31","type":"t_mapping(t_uint256,t_bool)","astId":3159,"label":"permissiveAssetType_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"32","type":"t_uint256","astId":3162,"label":"onchainDataVersion","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"33","type":"t_mapping(t_uint256,t_uint256)","astId":3167,"label":"forcedRequestsInBlock","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"34","type":"t_mapping(t_bytes32,t_uint256)","astId":3172,"label":"forcedActionRequests","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"35","type":"t_mapping(t_bytes32,t_uint256)","astId":3177,"label":"actionsTimeLock","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"36","type":"t_array(t_bytes32)dyn_storage","astId":3181,"label":"actionHashList","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"37","type":"t_address","astId":3184,"label":"zkEVMBridge","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"38","type":"t_address","astId":3187,"label":"zkEVMWithdrawalProcessor","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"39","type":"t_address","astId":3190,"label":"migrationManager","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"40","type":"t_contract(VaultRootSenderAdapter)2097","astId":3194,"label":"rootSenderAdapter","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"41","type":"t_array(t_uint256)18446744073709551575_storage","astId":3201,"label":"__endGap","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"18446744073709551616","type":"t_uint256","astId":1784,"label":"_status","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","errors":{"InvalidAmount()":[{"notice":"Thrown when a zero is provided as amount to migrate"}],"InvalidAddress()":[{"notice":"Thrown when a zero address is provided"}],"NoMigrationDetails()":[{"notice":"Thrown when no assets are provided for migration"}],"AmountExceedsBalance()":[{"notice":"Thrown if the bridge does not have sufficient funds of the token to perform the specified migration amount"}],"InsufficientBridgeFee()":[{"notice":"Thrown when the bridge fee provided is insufficient to cover the cost of bridging the assets to zkEVM"}],"ExcessBridgeFeeProvided()":[{"notice":"Thrown when the bridge fee provided exceeds the required amount"}],"UnauthorizedMigrationInitiator()":[{"notice":"Thrown when an unauthorized account attempts to initiate migration process"}]},"events":{"LogUserRegistered(address,uint256,address)":{"notice":"Emitted when a user registers their Stark key to an Ethereum address"},"ETHHoldingsMigration(uint256,address,address)":{"notice":"Emitted when ETH holdings migration is initiated"},"ERC20HoldingsMigration(address,uint256,address,address)":{"notice":"Emitted when migration of ERC20 tokens is initiated"},"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)":{"notice":"Emitted when a withdrawal of an already pending withdrawal is finalised"}},"notice":"Upgrades the StarkEx bridge to register Stark key → Ethereum address associations for         holders whose keys are not yet registered on-chain, enabling them to call `withdraw`.","methods":{"VERSION()":{"notice":"Version identifier for the contract"},"isFrozen()":{"notice":"Returns whether the contract is frozen"},"vaultRoot()":{"notice":"Vaults Tree Root"},"zkEVMBridge()":{"notice":"Address of the zkEVM bridge contract"},"VCO_ASSET_TYPE()":{"notice":"VCO token asset type ID from the StarkEx system"},"initialize(bytes)":{"notice":"Populates `pendingWithdrawals` with VCO token entries for the 7 holders and registers         Stark key → Ethereum address associations for holders not yet registered on-chain."},"getEthKey(uint256)":{"notice":"Returns the Ethereum public key (address) that owns the given ownerKey"},"migrateVaultRoot()":{"notice":"Sends the latest vault root data stored in this contract to the configured withdrawal processor contract on zkEVM."},"migrationManager()":{"notice":"Address of the migration initiator"},"getQuantum(uint256)":{"notice":"Gets the quantum for an asset type"},"rootSenderAdapter()":{"notice":"The vault root sender contract for cross-chain messaging"},"getAssetInfo(uint256)":{"notice":"Gets the asset info for a given asset type"},"withdraw(uint256,uint256)":{"notice":"Moves funds from the pending withdrawal account to the owner address"},"zkEVMWithdrawalProcessor()":{"notice":"Address of the zkEVM vault processor contract"},"registerSender(uint256,bytes)":{"notice":"Convenience function: registers msg.sender as the Ethereum address for the given Stark key."},"getWithdrawalBalance(uint256,uint256)":{"notice":"Gets the withdrawal balance for a specific owner and asset"},"registerEthAddress(address,uint256,bytes)":{"notice":"Associates an Ethereum address with a Stark key, verified by a STARK-curve ECDSA signature."},"migrateHoldings((address,uint256,uint256)[])":{"notice":"Migrates the bridge's holdings of the specified assets and amounts to zkEVM, by depositing the funds to the zkEVM bridge contract."}},"version":1},"devdoc":{"kind":"dev","title":"StarkExchangeMigrationV2","errors":{"NotInitializing()":[{"details":"The contract is not initializing."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"ETHHoldingsMigration(uint256,address,address)":{"params":{"amount":"The amount of ETH being migrated","initiator":"The address that initiated the migration","recipient":"The address receiving the migrated ETH"}},"ERC20HoldingsMigration(address,uint256,address,address)":{"params":{"token":"The address of the ERC20 token being migrated","amount":"The amount of tokens being migrated","initiator":"The address that initiated the migration","recipient":"The address receiving the migrated tokens"}},"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)":{"params":{"ownerKey":"The Stark key of the vault owner","assetType":"The type of asset being withdrawn","recipient":"The address receiving the withdrawn funds","quantizedAmount":"The quantized amount withdrawn","nonQuantizedAmount":"The non-quantized amount withdrawn"}}},"details":"VCO tokens were not migrated during the original migration due to a bug in the VCO token's      `approve` method. This contract populates `pendingWithdrawals` and `ethKeys` entries for      the 7 VCO holders during initialization. Holders can then withdraw using the standard      `withdraw(uint256, uint256)` function inherited from LegacyStarkExchangeBridge.      All existing StarkExchangeMigration functionality is preserved.","methods":{"isFrozen()":{"returns":{"_0":"Always returns false as this contract is never frozen"}},"initialize(bytes)":{"details":"The bytes parameter is unused but required to match the parent function signature for StarkEx proxy compatibility.      Uses `reinitializer(2)` because the parent's `initialize` used `initializer` (equivalent to      reinitializer(1)). This ensures the function can only execute once."},"getEthKey(uint256)":{"params":{"ownerKey":"The Stark key to look up"},"details":"If the ownerKey is registered, the registered key is returned.      If not, and the size is within the range of an Ethereum address (i.e. < 2**160)      the owner key itself is returned. Otherwise, the zero address is returned.Note - prior to version 4.0 this function reverted on an unregistered starkKey.      For a variant of this function that reverts on an unregistered starkKey, use strictGetEthKey.","returns":{"_0":"The Ethereum address associated with the Stark key"}},"migrateVaultRoot()":{"details":"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset"},"getQuantum(uint256)":{"params":{"presumedAssetType":"The asset type to get quantum for"},"details":"Returns 1 as default quantum for unregistered asset types (e.g., NFTs)","returns":{"quantum":"The quantum value for the asset type"}},"getAssetInfo(uint256)":{"params":{"assetType":"The asset type to get info for"},"details":"Reverts if the asset type is not registered","returns":{"assetInfo":"The asset info bytes"}},"withdraw(uint256,uint256)":{"params":{"ownerKey":"The Stark key of the owner","assetType":"The asset type to withdraw"},"details":"This function can be called by anyoneCan be called normally while frozen"},"registerSender(uint256,bytes)":{"params":{"starkKey":"The Stark public key (x-coordinate on the Stark curve)","starkSignature":"96-byte signature: abi.encode(r, s, starkKeyY)"}},"getWithdrawalBalance(uint256,uint256)":{"params":{"assetId":"The asset ID to check","ownerKey":"The Stark key of the owner"},"returns":{"_0":"The withdrawal balance in non-quantized units"}},"registerEthAddress(address,uint256,bytes)":{"params":{"ethKey":"The Ethereum address to associate","starkKey":"The Stark public key (x-coordinate on the Stark curve)","starkSignature":"96-byte signature: abi.encode(r, s, starkKeyY)"},"details":"Ported from the original StarkEx Users.sol contract."},"migrateHoldings((address,uint256,uint256)[])":{"params":{"assets":"The list of assets to migrate, each containing the token address and amount. ETH is represented by the address(0xeee)"},"details":"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset"}},"version":1},"sourceIds":{"src/bridge/starkex/MainStorage.sol":{"id":23},"src/bridge/starkex/ProxyStorage.sol":{"id":24},"src/bridge/zkEVM/IRootERC20Bridge.sol":{"id":30},"src/bridge/starkex/libraries/Common.sol":{"id":27},"src/bridge/starkex/GovernanceStorage.sol":{"id":20},"src/bridge/starkex/StarkExchangeMigration.sol":{"id":25},"src/bridge/starkex/IStarkExchangeMigration.sol":{"id":21},"src/bridge/starkex/libraries/EllipticCurve.sol":{"id":28},"src/bridge/messaging/VaultRootSenderAdapter.sol":{"id":19},"src/bridge/starkex/StarkExchangeMigrationV2.sol":{"id":26},"src/bridge/starkex/LegacyStarkExchangeBridge.sol":{"id":22},"src/bridge/starkex/libraries/StarkCurveECDSA.sol":{"id":29},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":12},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":11},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":14},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":10},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IOwnable.sol":{"id":7},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"id":17},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IUpgradable.sol":{"id":8},"lib/axelar-gmp-sdk-solidity/contracts/types/GasEstimationTypes.sol":{"id":9},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"id":13},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol":{"id":3},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IImplementation.sol":{"id":5},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":16},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":18},"lib/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol":{"id":0},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol":{"id":1},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol":{"id":2},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IContractIdentifier.sol":{"id":4},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IInterchainGasEstimation.sol":{"id":6},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":15}},"additionalInput":null,"stdJsonInput":{"sources":{"src/bridge/starkex/MainStorage.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {ProxyStorage} from \"./ProxyStorage.sol\";\nimport {StarkExTypes} from \"./libraries/Common.sol\";\nimport {VaultRootSenderAdapter} from \"../messaging/VaultRootSenderAdapter.sol\";\n\n/*\n * NOTE: This code is imported from starkex-contracts repository, with minor modifications:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/components/MainStorage.sol\n */\n\n/**\n * @title MainStorage\n * @notice Contract that holds ALL the main contract state (storage) variables\n * @dev This contract contains all the storage variables for the StarkEx migration system,\n *      including vault management, asset tracking, and migration functionality\n */\ncontract MainStorage is ProxyStorage {\n    /// @dev Layout length constant for storage gap management\n    uint256 internal constant LAYOUT_LENGTH = 2 ** 64;\n\n    /// @notice NO_LONGER_USED: Address of the escape verifier contract\n    address escapeVerifierAddress; // NOLINT: constable-states.\n\n    /// @notice NO_LONGER_USED: Global flag indicating if the DEX state is frozen\n    bool stateFrozen; // NOLINT: constable-states.\n\n    /// @notice NO_LONGER_USED: Time when unFreeze can be successfully called (UNFREEZE_DELAY after freeze)\n    uint256 unFreezeTime; // NOLINT: constable-states.\n\n    /// @notice NO_LONGER_USED: Pending deposits mapping: STARK key => asset id => vault id => quantized amount\n    mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256))) pendingDeposits;\n\n    /// @notice NO_LONGER_USED: Cancellation requests mapping: STARK key => asset id => vault id => request timestamp\n    mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256))) cancellationRequests;\n\n    /// @notice no_longer_used: Pending withdrawals mapping: STARK key => asset id => quantized amount\n    mapping(uint256 => mapping(uint256 => uint256)) pendingWithdrawals;\n\n    /// @notice NO_LONGER_USED: Mapping of vault_id => escape used boolean\n    mapping(uint256 => bool) escapesUsed;\n\n    /// @notice NO_LONGER_USED: Number of escapes that were performed when frozen\n    uint256 escapesUsedCount; // NOLINT: constable-states.\n\n    /// @notice DEPRECATED: Full withdrawal requests mapping (replaced by forcedActionRequests)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(uint256 => mapping(uint256 => uint256)) fullWithdrawalRequests_DEPRECATED;\n\n    /// @notice NO_LONGER_USED: State sequence number\n    uint256 sequenceNumber; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice Vaults Tree Root\n    uint256 public vaultRoot; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Vault Tree Height\n    uint256 vaultTreeHeight; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Order Tree Root\n    uint256 orderRoot; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Order Tree Height\n    uint256 orderTreeHeight; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Mapping of addresses that are allowed to add tokens\n    mapping(address => bool) tokenAdmins;\n\n    /// @notice DEPRECATED: User admins mapping (no longer in use, remains for backwards compatibility)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(address => bool) userAdmins_DEPRECATED;\n\n    /// @notice NO_LONGER_USED: Mapping of addresses that are operators (allowed to update state)\n    mapping(address => bool) operators;\n\n    /// @notice Mapping of contract ID to asset data\n    mapping(uint256 => bytes) assetTypeToAssetInfo; // NOLINT: uninitialized-state.\n\n    /// @notice Mapping of registered contract IDs\n    mapping(uint256 => bool) registeredAssetType; // NOLINT: uninitialized-state.\n\n    /// @notice Mapping from contract ID to quantum\n    mapping(uint256 => uint256) assetTypeToQuantum; // NOLINT: uninitialized-state.\n\n    /// @notice DEPRECATED: Stark keys mapping (no longer in use, remains for backwards compatibility)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(address => uint256) starkKeys_DEPRECATED;\n\n    /// @notice Mapping from STARK public key to the Ethereum public key of its owner\n    mapping(uint256 => address) ethKeys; // NOLINT: uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Timelocked state transition and availability verification chain\n    StarkExTypes.ApprovalChainData verifiersChain;\n    StarkExTypes.ApprovalChainData availabilityVerifiersChain;\n\n    /// @notice NO_LONGER_USED: Batch id of last accepted proof\n    uint256 lastBatchId; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Mapping between sub-contract index to sub-contract address\n    mapping(uint256 => address) subContracts; // NOLINT: uninitialized-state.\n\n    /// @notice DEPRECATED: Permissive asset type mapping (no longer in use, remains for backwards compatibility)\n    /// @dev NOLINTNEXTLINE naming-convention\n    mapping(uint256 => bool) permissiveAssetType_DEPRECATED;\n    // ---- END OF MAIN STORAGE AS DEPLOYED IN STARKEX2.0 ----\n\n    /// @notice NO_LONGER_USED: Onchain-data version configured for the system\n    uint256 onchainDataVersion; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice NO_LONGER_USED: Counter of forced action request in block. The key is the block number\n    mapping(uint256 => uint256) forcedRequestsInBlock;\n\n    /// @notice NO_LONGER_USED: ForcedAction requests: actionHash => requestTime\n    mapping(bytes32 => uint256) forcedActionRequests;\n\n    /// @notice NO_LONGER_USED: Mapping for timelocked actions: actionKey => activation time\n    mapping(bytes32 => uint256) actionsTimeLock;\n\n    /// @notice NO_LONGER_USED: Append only list of requested forced action hashes\n    bytes32[] actionHashList;\n\n    // ---- START OF STORAGE CHANGES FOR IMMUTABLE X BRIDGE MIGRATION UPGRADE ----\n\n    /// @notice Address of the zkEVM bridge contract\n    address public zkEVMBridge; // NOLINT: constable-states uninitialized-state.\n    /// @notice Address of the zkEVM vault processor contract\n    address public zkEVMWithdrawalProcessor; // NOLINT: constable-states uninitialized-state.\n    /// @notice Address of the migration initiator\n    address public migrationManager; // NOLINT: constable-states uninitialized-state.\n    /// @notice The vault root sender contract for cross-chain messaging\n    VaultRootSenderAdapter public rootSenderAdapter; // NOLINT: constable-states uninitialized-state.\n\n    /// @notice Reserved storage space for Extensibility\n    /// @dev Every added variable MUST be added above the end gap, and the __endGap size must be reduced accordingly\n    /// @dev NOLINTNEXTLINE: naming-convention\n    uint256[LAYOUT_LENGTH - 41] private __endGap; // __endGap complements layout to LAYOUT_LENGTH.\n}\n"},"src/bridge/starkex/ProxyStorage.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {GovernanceStorage} from \"./GovernanceStorage.sol\";\n\n/*\n * NOTE: This code is imported as is from starkex-contracts repository:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/upgrade/ProxyStorage.sol\n */\n\n/**\n * @title ProxyStorage\n * @notice Contract that holds Proxy-specific state variables\n * @dev This contract is inherited by the GovernanceStorage (and indirectly by MainStorage)\n *      to prevent collision hazard between different storage contracts\n */\ncontract ProxyStorage is GovernanceStorage {\n    /// @notice DEPRECATED: Mapping of addresses to initialization hashes\n    /// @dev NOLINTNEXTLINE: naming-convention uninitialized-state - this is intentional as it's a storage contract\n    mapping(address => bytes32) internal initializationHash_DEPRECATED;\n\n    /// @notice NO_LONGER_USED: Mapping of implementation hashes to their enabled time\n    /// @dev The time after which we can switch to the implementation\n    /// @dev Hash(implementation, data, finalize) => time\n    mapping(bytes32 => uint256) internal enabledTime;\n\n    /// @notice Central storage of flags indicating whether implementations have been initialized\n    /// @dev Can be used flexibly enough to accommodate multiple levels of initialization\n    ///      (i.e. using different key salting schemes for different initialization levels)\n    mapping(bytes32 => bool) internal initialized;\n}\n"},"src/bridge/zkEVM/IRootERC20Bridge.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache 2.0\npragma solidity 0.8.27;\n\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @title Root ERC20 Bridge Interface\n * @notice Defines the key functions of an ERC20 bridge on the root chain, which enables bridging of standard ERC20 tokens, ETH, wETH, IMX and wIMX from the root chain to the child chain and back.\n * @dev Features:\n *     - Maps tokens from the root chain to the child chain.\n *     - Deposits tokens from the root chain to the child chain.\n *     - Deposits native ETH from the root chain to the child chain.\n */\ninterface IRootERC20Bridge {\n    /**\n     * @notice Deposit tokens to the bridge and issue corresponding tokens to `msg.sender` on the child chain.\n     * @custom:requires `rootToken` should already have been mapped with `mapToken()`.\n     * @param rootToken The address of the token on the root chain.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     */\n    function deposit(IERC20Metadata rootToken, uint256 amount) external payable;\n\n    /**\n     * @notice Deposit tokens to the bridge and issue corresponding tokens to `receiver` address on the child chain.\n     * @custom:requires `rootToken` should already have been mapped with `mapToken()`.\n     * @param rootToken The address of the token on the root chain.\n     * @param receiver The address of the receiver on the child chain, to credit tokens to.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     */\n    function depositTo(IERC20Metadata rootToken, address receiver, uint256 amount) external payable;\n\n    /**\n     * @notice Deposit ETH to the bridge and issue corresponding wrapped ETH to `msg.sender` on the child chain.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     * @dev the `msg.value` provided should cover the amount to send as well as the bridge fee.\n     */\n    function depositETH(uint256 amount) external payable;\n    /**\n     * @notice Deposit ETH to the bridge and issue corresponding wrapped ETH to `receiver` address on the child chain.\n     * @param receiver The address of the receiver on the child chain.\n     * @param amount The amount of tokens to deposit.\n     * @dev The function is `payable` because the message passing protocol requires a fee to be paid.\n     * @dev the `msg.value` provided should cover the amount to send as well as the bridge fee.\n     */\n    function depositToETH(address receiver, uint256 amount) external payable;\n}\n"},"src/bridge/starkex/libraries/Common.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\n/*\n * NOTE: This code is imported as is from starkex-contracts repository:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/libraries/Common.sol\n */\n\n/*\n  Common Utility libraries.\n  I. Addresses (extending address).\n*/\nlibrary Addresses {\n    function isContract(address account) internal view returns (bool) {\n        uint256 size;\n        assembly {\n            size := extcodesize(account)\n        }\n        return size > 0;\n    }\n\n    function performEthTransfer(address recipient, uint256 amount) internal {\n        (bool success,) = recipient.call{value: amount}(\"\"); // NOLINT: low-level-calls.\n        require(success, \"ETH_TRANSFER_FAILED\");\n    }\n\n    /*\n      Safe wrapper around ERC20/ERC721 calls.\n      This is required because many deployed ERC20 contracts don't return a value.\n      See https://github.com/ethereum/solidity/issues/4116.\n    */\n    function safeTokenContractCall(address tokenAddress, bytes memory callData) internal {\n        require(isContract(tokenAddress), \"BAD_TOKEN_ADDRESS\");\n        // NOLINTNEXTLINE: low-level-calls.\n        (bool success, bytes memory returndata) = tokenAddress.call(callData);\n        require(success, string(returndata));\n\n        if (returndata.length > 0) {\n            require(abi.decode(returndata, (bool)), \"TOKEN_OPERATION_FAILED\");\n        }\n    }\n\n    /*\n      Validates that the passed contract address is of a real contract,\n      and that its id hash (as infered fromn identify()) matched the expected one.\n    */\n    function validateContractId(address contractAddress, bytes32 expectedIdHash) internal {\n        require(isContract(contractAddress), \"ADDRESS_NOT_CONTRACT\");\n        (bool success, bytes memory returndata) =\n            contractAddress.call( // NOLINT: low-level-calls.\n                abi.encodeWithSignature(\"identify()\")\n            );\n        require(success, \"FAILED_TO_IDENTIFY_CONTRACT\");\n        string memory realContractId = abi.decode(returndata, (string));\n        require(keccak256(abi.encodePacked(realContractId)) == expectedIdHash, \"UNEXPECTED_CONTRACT_IDENTIFIER\");\n    }\n}\n\n/*\n  II. StarkExTypes - Common data types.\n*/\nlibrary StarkExTypes {\n    // Structure representing a list of verifiers (validity/availability).\n    // A statement is valid only if all the verifiers in the list agree on it.\n    // Adding a verifier to the list is immediate - this is used for fast resolution of\n    // any soundness issues.\n    // Removing from the list is time-locked, to ensure that any user of the system\n    // not content with the announced removal has ample time to leave the system before it is\n    // removed.\n    struct ApprovalChainData {\n        address[] list;\n        // Represents the time after which the verifier with the given address can be removed.\n        // Removal of the verifier with address A is allowed only in the case the value\n        // of unlockedForRemovalTime[A] != 0 and unlockedForRemovalTime[A] < (current time).\n        mapping(address => uint256) unlockedForRemovalTime;\n    }\n}\n"},"src/bridge/starkex/GovernanceStorage.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\n/*\n * NOTE: This code is imported as is from starkex-contracts repository:\n * https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/components/GovernanceStorage.sol\n */\n\n/**\n * @notice Struct containing governance information for a specific entity\n * @param effectiveGovernors Mapping of addresses to their governor status\n * @param candidateGovernor Address of the candidate governor waiting to be confirmed\n * @param initialized Flag indicating whether the governance has been initialized\n */\nstruct GovernanceInfoStruct {\n    mapping(address => bool) effectiveGovernors;\n    address candidateGovernor;\n    bool initialized;\n}\n\n/**\n * @title GovernanceStorage\n * @notice Contract that holds governance slots for all entities, including proxy and main contracts\n * @dev This contract provides a centralized storage for governance information across multiple entities\n */\ncontract GovernanceStorage {\n    /// @notice NO_LONGER_USED: Mapping from governor tag to its corresponding GovernanceInfoStruct\n    /// @dev NOLINT uninitialized-state - this is intentional as it's a storage contract\n    mapping(string => GovernanceInfoStruct) internal governanceInfo;\n}\n"},"src/bridge/starkex/StarkExchangeMigration.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {Initializable} from \"@openzeppelin/contracts/proxy/utils/Initializable.sol\";\nimport {IRootERC20Bridge} from \"../zkEVM/IRootERC20Bridge.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport {SafeERC20} from \"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\";\nimport {IStarkExchangeMigration} from \"./IStarkExchangeMigration.sol\";\nimport {VaultRootSenderAdapter} from \"../messaging/VaultRootSenderAdapter.sol\";\nimport {ReentrancyGuard} from \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport {LegacyStarkExchangeBridge} from \"./LegacyStarkExchangeBridge.sol\";\n\n/**\n * @title StarkExchangeMigration\n * @notice This contract facilitates the migration of ETH and ERC-20 assets held by the legacy Immutable X bridge to Immutable zkEVM.\n * @dev The contract performs the following functions, in service of the migration:\n *      1. Sends the proven vault root hash stored in this contract, to a designated contract on Immutable zkEVM. This root is used by the destination contract to facilitate disbursement of funds to the intended recipients.\n *      2. Enables an authorised entity to migrate ERC-20 tokens and ETH held by the StarkExchange bridge to Immutable zkEVM.\n *      3. Enables users who had already initiated a withdrawal from Immutable X, prior to this contract upgrade taking effect, to finalise their pending withdrawal.\n */\ncontract StarkExchangeMigration is IStarkExchangeMigration, LegacyStarkExchangeBridge, Initializable, ReentrancyGuard {\n    using SafeERC20 for IERC20;\n\n    /**\n     * @notice Restrict access only to the migration manager\n     */\n    modifier onlyMigrationManager() {\n        require(msg.sender == migrationManager, UnauthorizedMigrationInitiator());\n        _;\n    }\n\n    /// @dev Reference to native ETH, based on the value used to represent ETH on the zkEVM bridge.\n    address public constant NATIVE_ETH = address(0xeee);\n\n    constructor() {\n        _disableInitializers();\n    }\n\n    /**\n     * @notice Initializes the contract with migration configuration\n     * @param data Encoded initialization data containing addresses\n     * @dev Can only be called once due to initializer modifier\n     * @dev Initializer is called by the proxy during the `upgradeTo()` function call which can only be called by Governance\n     * @dev The hash of the data used to initialize the contract is pre-committed to when the contract upgrade is proposed in the Proxy's timelock upgrade.\n     */\n    function initialize(bytes calldata data) external virtual initializer {\n        (\n            address _migrationManager,\n            address _zkEVMBridge,\n            address _rootSenderAdapter,\n            address _zkEVMWithdrawalProcessor\n        ) = abi.decode(data, (address, address, address, address));\n\n        require(_migrationManager != address(0), InvalidAddress());\n        require(_zkEVMBridge != address(0), InvalidAddress());\n        require(_rootSenderAdapter != address(0), InvalidAddress());\n        require(_zkEVMWithdrawalProcessor != address(0), InvalidAddress());\n\n        migrationManager = _migrationManager;\n        zkEVMBridge = _zkEVMBridge;\n        zkEVMWithdrawalProcessor = _zkEVMWithdrawalProcessor;\n        rootSenderAdapter = VaultRootSenderAdapter(_rootSenderAdapter);\n    }\n\n    /**\n     * @inheritdoc IStarkExchangeMigration\n     * @dev Only the migration manager can call this function\n     * @dev Assumes that the caller is the gas refund receiver, and can receive native asset\n     */\n    function migrateVaultRoot() external payable override nonReentrant onlyMigrationManager {\n        rootSenderAdapter.sendVaultRoot{value: msg.value}(vaultRoot, msg.sender);\n    }\n\n    /**\n     * @inheritdoc IStarkExchangeMigration\n     * @dev Only the migration manager can call this function\n     * @dev Assumes that the caller is the gas refund receiver, and can receive native asset\n     */\n    function migrateHoldings(TokenMigrationDetails[] calldata tokens)\n        external\n        payable\n        override\n        nonReentrant\n        onlyMigrationManager\n    {\n        require(tokens.length > 0, NoMigrationDetails());\n\n        uint256 totalFees = 0;\n        for (uint256 i = 0; i < tokens.length; i++) {\n            (address token, uint256 amount, uint256 fee) = (tokens[i].token, tokens[i].amount, tokens[i].bridgeFee);\n\n            totalFees += fee;\n            require(totalFees <= msg.value, InsufficientBridgeFee());\n\n            if (token == NATIVE_ETH) {\n                _depositETHToZKEVMBridge(amount, fee);\n                emit ETHHoldingsMigration(amount, zkEVMWithdrawalProcessor, msg.sender);\n            } else {\n                _depositERC20ToZKEVMBridge(IERC20Metadata(token), amount, fee);\n                emit ERC20HoldingsMigration(token, amount, zkEVMWithdrawalProcessor, msg.sender);\n            }\n        }\n        require(totalFees == msg.value, ExcessBridgeFeeProvided());\n    }\n    /**\n     * @notice Internal function to deposit ERC20 tokens to the zkEVM bridge\n     * @param token The ERC20 token to deposit\n     * @param amount The amount of tokens to deposit\n     * @dev Validates inputs and transfers tokens to the zkEVM bridge\n     */\n\n    function _depositERC20ToZKEVMBridge(IERC20Metadata token, uint256 amount, uint256 bridgeFee) private {\n        require(address(token) != address(0), InvalidAddress());\n        require(amount > 0, InvalidAmount());\n\n        uint256 balance = token.balanceOf(address(this));\n        require(balance >= amount, AmountExceedsBalance());\n        // Approve the zkEVM bridge to spend the tokens\n        // Using forceApprove to handle tokens that require zero approval first (e.g., USDT)\n        IERC20(address(token)).forceApprove(zkEVMBridge, amount);\n        IRootERC20Bridge(zkEVMBridge).depositTo{value: bridgeFee}(token, zkEVMWithdrawalProcessor, amount);\n    }\n\n    /**\n     * @notice Internal function to deposit ETH to the zkEVM bridge\n     * @param amount The amount of ETH to deposit\n     * @dev Validates inputs and transfers ETH to the zkEVM bridge\n     */\n    function _depositETHToZKEVMBridge(uint256 amount, uint256 bridgeFee) private {\n        require(amount > 0, InvalidAmount());\n\n        uint256 balance = address(this).balance;\n        require(balance >= amount + bridgeFee, AmountExceedsBalance());\n\n        IRootERC20Bridge(zkEVMBridge).depositToETH{value: amount + bridgeFee}(zkEVMWithdrawalProcessor, amount);\n    }\n}\n"},"src/bridge/starkex/IStarkExchangeMigration.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.27;\n\n/**\n * @title IStarkExchangeMigration\n * @notice Defines the interface for migrating holdings from Immutable X to zkEVM\n */\ninterface IStarkExchangeMigration {\n    struct TokenMigrationDetails {\n        address token;\n        uint256 amount;\n        uint256 bridgeFee;\n    }\n\n    /// @notice Thrown when no assets are provided for migration\n    error NoMigrationDetails();\n\n    /// @notice Thrown when a zero address is provided\n    error InvalidAddress();\n\n    /// @notice Thrown when a zero is provided as amount to migrate\n    error InvalidAmount();\n\n    /// @notice Thrown if the bridge does not have sufficient funds of the token to perform the specified migration amount\n    error AmountExceedsBalance();\n\n    /// @notice Thrown when the bridge fee provided is insufficient to cover the cost of bridging the assets to zkEVM\n    error InsufficientBridgeFee();\n\n    /// @notice Thrown when the bridge fee provided exceeds the required amount\n    error ExcessBridgeFeeProvided();\n\n    /// @notice Thrown when an unauthorized account attempts to initiate migration process\n    error UnauthorizedMigrationInitiator();\n\n    /**\n     * @notice Emitted when migration of ERC20 tokens is initiated\n     * @param token The address of the ERC20 token being migrated\n     * @param amount The amount of tokens being migrated\n     * @param recipient The address receiving the migrated tokens\n     * @param initiator The address that initiated the migration\n     */\n    event ERC20HoldingsMigration(\n        address indexed token, uint256 amount, address indexed recipient, address indexed initiator\n    );\n\n    /**\n     * @notice Emitted when ETH holdings migration is initiated\n     * @param amount The amount of ETH being migrated\n     * @param recipient The address receiving the migrated ETH\n     * @param initiator The address that initiated the migration\n     */\n    event ETHHoldingsMigration(uint256 amount, address indexed recipient, address indexed initiator);\n\n    /**\n     * @notice Migrates the bridge's holdings of the specified assets and amounts to zkEVM, by depositing the funds to the zkEVM bridge contract.\n     * @param assets The list of assets to migrate, each containing the token address and amount. ETH is represented by the address(0xeee)\n     * @dev Requires a bridge fee to be sent with this transaction.\n     */\n    function migrateHoldings(TokenMigrationDetails[] calldata assets) external payable;\n\n    /**\n     * @notice Sends the latest vault root data stored in this contract to the configured withdrawal processor contract on zkEVM.\n     * @dev Requires a bridge fee to be sent with the transaction\n     */\n    function migrateVaultRoot() external payable;\n}\n"},"src/bridge/starkex/libraries/EllipticCurve.sol":{"content":"// SPDX-License-Identifier: MIT\n/*\n  MIT License\n  Copyright (c) 2019 Witnet Project\n  https://github.com/witnet/elliptic-curve-solidity/blob/master/contracts/EllipticCurve.sol\n\n  Ported from Solidity >=0.5.3 <0.7.0 to ^0.8.27 for the Immutable X migration contracts.\n  Original source: https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/third_party/EllipticCurve.sol\n*/\npragma solidity ^0.8.27;\n\n/**\n * @title Elliptic Curve Library\n * @dev Library providing arithmetic operations over elliptic curves.\n * @author Witnet Foundation\n */\nlibrary EllipticCurve {\n    uint256 private constant U255_MAX_PLUS_1 =\n        57896044618658097711785492504343953926634992332820282019728792003956564819968;\n\n    /// @dev Modular euclidean inverse of a number (mod p).\n    function invMod(uint256 _x, uint256 _pp) internal pure returns (uint256) {\n        require(_x != 0 && _x != _pp && _pp != 0, \"Invalid number\");\n        uint256 q = 0;\n        uint256 newT = 1;\n        uint256 r = _pp;\n        uint256 t;\n        while (_x != 0) {\n            t = r / _x;\n            (q, newT) = (newT, addmod(q, (_pp - mulmod(t, newT, _pp)), _pp));\n            (r, _x) = (_x, r - t * _x);\n        }\n        return q;\n    }\n\n    /// @dev Modular exponentiation, b^e % _pp.\n    function expMod(uint256 _base, uint256 _exp, uint256 _pp) internal pure returns (uint256) {\n        require(_pp != 0, \"Modulus is zero\");\n        if (_base == 0) return 0;\n        if (_exp == 0) return 1;\n\n        uint256 r = 1;\n        uint256 bit = U255_MAX_PLUS_1;\n        assembly {\n            for {} gt(bit, 0) {} {\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, bit)))), _pp)\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 2))))), _pp)\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 4))))), _pp)\n                r := mulmod(mulmod(r, r, _pp), exp(_base, iszero(iszero(and(_exp, div(bit, 8))))), _pp)\n                bit := div(bit, 16)\n            }\n        }\n        return r;\n    }\n\n    /// @dev Converts a point (x, y, z) expressed in Jacobian coordinates to affine coordinates (x', y', 1).\n    function toAffine(uint256 _x, uint256 _y, uint256 _z, uint256 _pp) internal pure returns (uint256, uint256) {\n        uint256 zInv = invMod(_z, _pp);\n        uint256 zInv2 = mulmod(zInv, zInv, _pp);\n        uint256 x2 = mulmod(_x, zInv2, _pp);\n        uint256 y2 = mulmod(_y, mulmod(zInv, zInv2, _pp), _pp);\n        return (x2, y2);\n    }\n\n    /// @dev Add two points (x1, y1) and (x2, y2) in affine coordinates.\n    function ecAdd(uint256 _x1, uint256 _y1, uint256 _x2, uint256 _y2, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256)\n    {\n        uint256 x = 0;\n        uint256 y = 0;\n        uint256 z = 0;\n        if (_x1 == _x2) {\n            if (addmod(_y1, _y2, _pp) == 0) {\n                return (0, 0);\n            } else {\n                (x, y, z) = jacDouble(_x1, _y1, 1, _aa, _pp);\n            }\n        } else {\n            (x, y, z) = jacAdd(_x1, _y1, 1, _x2, _y2, 1, _pp);\n        }\n        return toAffine(x, y, z, _pp);\n    }\n\n    /// @dev Multiply point (x1, y1, z1) times d in affine coordinates.\n    function ecMul(uint256 _k, uint256 _x, uint256 _y, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256)\n    {\n        (uint256 x1, uint256 y1, uint256 z1) = jacMul(_k, _x, _y, 1, _aa, _pp);\n        return toAffine(x1, y1, z1, _pp);\n    }\n\n    /// @dev Adds two points (x1, y1, z1) and (x2 y2, z2) in Jacobian coordinates.\n    function jacAdd(uint256 _x1, uint256 _y1, uint256 _z1, uint256 _x2, uint256 _y2, uint256 _z2, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256, uint256)\n    {\n        if (_x1 == 0 && _y1 == 0) return (_x2, _y2, _z2);\n        if (_x2 == 0 && _y2 == 0) return (_x1, _y1, _z1);\n\n        uint256[4] memory zs;\n        zs[0] = mulmod(_z1, _z1, _pp);\n        zs[1] = mulmod(_z1, zs[0], _pp);\n        zs[2] = mulmod(_z2, _z2, _pp);\n        zs[3] = mulmod(_z2, zs[2], _pp);\n\n        zs = [mulmod(_x1, zs[2], _pp), mulmod(_y1, zs[3], _pp), mulmod(_x2, zs[0], _pp), mulmod(_y2, zs[1], _pp)];\n\n        require(zs[0] != zs[2] || zs[1] != zs[3], \"Use jacDouble function instead\");\n\n        uint256[4] memory hr;\n        hr[0] = addmod(zs[2], _pp - zs[0], _pp);\n        hr[1] = addmod(zs[3], _pp - zs[1], _pp);\n        hr[2] = mulmod(hr[0], hr[0], _pp);\n        hr[3] = mulmod(hr[2], hr[0], _pp);\n\n        uint256 qx = addmod(mulmod(hr[1], hr[1], _pp), _pp - hr[3], _pp);\n        qx = addmod(qx, _pp - mulmod(2, mulmod(zs[0], hr[2], _pp), _pp), _pp);\n\n        uint256 qy = mulmod(hr[1], addmod(mulmod(zs[0], hr[2], _pp), _pp - qx, _pp), _pp);\n        qy = addmod(qy, _pp - mulmod(zs[1], hr[3], _pp), _pp);\n\n        uint256 qz = mulmod(hr[0], mulmod(_z1, _z2, _pp), _pp);\n        return (qx, qy, qz);\n    }\n\n    /// @dev Doubles a point (x, y, z) in Jacobian coordinates.\n    function jacDouble(uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256, uint256)\n    {\n        if (_z == 0) return (_x, _y, _z);\n\n        uint256 x = mulmod(_x, _x, _pp);\n        uint256 y = mulmod(_y, _y, _pp);\n        uint256 z = mulmod(_z, _z, _pp);\n\n        uint256 s = mulmod(4, mulmod(_x, y, _pp), _pp);\n        uint256 m = addmod(mulmod(3, x, _pp), mulmod(_aa, mulmod(z, z, _pp), _pp), _pp);\n\n        x = addmod(mulmod(m, m, _pp), _pp - addmod(s, s, _pp), _pp);\n        y = addmod(mulmod(m, addmod(s, _pp - x, _pp), _pp), _pp - mulmod(8, mulmod(y, y, _pp), _pp), _pp);\n        z = mulmod(2, mulmod(_y, _z, _pp), _pp);\n\n        return (x, y, z);\n    }\n\n    /// @dev Multiply point (x, y, z) times d in Jacobian coordinates.\n    function jacMul(uint256 _d, uint256 _x, uint256 _y, uint256 _z, uint256 _aa, uint256 _pp)\n        internal\n        pure\n        returns (uint256, uint256, uint256)\n    {\n        if (_d == 0) return (_x, _y, _z);\n\n        uint256 remaining = _d;\n        uint256 qx = 0;\n        uint256 qy = 0;\n        uint256 qz = 1;\n\n        while (remaining != 0) {\n            if ((remaining & 1) != 0) {\n                (qx, qy, qz) = jacAdd(qx, qy, qz, _x, _y, _z, _pp);\n            }\n            remaining = remaining / 2;\n            (_x, _y, _z) = jacDouble(_x, _y, _z, _aa, _pp);\n        }\n        return (qx, qy, qz);\n    }\n}\n"},"src/bridge/messaging/VaultRootSenderAdapter.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.27;\n\nimport {IAxelarGasService} from \"@axelar-gmp-sdk-solidity/interfaces/IAxelarGasService.sol\";\nimport {AxelarExecutable} from \"@axelar-gmp-sdk-solidity/executable/AxelarExecutable.sol\";\nimport {IAxelarGateway} from \"@axelar-gmp-sdk-solidity/interfaces/IAxelarGateway.sol\";\n\n/**\n * @title Vault Root Sender Adapter\n * @notice Sends vault root hashes to a designated vault receiver contract on zkEVM.\n * @dev This contract relies on the Axelar GMP to send the vault root hash across chains.\n * @dev Only the configured vault root sender is authorized to send vault root hashes through this adapter. The sender is the StarkEx bridge contract on Ethereum.\n */\ncontract VaultRootSenderAdapter is AxelarExecutable {\n    /// @notice Thrown when an invalid chain ID is provided for the vault root destination.\n    error InvalidChainId();\n\n    /// @notice Thrown when any entity other than the authorised `vaultRootSender` attempts to send a vault root through this adapter\n    error UnauthorizedRootSender();\n\n    /// @notice Thrown when no destination gas fee is provided for the cross-chain transaction\n    error NoBridgeFee();\n\n    /// @notice Thrown when an invalid vault root (zero value) is provided\n    error InvalidVaultRoot();\n\n    /**\n     * @notice Emitted when a vault root is sent to the destination chain\n     * @param _destinationChain The chain ID of the destination chain\n     * @param _destinationReceiver The address of the vault receiver contract on the destination chain\n     * @param _payload The encoded vault root data being sent\n     */\n    event VaultRootSent(string indexed _destinationChain, string indexed _destinationReceiver, bytes indexed _payload);\n\n    bytes32 public constant SET_VAULT_ROOT = keccak256(\"SET_VAULT_ROOT\");\n\n    /// @notice The StarkEx bridge contract address that is authorized to send vault roots through this adapter\n    address public immutable VAULT_ROOT_SENDER;\n\n    /// @notice The Axelar gas service contract that handles gas payments for cross-chain transactions\n    IAxelarGasService public immutable AXELAR_GAS_SERVICE;\n\n    /// @notice The chain ID to which the vault root will be sent\n    /// @dev This is a string representation of the chain name, as used by Axelar\n    string public rootReceiverChain;\n\n    /// @notice The address of the vault root receiver contract on the destination chain\n    /// @dev This is a string representation of the contract address\n    string public rootReceiver;\n\n    /**\n     * @notice Constructs the VaultRootSender contract\n     * @param _vaultRootSender The address of the StarkEx bridge contract that can send vault roots\n     * @param _rootReceiver The address of the vault receiver contract on the destination zkEVM chain\n     * @param _rootReceiverChain The chain ID of the destination zkEVM chain\n     * @param _axelarGasService The address of the Axelar gas service contract\n     * @param _axelarGateway The address of the Axelar gateway contract\n     */\n    constructor(\n        address _vaultRootSender,\n        string memory _rootReceiver,\n        string memory _rootReceiverChain,\n        address _axelarGasService,\n        address _axelarGateway\n    ) AxelarExecutable(_axelarGateway) {\n        require(bytes(_rootReceiverChain).length > 0, InvalidChainId());\n        require(bytes(_rootReceiver).length > 0, InvalidAddress());\n        require(_vaultRootSender != address(0), InvalidAddress());\n        require(_axelarGasService != address(0), InvalidAddress());\n\n        rootReceiverChain = _rootReceiverChain;\n        rootReceiver = _rootReceiver;\n        VAULT_ROOT_SENDER = _vaultRootSender;\n        AXELAR_GAS_SERVICE = IAxelarGasService(_axelarGasService);\n    }\n\n    /**\n     * @notice Sends a vault root hash to the destination zkEVM chain via Axelar\n     * @dev Only the StarkEx bridge contract can call this function\n     * @dev Requires a bridge fee to be sent with the transaction for gas payment\n     * @param vaultRoot The vault root hash to send\n     * @param gasRefundReceiver The address that will receive any unused destination gas fee\n     */\n    function sendVaultRoot(uint256 vaultRoot, address gasRefundReceiver) external payable {\n        require(msg.sender == VAULT_ROOT_SENDER, UnauthorizedRootSender());\n\n        require(vaultRoot != 0, InvalidVaultRoot());\n        require(gasRefundReceiver != address(0), InvalidAddress());\n        require(msg.value > 0, NoBridgeFee());\n\n        string memory _receiverChain = rootReceiverChain;\n        string memory _receiverAddr = rootReceiver;\n        bytes memory payload = abi.encode(SET_VAULT_ROOT, vaultRoot);\n\n        AXELAR_GAS_SERVICE.payNativeGasForContractCall{value: msg.value}(\n            address(this), _receiverChain, _receiverAddr, payload, gasRefundReceiver\n        );\n\n        IAxelarGateway(gatewayAddress).callContract(_receiverChain, _receiverAddr, payload);\n\n        emit VaultRootSent(_receiverChain, _receiverAddr, payload);\n    }\n\n    function _execute(bytes32, string calldata, string calldata, bytes calldata) internal pure override {\n        revert(\"Not Supported\");\n    }\n}\n"},"src/bridge/starkex/StarkExchangeMigrationV2.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {StarkExchangeMigration} from \"./StarkExchangeMigration.sol\";\n\n/**\n * @title StarkExchangeMigrationV2\n * @notice Upgrades the StarkEx bridge to register Stark key → Ethereum address associations for\n *         holders whose keys are not yet registered on-chain, enabling them to call `withdraw`.\n * @dev VCO tokens were not migrated during the original migration due to a bug in the VCO token's\n *      `approve` method. This contract populates `pendingWithdrawals` and `ethKeys` entries for\n *      the 7 VCO holders during initialization. Holders can then withdraw using the standard\n *      `withdraw(uint256, uint256)` function inherited from LegacyStarkExchangeBridge.\n *      All existing StarkExchangeMigration functionality is preserved.\n */\ncontract StarkExchangeMigrationV2 is StarkExchangeMigration {\n    /// @notice VCO token asset type ID from the StarkEx system\n    uint256 public constant VCO_ASSET_TYPE =\n        1485183671027309009439509871835489442660821279230223034298428454062208985878;\n\n    // -----------------------------------------------------------------------\n    //  VCO holder data: Stark keys, Ethereum addresses, and quantized balances\n    // -----------------------------------------------------------------------\n    uint256 public constant HOLDER_1_KEY = 0x07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753;\n    address public constant HOLDER_1_ETH = 0x5eBb994EBC1c44815FbF2fA61a6E1f8368dcB0C7;\n    uint256 public constant HOLDER_1_AMOUNT = 4900000000000;\n    uint256 public constant HOLDER_2_KEY = 0x01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb0;\n    address public constant HOLDER_2_ETH = 0x216e8577B504aC3dB213eDd261e47fffBb354248;\n    uint256 public constant HOLDER_2_AMOUNT = 125000000000;\n    uint256 public constant HOLDER_3_KEY = 0x052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b434;\n    address public constant HOLDER_3_ETH = 0x10cbBBb225BBEA137aC01F0F6D91CDB126BccaA6;\n    uint256 public constant HOLDER_3_AMOUNT = 7540000000;\n    uint256 public constant HOLDER_4_KEY = 0x07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc;\n    address public constant HOLDER_4_ETH = 0x409F85D2207796b543b8abdB6a0E2490BB1483D1;\n    uint256 public constant HOLDER_4_AMOUNT = 4900000000000;\n    uint256 public constant HOLDER_5_KEY = 0x00b59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e4958;\n    address public constant HOLDER_5_ETH = 0xCE5A537D4dA620DE59efA6F74a0A065732600c71;\n    uint256 public constant HOLDER_5_AMOUNT = 382500000000;\n    uint256 public constant HOLDER_6_KEY = 0x025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca01;\n    address public constant HOLDER_6_ETH = 0x941f54cb53Dc1478Cb126a2Ba8a83b2130419dB5;\n    uint256 public constant HOLDER_6_AMOUNT = 266488641810000000;\n    uint256 public constant HOLDER_7_KEY = 0x01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df2;\n    address public constant HOLDER_7_ETH = 0xBC6EeB5111fEa2B5e9B2Bc534bBcbCa9568999a4;\n    uint256 public constant HOLDER_7_AMOUNT = 235000000000;\n\n    /**\n     * @notice Populates `pendingWithdrawals` with VCO token entries for the 7 holders and registers\n     *         Stark key → Ethereum address associations for holders not yet registered on-chain.\n     * @dev The bytes parameter is unused but required to match the parent function signature for StarkEx proxy compatibility.\n     *      Uses `reinitializer(2)` because the parent's `initialize` used `initializer` (equivalent to\n     *      reinitializer(1)). This ensures the function can only execute once.\n     */\n    function initialize(\n        bytes calldata /* data */\n    )\n        external\n        override\n        reinitializer(2)\n    {\n        // Populate VCO pending withdrawals\n        pendingWithdrawals[HOLDER_1_KEY][VCO_ASSET_TYPE] += HOLDER_1_AMOUNT;\n        pendingWithdrawals[HOLDER_2_KEY][VCO_ASSET_TYPE] += HOLDER_2_AMOUNT;\n        pendingWithdrawals[HOLDER_3_KEY][VCO_ASSET_TYPE] += HOLDER_3_AMOUNT;\n        pendingWithdrawals[HOLDER_4_KEY][VCO_ASSET_TYPE] += HOLDER_4_AMOUNT;\n        pendingWithdrawals[HOLDER_5_KEY][VCO_ASSET_TYPE] += HOLDER_5_AMOUNT;\n        pendingWithdrawals[HOLDER_6_KEY][VCO_ASSET_TYPE] += HOLDER_6_AMOUNT;\n        pendingWithdrawals[HOLDER_7_KEY][VCO_ASSET_TYPE] += HOLDER_7_AMOUNT;\n\n        // Register Stark key → Ethereum address for holders not yet registered on-chain\n        if (ethKeys[HOLDER_1_KEY] == address(0)) ethKeys[HOLDER_1_KEY] = HOLDER_1_ETH;\n        if (ethKeys[HOLDER_2_KEY] == address(0)) ethKeys[HOLDER_2_KEY] = HOLDER_2_ETH;\n        if (ethKeys[HOLDER_3_KEY] == address(0)) ethKeys[HOLDER_3_KEY] = HOLDER_3_ETH;\n        if (ethKeys[HOLDER_4_KEY] == address(0)) ethKeys[HOLDER_4_KEY] = HOLDER_4_ETH;\n        if (ethKeys[HOLDER_5_KEY] == address(0)) ethKeys[HOLDER_5_KEY] = HOLDER_5_ETH;\n        if (ethKeys[HOLDER_6_KEY] == address(0)) ethKeys[HOLDER_6_KEY] = HOLDER_6_ETH;\n        if (ethKeys[HOLDER_7_KEY] == address(0)) ethKeys[HOLDER_7_KEY] = HOLDER_7_ETH;\n    }\n}\n"},"src/bridge/starkex/LegacyStarkExchangeBridge.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\npragma solidity ^0.8.27;\n\nimport {MainStorage} from \"./MainStorage.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {Addresses} from \"./libraries/Common.sol\";\nimport {StarkCurveECDSA} from \"./libraries/StarkCurveECDSA.sol\";\n\n/**\n * @title Legacy StarkExchange Bridge\n * @notice This contract maintains part of the functionality of the old StarkExchange bridge, specifically the finalisation of pending withdrawals.\n */\nabstract contract LegacyStarkExchangeBridge is MainStorage {\n    using Addresses for address;\n    using Addresses for address payable;\n\n    /**\n     * @notice Emitted when a withdrawal of an already pending withdrawal is finalised\n     * @param ownerKey The Stark key of the vault owner\n     * @param assetType The type of asset being withdrawn\n     * @param nonQuantizedAmount The non-quantized amount withdrawn\n     * @param quantizedAmount The quantized amount withdrawn\n     * @param recipient The address receiving the withdrawn funds\n     */\n    event LogWithdrawalPerformed(\n        uint256 ownerKey, uint256 assetType, uint256 nonQuantizedAmount, uint256 quantizedAmount, address recipient\n    );\n\n    /// @notice Version identifier for the contract\n    string public constant VERSION = \"StarkEx-IMX-Migration-1.0.0\";\n\n    /// @dev Mask for extracting address from uint256 (160 bits)\n    uint256 internal constant MASK_ADDRESS = (1 << 160) - 1;\n\n    /// @dev Selector for ERC20 token type\n    bytes4 internal constant ERC20_SELECTOR = bytes4(keccak256(\"ERC20Token(address)\"));\n\n    /// @dev Selector for ETH token type\n    bytes4 internal constant ETH_SELECTOR = bytes4(keccak256(\"ETH()\"));\n\n    /// @dev Offset for selector in asset info\n    uint256 internal constant SELECTOR_OFFSET = 0x20;\n\n    /// @dev Size of selector in bytes\n    uint256 internal constant SELECTOR_SIZE = 4;\n\n    /// @dev Offset for token contract address in asset info\n    uint256 internal constant TOKEN_CONTRACT_ADDRESS_OFFSET = SELECTOR_OFFSET + SELECTOR_SIZE;\n\n    /**\n     * @notice Moves funds from the pending withdrawal account to the owner address\n     * @dev This function can be called by anyone\n     * @dev Can be called normally while frozen\n     * @param ownerKey The Stark key of the owner\n     * @param assetType The asset type to withdraw\n     */\n    function withdraw(uint256 ownerKey, uint256 assetType) external {\n        address payable recipient = payable(strictGetEthKey(ownerKey));\n        require(isFungibleAssetType(assetType), \"NON_FUNGIBLE_ASSET_TYPE\");\n        uint256 assetId = assetType;\n        // Fetch and clear quantized amount.\n        uint256 quantizedAmount = pendingWithdrawals[ownerKey][assetId];\n        require(quantizedAmount > 0, \"NO_PENDING_WITHDRAWAL\");\n        pendingWithdrawals[ownerKey][assetId] = 0;\n\n        // Transfer funds.\n        _transferOut(recipient, assetType, quantizedAmount);\n        emit LogWithdrawalPerformed(\n            ownerKey, assetType, _fromQuantized(assetType, quantizedAmount), quantizedAmount, recipient\n        );\n    }\n\n    /**\n     * @notice Gets the withdrawal balance for a specific owner and asset\n     * @param ownerKey The Stark key of the owner\n     * @param assetId The asset ID to check\n     * @return The withdrawal balance in non-quantized units\n     */\n    function getWithdrawalBalance(uint256 ownerKey, uint256 assetId) external view returns (uint256) {\n        uint256 presumedAssetType = assetId;\n        return _fromQuantized(presumedAssetType, pendingWithdrawals[ownerKey][assetId]);\n    }\n\n    /**\n     * @notice Returns whether the contract is frozen\n     * @return Always returns false as this contract is never frozen\n     */\n    function isFrozen() external pure returns (bool) {\n        return false;\n    }\n\n    /**\n     * @notice Returns the Ethereum public key (address) that owns the given ownerKey\n     * @dev If the ownerKey is registered, the registered key is returned.\n     *      If not, and the size is within the range of an Ethereum address (i.e. < 2**160)\n     *      the owner key itself is returned. Otherwise, the zero address is returned.\n     * @dev Note - prior to version 4.0 this function reverted on an unregistered starkKey.\n     *      For a variant of this function that reverts on an unregistered starkKey, use strictGetEthKey.\n     * @param ownerKey The Stark key to look up\n     * @return The Ethereum address associated with the Stark key\n     */\n    function getEthKey(uint256 ownerKey) public view returns (address) {\n        address registeredEth = ethKeys[ownerKey];\n\n        if (registeredEth != address(0x0)) {\n            return registeredEth;\n        }\n\n        return ownerKey == (ownerKey & MASK_ADDRESS) ? address(uint160(ownerKey)) : address(0x0);\n    }\n\n    /**\n     * @notice Gets the asset info for a given asset type\n     * @param assetType The asset type to get info for\n     * @return assetInfo The asset info bytes\n     * @dev Reverts if the asset type is not registered\n     */\n    function getAssetInfo(uint256 assetType) public view returns (bytes memory assetInfo) {\n        // Verify that the registration is set and valid.\n        require(registeredAssetType[assetType], \"ASSET_TYPE_NOT_REGISTERED\");\n\n        // Retrieve registration.\n        assetInfo = assetTypeToAssetInfo[assetType];\n    }\n\n    /**\n     * @notice Gets the quantum for an asset type\n     * @param presumedAssetType The asset type to get quantum for\n     * @return quantum The quantum value for the asset type\n     * @dev Returns 1 as default quantum for unregistered asset types (e.g., NFTs)\n     */\n    function getQuantum(uint256 presumedAssetType) public view returns (uint256 quantum) {\n        if (!registeredAssetType[presumedAssetType]) {\n            // Default quantization, for NFTs\n            quantum = 1;\n        } else {\n            // Retrieve registration.\n            quantum = assetTypeToQuantum[presumedAssetType];\n        }\n    }\n\n    /**\n     * @notice Transfers funds from the exchange to recipient\n     * @param recipient The address to receive the funds\n     * @param assetType The type of asset to transfer\n     * @param quantizedAmount The quantized amount to transfer\n     * @dev Handles both ERC20 tokens and ETH transfers\n     */\n    function _transferOut(address payable recipient, uint256 assetType, uint256 quantizedAmount) internal {\n        // Make sure we don't accidentally burn funds.\n        require(recipient != address(0x0), \"INVALID_RECIPIENT\");\n        uint256 amount = _fromQuantized(assetType, quantizedAmount);\n        if (isERC20(assetType)) {\n            if (quantizedAmount == 0) return;\n            address tokenAddress = _extractContractAddress(assetType);\n            IERC20 token = IERC20(tokenAddress);\n            uint256 exchangeBalanceBefore = token.balanceOf(address(this));\n            bytes memory callData = abi.encodeWithSelector(token.transfer.selector, recipient, amount);\n            tokenAddress.safeTokenContractCall(callData);\n            uint256 exchangeBalanceAfter = token.balanceOf(address(this));\n            require(exchangeBalanceAfter <= exchangeBalanceBefore, \"UNDERFLOW\");\n            // NOLINTNEXTLINE(incorrect-equality): strict equality needed.\n            require(exchangeBalanceAfter == exchangeBalanceBefore - amount, \"INCORRECT_AMOUNT_TRANSFERRED\");\n        } else if (isEther(assetType)) {\n            if (quantizedAmount == 0) return;\n            recipient.performEthTransfer(amount);\n        } else {\n            revert(\"UNSUPPORTED_TOKEN_TYPE\");\n        }\n    }\n\n    /**\n     * @notice Extracts the contract address from an asset type\n     * @param assetType The asset type to extract address from\n     * @return The contract address\n     */\n    function _extractContractAddress(uint256 assetType) internal view returns (address) {\n        return _extractContractAddressFromAssetInfo(getAssetInfo(assetType));\n    }\n\n    /**\n     * @notice Converts a quantized amount to a non-quantized amount\n     * @param presumedAssetType The asset type for quantization\n     * @param quantizedAmount The quantized amount to convert\n     * @return amount The non-quantized amount\n     * @dev Reverts if dequantization would overflow\n     */\n    function _fromQuantized(uint256 presumedAssetType, uint256 quantizedAmount) internal view returns (uint256 amount) {\n        uint256 quantum = getQuantum(presumedAssetType);\n        amount = quantizedAmount * quantum;\n    }\n\n    /**\n     * @notice Checks if an asset type is fungible\n     * @param assetType The asset type to check\n     * @return True if the asset type is fungible (ETH or ERC20)\n     */\n    function isFungibleAssetType(uint256 assetType) internal view returns (bool) {\n        bytes4 tokenSelector = _extractTokenSelectorFromAssetType(assetType);\n        return tokenSelector == ETH_SELECTOR || tokenSelector == ERC20_SELECTOR;\n    }\n\n    /**\n     * @notice Same as getEthKey, but fails when a stark key is not registered\n     * @param ownerKey The Stark key to look up\n     * @return ethKey The Ethereum address associated with the Stark key\n     * @dev Reverts if the Stark key is not registered\n     */\n    function strictGetEthKey(uint256 ownerKey) internal view returns (address ethKey) {\n        ethKey = getEthKey(ownerKey);\n        require(ethKey != address(0x0), \"USER_UNREGISTERED\");\n    }\n\n    /**\n     * @notice Checks if the message sender is the owner of the given Stark key\n     * @param ownerKey The Stark key to check\n     * @return True if the message sender owns the Stark key\n     */\n    function isMsgSenderKeyOwner(uint256 ownerKey) internal view returns (bool) {\n        return msg.sender == getEthKey(ownerKey);\n    }\n\n    /**\n     * @notice Checks if an asset type represents ETH\n     * @param assetType The asset type to check\n     * @return True if the asset type is ETH\n     */\n    function isEther(uint256 assetType) internal view returns (bool) {\n        return _extractTokenSelectorFromAssetType(assetType) == ETH_SELECTOR;\n    }\n\n    /**\n     * @notice Checks if an asset type represents an ERC20 token\n     * @param assetType The asset type to check\n     * @return True if the asset type is an ERC20 token\n     */\n    function isERC20(uint256 assetType) internal view returns (bool) {\n        return _extractTokenSelectorFromAssetType(assetType) == ERC20_SELECTOR;\n    }\n    /**\n     * @notice Extracts the token selector from an asset type\n     * @param assetType The asset type to extract selector from\n     * @return The token selector\n     */\n\n    function _extractTokenSelectorFromAssetType(uint256 assetType) private view returns (bytes4) {\n        return _extractTokenSelectorFromAssetInfo(getAssetInfo(assetType));\n    }\n\n    /**\n     * @notice Extract the tokenSelector from assetInfo\n     * @dev Works like bytes4 tokenSelector = abi.decode(assetInfo, (bytes4))\n     *      but does not revert when assetInfo.length < SELECTOR_OFFSET\n     * @param assetInfo The asset info bytes to extract selector from\n     * @return selector The extracted token selector\n     */\n    function _extractTokenSelectorFromAssetInfo(bytes memory assetInfo) private pure returns (bytes4 selector) {\n        assembly {\n            selector := and(\n                0xffffffff00000000000000000000000000000000000000000000000000000000,\n                mload(add(assetInfo, SELECTOR_OFFSET))\n            )\n        }\n    }\n\n    /**\n     * @notice Extracts the contract address from asset info\n     * @param assetInfo The asset info bytes\n     * @return The contract address\n     */\n    function _extractContractAddressFromAssetInfo(bytes memory assetInfo) private pure returns (address) {\n        uint256 offset = TOKEN_CONTRACT_ADDRESS_OFFSET;\n        uint256 res;\n        assembly {\n            res := mload(add(assetInfo, offset))\n        }\n        return address(uint160(res));\n    }\n\n    // -----------------------------------------------------------------------\n    //  Stark key registration (ported from original StarkEx Users.sol)\n    // -----------------------------------------------------------------------\n\n    /// @notice Stark-friendly elliptic curve prime field modulus\n    uint256 private constant K_MODULUS = 0x800000000000011000000000000000000000000000000000000000000000001;\n\n    /// @notice Stark curve beta constant\n    uint256 private constant K_BETA = 0x6f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89;\n\n    /// @notice Emitted when a user registers their Stark key to an Ethereum address\n    event LogUserRegistered(address ethKey, uint256 starkKey, address sender);\n\n    /**\n     * @notice Convenience function: registers msg.sender as the Ethereum address for the given Stark key.\n     * @param starkKey The Stark public key (x-coordinate on the Stark curve)\n     * @param starkSignature 96-byte signature: abi.encode(r, s, starkKeyY)\n     */\n    function registerSender(uint256 starkKey, bytes calldata starkSignature) external {\n        registerEthAddress(msg.sender, starkKey, starkSignature);\n    }\n\n    /**\n     * @notice Associates an Ethereum address with a Stark key, verified by a STARK-curve ECDSA signature.\n     * @param ethKey The Ethereum address to associate\n     * @param starkKey The Stark public key (x-coordinate on the Stark curve)\n     * @param starkSignature 96-byte signature: abi.encode(r, s, starkKeyY)\n     * @dev Ported from the original StarkEx Users.sol contract.\n     */\n    function registerEthAddress(address ethKey, uint256 starkKey, bytes calldata starkSignature) public {\n        require(starkKey != 0, \"INVALID_STARK_KEY\");\n        require(starkKey < K_MODULUS, \"INVALID_STARK_KEY\");\n        require(ethKey != address(0), \"INVALID_ETH_ADDRESS\");\n        require(ethKeys[starkKey] == address(0), \"STARK_KEY_UNAVAILABLE\");\n        require(_isOnCurve(starkKey), \"INVALID_STARK_KEY\");\n        require(starkSignature.length == 32 * 3, \"INVALID_STARK_SIGNATURE_LENGTH\");\n\n        bytes memory sig = starkSignature;\n        (uint256 r, uint256 s, uint256 starkKeyY) = abi.decode(sig, (uint256, uint256, uint256));\n\n        uint256 msgHash =\n            uint256(keccak256(abi.encodePacked(\"UserRegistration:\", ethKey, starkKey))) % StarkCurveECDSA.EC_ORDER;\n\n        StarkCurveECDSA.verify(msgHash, r, s, starkKey, starkKeyY);\n\n        ethKeys[starkKey] = ethKey;\n\n        emit LogUserRegistered(ethKey, starkKey, msg.sender);\n    }\n\n    /**\n     * @notice Checks if a Stark key x-coordinate lies on the Stark curve.\n     * @dev Verifies that x^3 + alpha*x + beta is a quadratic residue mod p (alpha = 1).\n     */\n    function _isOnCurve(uint256 starkKey) private view returns (bool) {\n        uint256 xCubed = mulmod(mulmod(starkKey, starkKey, K_MODULUS), starkKey, K_MODULUS);\n        return _isQuadraticResidue(addmod(addmod(xCubed, starkKey, K_MODULUS), K_BETA, K_MODULUS));\n    }\n\n    /**\n     * @notice Checks if a field element is a quadratic residue using Euler's criterion.\n     */\n    function _isQuadraticResidue(uint256 fieldElement) private view returns (bool) {\n        return 1 == _fieldPow(fieldElement, ((K_MODULUS - 1) / 2));\n    }\n\n    /**\n     * @notice Modular exponentiation using the modexp precompile (address 0x05).\n     */\n    function _fieldPow(uint256 base, uint256 exponent) private view returns (uint256) {\n        (bool success, bytes memory returndata) =\n            address(5).staticcall(abi.encode(0x20, 0x20, 0x20, base, exponent, K_MODULUS));\n        require(success, \"FIELD_POW_FAILED\");\n        return abi.decode(returndata, (uint256));\n    }\n}\n"},"src/bridge/starkex/libraries/StarkCurveECDSA.sol":{"content":"// Copyright Immutable Pty Ltd 2018 - 2025\n// SPDX-License-Identifier: Apache-2.0.\n/*\n  Ported from Solidity ^0.6.12 to ^0.8.27 for the Immutable X migration contracts.\n  Original source: https://github.com/starkware-libs/starkex-contracts/blob/f4ed79bb04b56d587618c24312e87d81e4efc56b/scalable-dex/contracts/src/components/ECDSA.sol\n*/\npragma solidity ^0.8.27;\n\nimport {EllipticCurve} from \"./EllipticCurve.sol\";\n\nlibrary StarkCurveECDSA {\n    using EllipticCurve for uint256;\n\n    uint256 internal constant FIELD_PRIME = 0x800000000000011000000000000000000000000000000000000000000000001;\n    uint256 internal constant ALPHA = 1;\n    uint256 internal constant BETA = 3141592653589793238462643383279502884197169399375105820974944592307816406665;\n    uint256 internal constant EC_ORDER = 3618502788666131213697322783095070105526743751716087489154079457884512865583;\n    uint256 internal constant N_ELEMENT_BITS_ECDSA = 251;\n    uint256 internal constant EC_GEN_X = 0x1ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca;\n    uint256 internal constant EC_GEN_Y = 0x5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f;\n\n    function verify(uint256 msgHash, uint256 r, uint256 s, uint256 pubX, uint256 pubY) internal pure {\n        require(msgHash % EC_ORDER == msgHash, \"msgHash out of range\");\n        require((1 <= s) && (s < EC_ORDER), \"s out of range\");\n        uint256 w = s.invMod(EC_ORDER);\n        require((1 <= r) && (r < (1 << N_ELEMENT_BITS_ECDSA)), \"r out of range\");\n        require((1 <= w) && (w < (1 << N_ELEMENT_BITS_ECDSA)), \"w out of range\");\n\n        // Verify that pub is a valid point (y^2 = x^3 + x + BETA).\n        {\n            uint256 x3 = mulmod(mulmod(pubX, pubX, FIELD_PRIME), pubX, FIELD_PRIME);\n            uint256 y2 = mulmod(pubY, pubY, FIELD_PRIME);\n            require(y2 == addmod(addmod(x3, pubX, FIELD_PRIME), BETA, FIELD_PRIME), \"INVALID_STARK_KEY\");\n        }\n\n        // Verify signature.\n        uint256 b_x;\n        uint256 b_y;\n        {\n            (uint256 zG_x, uint256 zG_y) = msgHash.ecMul(EC_GEN_X, EC_GEN_Y, ALPHA, FIELD_PRIME);\n            (uint256 rQ_x, uint256 rQ_y) = r.ecMul(pubX, pubY, ALPHA, FIELD_PRIME);\n            (b_x, b_y) = zG_x.ecAdd(zG_y, rQ_x, rQ_y, ALPHA, FIELD_PRIME);\n        }\n        (uint256 res_x,) = w.ecMul(b_x, b_y, ALPHA, FIELD_PRIME);\n\n        require(res_x == r, \"INVALID_STARK_SIGNATURE\");\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../utils/introspection/IERC165.sol\";\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"./IERC20.sol\";\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @title IERC1363\n * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].\n *\n * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract\n * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.\n */\ninterface IERC1363 is IERC20, IERC165 {\n    /*\n     * Note: the ERC-165 identifier for this interface is 0xb0202a11.\n     * 0xb0202a11 ===\n     *   bytes4(keccak256('transferAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^\n     *   bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256)')) ^\n     *   bytes4(keccak256('approveAndCall(address,uint256,bytes)'))\n     */\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism\n     * and then calls {IERC1363Receiver-onTransferReceived} on `to`.\n     * @param from The address which you want to send tokens from.\n     * @param to The address which you want to transfer to.\n     * @param value The amount of tokens to be transferred.\n     * @param data Additional data with no specified format, sent in call to `to`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.\n     * @param spender The address which will spend the funds.\n     * @param value The amount of tokens to be spent.\n     * @param data Additional data with no specified format, sent in call to `spender`.\n     * @return A boolean value indicating whether the operation succeeded unless throwing.\n     */\n    function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IOwnable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title IOwnable Interface\n * @notice IOwnable is an interface that abstracts the implementation of a\n * contract with ownership control features. It's commonly used in upgradable\n * contracts and includes the functionality to get current owner, transfer\n * ownership, and propose and accept ownership.\n */\ninterface IOwnable {\n    error NotOwner();\n    error InvalidOwner();\n    error InvalidOwnerAddress();\n\n    event OwnershipTransferStarted(address indexed newOwner);\n    event OwnershipTransferred(address indexed newOwner);\n\n    /**\n     * @notice Returns the current owner of the contract.\n     * @return address The address of the current owner\n     */\n    function owner() external view returns (address);\n\n    /**\n     * @notice Returns the address of the pending owner of the contract.\n     * @return address The address of the pending owner\n     */\n    function pendingOwner() external view returns (address);\n\n    /**\n     * @notice Transfers ownership of the contract to a new address\n     * @param newOwner The address to transfer ownership to\n     */\n    function transferOwnership(address newOwner) external;\n\n    /**\n     * @notice Proposes to transfer the contract's ownership to a new address.\n     * The new owner needs to accept the ownership explicitly.\n     * @param newOwner The address to transfer ownership to\n     */\n    function proposeOwnership(address newOwner) external;\n\n    /**\n     * @notice Transfers ownership to the pending owner.\n     * @dev Can only be called by the pending owner\n     */\n    function acceptOwnership() external;\n}\n"},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    uint256 private _status;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        if (_status == ENTERED) {\n            revert ReentrancyGuardReentrantCall();\n        }\n\n        // Any calls to nonReentrant after this point will fail\n        _status = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == ENTERED;\n    }\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IUpgradable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IOwnable } from './IOwnable.sol';\nimport { IImplementation } from './IImplementation.sol';\n\n// General interface for upgradable contracts\ninterface IUpgradable is IOwnable, IImplementation {\n    error InvalidCodeHash();\n    error InvalidImplementation();\n    error SetupFailed();\n\n    event Upgraded(address indexed newImplementation);\n\n    function implementation() external view returns (address);\n\n    function upgrade(\n        address newImplementation,\n        bytes32 newImplementationCodeHash,\n        bytes calldata params\n    ) external;\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/types/GasEstimationTypes.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title GasEstimationType\n * @notice This enum represents the gas estimation types for different chains.\n */\nenum GasEstimationType {\n    Default,\n    OptimismEcotone,\n    OptimismBedrock,\n    Arbitrum,\n    Scroll\n}\n\n/**\n * @title GasInfo\n * @notice This struct represents the gas pricing information for a specific chain.\n * @dev Smaller uint types are used for efficient struct packing to save storage costs.\n */\nstruct GasInfo {\n    /// @dev Custom gas pricing rule, such as L1 data fee on L2s\n    uint64 gasEstimationType;\n    /// @dev Scalar value needed for specific gas estimation types, expected to be less than 1e10\n    uint64 l1FeeScalar;\n    /// @dev Axelar base fee for cross-chain message approval on destination, in terms of source native gas token\n    uint128 axelarBaseFee;\n    /// @dev Gas price of destination chain, in terms of the source chain token, i.e dest_gas_price * dest_token_market_price / src_token_market_price\n    uint128 relativeGasPrice;\n    /// @dev Needed for specific gas estimation types. Blob base fee of destination chain, in terms of the source chain token, i.e dest_blob_base_fee * dest_token_market_price / src_token_market_price\n    uint128 relativeBlobBaseFee;\n    /// @dev Axelar express fee for express execution, in terms of source chain token\n    uint128 expressFee;\n}\n"},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Storage of the initializable contract.\n     *\n     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n     * when using with upgradeable contracts.\n     *\n     * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n     */\n    struct InitializableStorage {\n        /**\n         * @dev Indicates that the contract has been initialized.\n         */\n        uint64 _initialized;\n        /**\n         * @dev Indicates that the contract is in the process of being initialized.\n         */\n        bool _initializing;\n    }\n\n    // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n    /**\n     * @dev The contract is already initialized.\n     */\n    error InvalidInitialization();\n\n    /**\n     * @dev The contract is not initializing.\n     */\n    error NotInitializing();\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint64 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n     * production.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        // Cache values to avoid duplicated sloads\n        bool isTopLevelCall = !$._initializing;\n        uint64 initialized = $._initialized;\n\n        // Allowed calls:\n        // - initialSetup: the contract is not in the initializing state and no previous version was\n        //                 initialized\n        // - construction: the contract is initialized at version 1 (no reinitialization) and the\n        //                 current contract is just being deployed\n        bool initialSetup = initialized == 0 && isTopLevelCall;\n        bool construction = initialized == 1 && address(this).code.length == 0;\n\n        if (!initialSetup && !construction) {\n            revert InvalidInitialization();\n        }\n        $._initialized = 1;\n        if (isTopLevelCall) {\n            $._initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            $._initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint64 version) {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing || $._initialized >= version) {\n            revert InvalidInitialization();\n        }\n        $._initialized = version;\n        $._initializing = true;\n        _;\n        $._initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        _checkInitializing();\n        _;\n    }\n\n    /**\n     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n     */\n    function _checkInitializing() internal view virtual {\n        if (!_isInitializing()) {\n            revert NotInitializing();\n        }\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        // solhint-disable-next-line var-name-mixedcase\n        InitializableStorage storage $ = _getInitializableStorage();\n\n        if ($._initializing) {\n            revert InvalidInitialization();\n        }\n        if ($._initialized != type(uint64).max) {\n            $._initialized = type(uint64).max;\n            emit Initialized(type(uint64).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint64) {\n        return _getInitializableStorage()._initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _getInitializableStorage()._initializing;\n    }\n\n    /**\n     * @dev Pointer to storage slot. Allows integrators to override it with a custom storage location.\n     *\n     * NOTE: Consider following the ERC-7201 formula to derive storage locations.\n     */\n    function _initializableStorageSlot() internal pure virtual returns (bytes32) {\n        return INITIALIZABLE_STORAGE;\n    }\n\n    /**\n     * @dev Returns a pointer to the storage namespace.\n     */\n    // solhint-disable-next-line var-name-mixedcase\n    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n        bytes32 slot = _initializableStorageSlot();\n        assembly {\n            $.slot := slot\n        }\n    }\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @title IAxelarGateway\n * @dev Interface for the Axelar Gateway that supports general message passing and contract call execution.\n */\ninterface IAxelarGateway {\n    /**\n     * @notice Emitted when a contract call is made through the gateway.\n     * @dev Logs the attempt to call a contract on another chain.\n     * @param sender The address of the sender who initiated the contract call.\n     * @param destinationChain The name of the destination chain.\n     * @param destinationContractAddress The address of the contract on the destination chain.\n     * @param payloadHash The keccak256 hash of the sent payload data.\n     * @param payload The payload data used for the contract call.\n     */\n    event ContractCall(\n        address indexed sender,\n        string destinationChain,\n        string destinationContractAddress,\n        bytes32 indexed payloadHash,\n        bytes payload\n    );\n\n    /**\n     * @notice Sends a contract call to another chain.\n     * @dev Initiates a cross-chain contract call through the gateway to the specified destination chain and contract.\n     * @param destinationChain The name of the destination chain.\n     * @param contractAddress The address of the contract on the destination chain.\n     * @param payload The payload data to be used in the contract call.\n     */\n    function callContract(\n        string calldata destinationChain,\n        string calldata contractAddress,\n        bytes calldata payload\n    ) external;\n\n    /**\n     * @notice Checks if a contract call is approved.\n     * @dev Determines whether a given contract call, identified by the commandId and payloadHash, is approved.\n     * @param commandId The identifier of the command to check.\n     * @param sourceChain The name of the source chain.\n     * @param sourceAddress The address of the sender on the source chain.\n     * @param contractAddress The address of the contract where the call will be executed.\n     * @param payloadHash The keccak256 hash of the payload data.\n     * @return True if the contract call is approved, false otherwise.\n     */\n    function isContractCallApproved(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        address contractAddress,\n        bytes32 payloadHash\n    ) external view returns (bool);\n\n    /**\n     * @notice Validates and approves a contract call.\n     * @dev Validates the given contract call information and marks it as approved if valid.\n     * @param commandId The identifier of the command to validate.\n     * @param sourceChain The name of the source chain.\n     * @param sourceAddress The address of the sender on the source chain.\n     * @param payloadHash The keccak256 hash of the payload data.\n     * @return True if the contract call is validated and approved, false otherwise.\n     */\n    function validateContractCall(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes32 payloadHash\n    ) external returns (bool);\n\n    /**\n     * @notice Checks if a command has been executed.\n     * @dev Determines whether a command, identified by the commandId, has been executed.\n     * @param commandId The identifier of the command to check.\n     * @return True if the command has been executed, false otherwise.\n     */\n    function isCommandExecuted(bytes32 commandId) external view returns (bool);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IImplementation.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IContractIdentifier } from './IContractIdentifier.sol';\n\ninterface IImplementation is IContractIdentifier {\n    error NotProxy();\n\n    function setup(bytes calldata data) external;\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\nimport {IERC1363} from \"../../../interfaces/IERC1363.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC-20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    /**\n     * @dev An operation with an ERC-20 token failed.\n     */\n    error SafeERC20FailedOperation(address token);\n\n    /**\n     * @dev Indicates a failed `decreaseAllowance` request.\n     */\n    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);\n\n    /**\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     */\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\n     */\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {\n        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));\n    }\n\n    /**\n     * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.\n     */\n    function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {\n        return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value)));\n    }\n\n    /**\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\n        uint256 oldAllowance = token.allowance(address(this), spender);\n        forceApprove(token, spender, oldAllowance + value);\n    }\n\n    /**\n     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no\n     * value, non-reverting calls are assumed to be successful.\n     *\n     * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the \"client\"\n     * smart contract uses ERC-7674 to set temporary allowances, then the \"client\" smart contract should avoid using\n     * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract\n     * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.\n     */\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {\n        unchecked {\n            uint256 currentAllowance = token.allowance(address(this), spender);\n            if (currentAllowance < requestedDecrease) {\n                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);\n            }\n            forceApprove(token, spender, currentAllowance - requestedDecrease);\n        }\n    }\n\n    /**\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\n     * to be set to zero before setting it to a non-zero value, such as USDT.\n     *\n     * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function\n     * only sets the \"standard\" allowance. Any temporary allowance will remain active, in addition to the value being\n     * set here.\n     */\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\n        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));\n\n        if (!_callOptionalReturnBool(token, approvalCall)) {\n            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));\n            _callOptionalReturn(token, approvalCall);\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            safeTransfer(token, to, value);\n        } else if (!token.transferAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target\n     * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function transferFromAndCallRelaxed(\n        IERC1363 token,\n        address from,\n        address to,\n        uint256 value,\n        bytes memory data\n    ) internal {\n        if (to.code.length == 0) {\n            safeTransferFrom(token, from, to, value);\n        } else if (!token.transferFromAndCall(from, to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no\n     * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when\n     * targeting contracts.\n     *\n     * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.\n     * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}\n     * once without retrying, and relies on the returned value to be true.\n     *\n     * Reverts if the returned value is other than `true`.\n     */\n    function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {\n        if (to.code.length == 0) {\n            forceApprove(token, to, value);\n        } else if (!token.approveAndCall(to, value, data)) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements.\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            // bubble errors\n            if iszero(success) {\n                let ptr := mload(0x40)\n                returndatacopy(ptr, 0, returndatasize())\n                revert(ptr, returndatasize())\n            }\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n\n        if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {\n            revert SafeERC20FailedOperation(address(token));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     *\n     * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead.\n     */\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\n        bool success;\n        uint256 returnSize;\n        uint256 returnValue;\n        assembly (\"memory-safe\") {\n            success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)\n            returnSize := returndatasize()\n            returnValue := mload(0)\n        }\n        return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);\n    }\n}\n"},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[ERC].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IAxelarGateway } from '../interfaces/IAxelarGateway.sol';\nimport { IAxelarExecutable } from '../interfaces/IAxelarExecutable.sol';\n\n/**\n * @title AxelarExecutable\n * @dev Abstract contract to be inherited by contracts that need to execute cross-chain commands via Axelar's Gateway.\n * It implements the IAxelarExecutable interface.\n */\nabstract contract AxelarExecutable is IAxelarExecutable {\n    /// @dev Reference to the Axelar Gateway contract.\n    address internal immutable gatewayAddress;\n\n    /**\n     * @dev Contract constructor that sets the Axelar Gateway address.\n     * Reverts if the provided address is the zero address.\n     * @param gateway_ The address of the Axelar Gateway contract.\n     */\n    constructor(address gateway_) {\n        if (gateway_ == address(0)) revert InvalidAddress();\n\n        gatewayAddress = gateway_;\n    }\n\n    /**\n     * @notice Executes the cross-chain command after validating it with the Axelar Gateway.\n     * @dev This function ensures the call is approved by Axelar Gateway before execution.\n     * It uses a hash of the payload for validation and internally calls _execute for the actual command execution.\n     * Reverts if the validation fails.\n     * @param commandId The unique identifier of the cross-chain message being executed.\n     * @param sourceChain The name of the source chain from which the message originated.\n     * @param sourceAddress The address on the source chain that sent the message.\n     * @param payload The payload of the message payload.\n     */\n    function execute(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes calldata payload\n    ) external virtual {\n        bytes32 payloadHash = keccak256(payload);\n\n        if (!gateway().validateContractCall(commandId, sourceChain, sourceAddress, payloadHash))\n            revert NotApprovedByGateway();\n\n        _execute(commandId, sourceChain, sourceAddress, payload);\n    }\n\n    /**\n     * @dev Internal virtual function to be overridden by child contracts to execute the command.\n     * It allows child contracts to define their custom command execution logic.\n     * @param commandId The identifier of the command to execute.\n     * @param sourceChain The name of the source chain from which the command originated.\n     * @param sourceAddress The address on the source chain that sent the command.\n     * @param payload The payload of the command to be executed.\n     */\n    function _execute(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes calldata payload\n    ) internal virtual;\n\n    /**\n     * @notice Returns the address of the AxelarGateway contract.\n     * @return The Axelar Gateway instance.\n     */\n    function gateway() public view returns (IAxelarGateway) {\n        return IAxelarGateway(gatewayAddress);\n    }\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { IAxelarGateway } from './IAxelarGateway.sol';\n\n/**\n * @title IAxelarExecutable\n * @dev Interface for a contract that is executable by Axelar Gateway's cross-chain message passing.\n * It defines a standard interface to execute commands sent from another chain.\n */\ninterface IAxelarExecutable {\n    /**\n     * @dev Thrown when a function is called with an invalid address.\n     */\n    error InvalidAddress();\n\n    /**\n     * @dev Thrown when the call is not approved by the Axelar Gateway.\n     */\n    error NotApprovedByGateway();\n\n    /**\n     * @notice Returns the address of the AxelarGateway contract.\n     * @return The Axelar Gateway contract associated with this executable contract.\n     */\n    function gateway() external view returns (IAxelarGateway);\n\n    /**\n     * @notice Executes the specified command sent from another chain.\n     * @dev This function is called by the Axelar Gateway to carry out cross-chain commands.\n     * Reverts if the call is not approved by the gateway or other checks fail.\n     * @param commandId The identifier of the command to execute.\n     * @param sourceChain The name of the source chain from where the command originated.\n     * @param sourceAddress The address on the source chain that sent the command.\n     * @param payload The payload of the command to be executed. This typically includes the function selector and encoded arguments.\n     */\n    function execute(\n        bytes32 commandId,\n        string calldata sourceChain,\n        string calldata sourceAddress,\n        bytes calldata payload\n    ) external;\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { GasInfo } from '../types/GasEstimationTypes.sol';\nimport { IInterchainGasEstimation } from './IInterchainGasEstimation.sol';\nimport { IUpgradable } from './IUpgradable.sol';\n\n/**\n * @title IAxelarGasService Interface\n * @notice This is an interface for the AxelarGasService contract which manages gas payments\n * and refunds for cross-chain communication on the Axelar network.\n * @dev This interface inherits IUpgradable\n */\ninterface IAxelarGasService is IInterchainGasEstimation, IUpgradable {\n    error InvalidAddress();\n    error NotCollector();\n    error InvalidAmounts();\n    error InvalidGasUpdates();\n    error InvalidParams();\n    error InsufficientGasPayment(uint256 required, uint256 provided);\n\n    event GasPaidForContractCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasPaidForContractCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForContractCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForContractCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasPaidForExpressCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasPaidForExpressCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForExpressCall(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasPaidForExpressCallWithToken(\n        address indexed sourceAddress,\n        string destinationChain,\n        string destinationAddress,\n        bytes32 indexed payloadHash,\n        string symbol,\n        uint256 amount,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event GasAdded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress);\n\n    event ExpressGasAdded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event NativeExpressGasAdded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        uint256 gasFeeAmount,\n        address refundAddress\n    );\n\n    event Refunded(\n        bytes32 indexed txHash,\n        uint256 indexed logIndex,\n        address payable receiver,\n        address token,\n        uint256 amount\n    );\n\n    /**\n     * @notice Pay for gas for any type of contract execution on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @dev If estimateOnChain is true, the function will estimate the gas cost and revert if the payment is insufficient.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param executionGasLimit The gas limit for the contract call\n     * @param estimateOnChain Flag to enable on-chain gas estimation\n     * @param refundAddress The address where refunds, if any, should be sent\n     * @param params Additional parameters for gas payment. This can be left empty for normal contract call payments.\n     */\n    function payGas(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        uint256 executionGasLimit,\n        bool estimateOnChain,\n        address refundAddress,\n        bytes calldata params\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for a contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForContractCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for a contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForContractCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using native currency for a contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForContractCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using native currency for a contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForContractCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for an express contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to express execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForExpressCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using ERC20 tokens for an express contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to express execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param gasToken The address of the ERC20 token used to pay for gas\n     * @param gasFeeAmount The amount of tokens to pay for gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payGasForExpressCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Pay for gas using native currency for an express contract call on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForExpressCall(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Pay for gas using native currency for an express contract call with tokens on a destination chain.\n     * @dev This function is called on the source chain before calling the gateway to execute a remote contract.\n     * @param sender The address making the payment\n     * @param destinationChain The target chain where the contract call with tokens will be made\n     * @param destinationAddress The target address on the destination chain\n     * @param payload Data payload for the contract call with tokens\n     * @param symbol The symbol of the token to be sent with the call\n     * @param amount The amount of tokens to be sent with the call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function payNativeGasForExpressCallWithToken(\n        address sender,\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        string calldata symbol,\n        uint256 amount,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Add additional gas payment using ERC20 tokens after initiating a cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param gasToken The ERC20 token address used to add gas\n     * @param gasFeeAmount The amount of tokens to add as gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Add additional gas payment using native currency after initiating a cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addNativeGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Add additional gas payment using ERC20 tokens after initiating an express cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param gasToken The ERC20 token address used to add gas\n     * @param gasFeeAmount The amount of tokens to add as gas\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addExpressGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address gasToken,\n        uint256 gasFeeAmount,\n        address refundAddress\n    ) external;\n\n    /**\n     * @notice Add additional gas payment using native currency after initiating an express cross-chain call.\n     * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param refundAddress The address where refunds, if any, should be sent\n     */\n    function addNativeExpressGas(\n        bytes32 txHash,\n        uint256 logIndex,\n        address refundAddress\n    ) external payable;\n\n    /**\n     * @notice Updates the gas price for a specific chain.\n     * @dev This function is called by the gas oracle to update the gas prices for a specific chains.\n     * @param chains Array of chain names\n     * @param gasUpdates Array of gas updates\n     */\n    function updateGasInfo(string[] calldata chains, GasInfo[] calldata gasUpdates) external;\n\n    /**\n     * @notice Allows the gasCollector to collect accumulated fees from the contract.\n     * @dev Use address(0) as the token address for native currency.\n     * @param receiver The address to receive the collected fees\n     * @param tokens Array of token addresses to be collected\n     * @param amounts Array of amounts to be collected for each respective token address\n     */\n    function collectFees(\n        address payable receiver,\n        address[] calldata tokens,\n        uint256[] calldata amounts\n    ) external;\n\n    /**\n     * @notice Refunds gas payment to the receiver in relation to a specific cross-chain transaction.\n     * @dev Only callable by the gasCollector.\n     * @dev Use address(0) as the token address to refund native currency.\n     * @param txHash The transaction hash of the cross-chain call\n     * @param logIndex The log index for the cross-chain call\n     * @param receiver The address to receive the refund\n     * @param token The token address to be refunded\n     * @param amount The amount to refund\n     */\n    function refund(\n        bytes32 txHash,\n        uint256 logIndex,\n        address payable receiver,\n        address token,\n        uint256 amount\n    ) external;\n\n    /**\n     * @notice Returns the address of the designated gas collector.\n     * @return address of the gas collector\n     */\n    function gasCollector() external returns (address);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IContractIdentifier.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n// General interface for upgradable contracts\ninterface IContractIdentifier {\n    /**\n     * @notice Returns the contract ID. It can be used as a check during upgrades.\n     * @dev Meant to be overridden in derived contracts.\n     * @return bytes32 The contract ID\n     */\n    function contractId() external pure returns (bytes32);\n}\n"},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IInterchainGasEstimation.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\nimport { GasEstimationType, GasInfo } from '../types/GasEstimationTypes.sol';\n\n/**\n * @title IInterchainGasEstimation Interface\n * @notice This is an interface for the InterchainGasEstimation contract\n * which allows for estimating gas fees for cross-chain communication on the Axelar network.\n */\ninterface IInterchainGasEstimation {\n    error UnsupportedEstimationType(GasEstimationType gasEstimationType);\n\n    /**\n     * @notice Event emitted when the gas price for a specific chain is updated.\n     * @param chain The name of the chain\n     * @param info The gas info for the chain\n     */\n    event GasInfoUpdated(string chain, GasInfo info);\n\n    /**\n     * @notice Returns the gas price for a specific chain.\n     * @param chain The name of the chain\n     * @return gasInfo The gas info for the chain\n     */\n    function getGasInfo(string calldata chain) external view returns (GasInfo memory);\n\n    /**\n     * @notice Estimates the gas fee for a cross-chain contract call.\n     * @param destinationChain Axelar registered name of the destination chain\n     * @param destinationAddress Destination contract address being called\n     * @param executionGasLimit The gas limit to be used for the destination contract execution,\n     *        e.g. pass in 200k if your app consumes needs upto 200k for this contract call\n     * @param params Additional parameters for the gas estimation\n     * @return gasEstimate The cross-chain gas estimate, in terms of source chain's native gas token that should be forwarded to the gas service.\n     */\n    function estimateGasFee(\n        string calldata destinationChain,\n        string calldata destinationAddress,\n        bytes calldata payload,\n        uint256 executionGasLimit,\n        bytes calldata params\n    ) external view returns (uint256 gasEstimate);\n}\n"},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"}},"language":"Solidity","settings":{"viaIR":true,"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"runs":200,"enabled":false},"evmVersion":"prague","remappings":["@openzeppelin/=lib/openzeppelin-contracts/","@axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/","@src/=src/","axelar-cgp-solidity/=lib/axelar-cgp-solidity/contracts/","axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/","openzeppelin-contracts/=lib/openzeppelin-contracts/"]}},"stdJsonOutput":{"sources":{"src/bridge/starkex/MainStorage.sol":{"id":23},"src/bridge/starkex/ProxyStorage.sol":{"id":24},"src/bridge/zkEVM/IRootERC20Bridge.sol":{"id":30},"src/bridge/starkex/libraries/Common.sol":{"id":27},"src/bridge/starkex/GovernanceStorage.sol":{"id":20},"src/bridge/starkex/StarkExchangeMigration.sol":{"id":25},"src/bridge/starkex/IStarkExchangeMigration.sol":{"id":21},"src/bridge/starkex/libraries/EllipticCurve.sol":{"id":28},"src/bridge/messaging/VaultRootSenderAdapter.sol":{"id":19},"src/bridge/starkex/StarkExchangeMigrationV2.sol":{"id":26},"src/bridge/starkex/LegacyStarkExchangeBridge.sol":{"id":22},"src/bridge/starkex/libraries/StarkCurveECDSA.sol":{"id":29},"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol":{"id":12},"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol":{"id":11},"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"id":14},"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol":{"id":10},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IOwnable.sol":{"id":7},"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol":{"id":17},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IUpgradable.sol":{"id":8},"lib/axelar-gmp-sdk-solidity/contracts/types/GasEstimationTypes.sol":{"id":9},"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol":{"id":13},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol":{"id":3},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IImplementation.sol":{"id":5},"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"id":16},"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol":{"id":18},"lib/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol":{"id":0},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol":{"id":1},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol":{"id":2},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IContractIdentifier.sol":{"id":4},"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IInterchainGasEstimation.sol":{"id":6},"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":15}},"contracts":{"src/bridge/starkex/StarkExchangeMigrationV2.sol":{"StarkExchangeMigrationV2":{"abi":[{"name":"AmountExceedsBalance","type":"error","inputs":[]},{"name":"ExcessBridgeFeeProvided","type":"error","inputs":[]},{"name":"InsufficientBridgeFee","type":"error","inputs":[]},{"name":"InvalidAddress","type":"error","inputs":[]},{"name":"InvalidAmount","type":"error","inputs":[]},{"name":"InvalidInitialization","type":"error","inputs":[]},{"name":"NoMigrationDetails","type":"error","inputs":[]},{"name":"NotInitializing","type":"error","inputs":[]},{"name":"ReentrancyGuardReentrantCall","type":"error","inputs":[]},{"name":"SafeERC20FailedOperation","type":"error","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"name":"UnauthorizedMigrationInitiator","type":"error","inputs":[]},{"name":"ERC20HoldingsMigration","type":"event","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"initiator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"ETHHoldingsMigration","type":"event","inputs":[{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"initiator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"Initialized","type":"event","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"name":"LogUserRegistered","type":"event","inputs":[{"name":"ethKey","type":"address","indexed":false,"internalType":"address"},{"name":"starkKey","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"sender","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"LogWithdrawalPerformed","type":"event","inputs":[{"name":"ownerKey","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"assetType","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"nonQuantizedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"quantizedAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"HOLDER_1_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_1_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_1_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_2_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_2_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_2_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_3_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_3_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_3_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_4_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_4_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_4_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_5_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_5_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_5_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_6_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_6_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_6_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_7_AMOUNT","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"HOLDER_7_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"HOLDER_7_KEY","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"NATIVE_ETH","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"VCO_ASSET_TYPE","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"VERSION","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"getAssetInfo","type":"function","inputs":[{"name":"assetType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"assetInfo","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"name":"getEthKey","type":"function","inputs":[{"name":"ownerKey","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"getQuantum","type":"function","inputs":[{"name":"presumedAssetType","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"quantum","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"getWithdrawalBalance","type":"function","inputs":[{"name":"ownerKey","type":"uint256","internalType":"uint256"},{"name":"assetId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"initialize","type":"function","inputs":[{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"isFrozen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"pure"},{"name":"migrateHoldings","type":"function","inputs":[{"name":"tokens","type":"tuple[]","components":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"bridgeFee","type":"uint256","internalType":"uint256"}],"internalType":"struct IStarkExchangeMigration.TokenMigrationDetails[]"}],"outputs":[],"stateMutability":"payable"},{"name":"migrateVaultRoot","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"migrationManager","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"registerEthAddress","type":"function","inputs":[{"name":"ethKey","type":"address","internalType":"address"},{"name":"starkKey","type":"uint256","internalType":"uint256"},{"name":"starkSignature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"registerSender","type":"function","inputs":[{"name":"starkKey","type":"uint256","internalType":"uint256"},{"name":"starkSignature","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"rootSenderAdapter","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract VaultRootSenderAdapter"}],"stateMutability":"view"},{"name":"vaultRoot","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"withdraw","type":"function","inputs":[{"name":"ownerKey","type":"uint256","internalType":"uint256"},{"name":"assetType","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"zkEVMBridge","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"zkEVMWithdrawalProcessor","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"}],"metadata":"{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"AmountExceedsBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExcessBridgeFeeProvided\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBridgeFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoMigrationDetails\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedMigrationInitiator\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"}],\"name\":\"ERC20HoldingsMigration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"initiator\",\"type\":\"address\"}],\"name\":\"ETHHoldingsMigration\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"ethKey\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"starkKey\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"LogUserRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"ownerKey\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"assetType\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonQuantizedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"quantizedAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"LogWithdrawalPerformed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"HOLDER_1_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_1_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_1_KEY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_2_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_2_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_2_KEY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_3_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_3_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_3_KEY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_4_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_4_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_4_KEY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_5_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_5_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_5_KEY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_6_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_6_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_6_KEY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_7_AMOUNT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_7_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"HOLDER_7_KEY\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_ETH\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VCO_ASSET_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"assetType\",\"type\":\"uint256\"}],\"name\":\"getAssetInfo\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"assetInfo\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ownerKey\",\"type\":\"uint256\"}],\"name\":\"getEthKey\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"presumedAssetType\",\"type\":\"uint256\"}],\"name\":\"getQuantum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"quantum\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ownerKey\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"assetId\",\"type\":\"uint256\"}],\"name\":\"getWithdrawalBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isFrozen\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bridgeFee\",\"type\":\"uint256\"}],\"internalType\":\"struct IStarkExchangeMigration.TokenMigrationDetails[]\",\"name\":\"tokens\",\"type\":\"tuple[]\"}],\"name\":\"migrateHoldings\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrateVaultRoot\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrationManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"ethKey\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"starkKey\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"starkSignature\",\"type\":\"bytes\"}],\"name\":\"registerEthAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"starkKey\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"starkSignature\",\"type\":\"bytes\"}],\"name\":\"registerSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rootSenderAdapter\",\"outputs\":[{\"internalType\":\"contract VaultRootSenderAdapter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vaultRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"ownerKey\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"assetType\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"zkEVMBridge\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"zkEVMWithdrawalProcessor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"VCO tokens were not migrated during the original migration due to a bug in the VCO token's      `approve` method. This contract populates `pendingWithdrawals` and `ethKeys` entries for      the 7 VCO holders during initialization. Holders can then withdraw using the standard      `withdraw(uint256, uint256)` function inherited from LegacyStarkExchangeBridge.      All existing StarkExchangeMigration functionality is preserved.\",\"errors\":{\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"ERC20HoldingsMigration(address,uint256,address,address)\":{\"params\":{\"amount\":\"The amount of tokens being migrated\",\"initiator\":\"The address that initiated the migration\",\"recipient\":\"The address receiving the migrated tokens\",\"token\":\"The address of the ERC20 token being migrated\"}},\"ETHHoldingsMigration(uint256,address,address)\":{\"params\":{\"amount\":\"The amount of ETH being migrated\",\"initiator\":\"The address that initiated the migration\",\"recipient\":\"The address receiving the migrated ETH\"}},\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)\":{\"params\":{\"assetType\":\"The type of asset being withdrawn\",\"nonQuantizedAmount\":\"The non-quantized amount withdrawn\",\"ownerKey\":\"The Stark key of the vault owner\",\"quantizedAmount\":\"The quantized amount withdrawn\",\"recipient\":\"The address receiving the withdrawn funds\"}}},\"kind\":\"dev\",\"methods\":{\"getAssetInfo(uint256)\":{\"details\":\"Reverts if the asset type is not registered\",\"params\":{\"assetType\":\"The asset type to get info for\"},\"returns\":{\"assetInfo\":\"The asset info bytes\"}},\"getEthKey(uint256)\":{\"details\":\"If the ownerKey is registered, the registered key is returned.      If not, and the size is within the range of an Ethereum address (i.e. < 2**160)      the owner key itself is returned. Otherwise, the zero address is returned.Note - prior to version 4.0 this function reverted on an unregistered starkKey.      For a variant of this function that reverts on an unregistered starkKey, use strictGetEthKey.\",\"params\":{\"ownerKey\":\"The Stark key to look up\"},\"returns\":{\"_0\":\"The Ethereum address associated with the Stark key\"}},\"getQuantum(uint256)\":{\"details\":\"Returns 1 as default quantum for unregistered asset types (e.g., NFTs)\",\"params\":{\"presumedAssetType\":\"The asset type to get quantum for\"},\"returns\":{\"quantum\":\"The quantum value for the asset type\"}},\"getWithdrawalBalance(uint256,uint256)\":{\"params\":{\"assetId\":\"The asset ID to check\",\"ownerKey\":\"The Stark key of the owner\"},\"returns\":{\"_0\":\"The withdrawal balance in non-quantized units\"}},\"initialize(bytes)\":{\"details\":\"The bytes parameter is unused but required to match the parent function signature for StarkEx proxy compatibility.      Uses `reinitializer(2)` because the parent's `initialize` used `initializer` (equivalent to      reinitializer(1)). This ensures the function can only execute once.\"},\"isFrozen()\":{\"returns\":{\"_0\":\"Always returns false as this contract is never frozen\"}},\"migrateHoldings((address,uint256,uint256)[])\":{\"details\":\"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset\",\"params\":{\"assets\":\"The list of assets to migrate, each containing the token address and amount. ETH is represented by the address(0xeee)\"}},\"migrateVaultRoot()\":{\"details\":\"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset\"},\"registerEthAddress(address,uint256,bytes)\":{\"details\":\"Ported from the original StarkEx Users.sol contract.\",\"params\":{\"ethKey\":\"The Ethereum address to associate\",\"starkKey\":\"The Stark public key (x-coordinate on the Stark curve)\",\"starkSignature\":\"96-byte signature: abi.encode(r, s, starkKeyY)\"}},\"registerSender(uint256,bytes)\":{\"params\":{\"starkKey\":\"The Stark public key (x-coordinate on the Stark curve)\",\"starkSignature\":\"96-byte signature: abi.encode(r, s, starkKeyY)\"}},\"withdraw(uint256,uint256)\":{\"details\":\"This function can be called by anyoneCan be called normally while frozen\",\"params\":{\"assetType\":\"The asset type to withdraw\",\"ownerKey\":\"The Stark key of the owner\"}}},\"title\":\"StarkExchangeMigrationV2\",\"version\":1},\"userdoc\":{\"errors\":{\"AmountExceedsBalance()\":[{\"notice\":\"Thrown if the bridge does not have sufficient funds of the token to perform the specified migration amount\"}],\"ExcessBridgeFeeProvided()\":[{\"notice\":\"Thrown when the bridge fee provided exceeds the required amount\"}],\"InsufficientBridgeFee()\":[{\"notice\":\"Thrown when the bridge fee provided is insufficient to cover the cost of bridging the assets to zkEVM\"}],\"InvalidAddress()\":[{\"notice\":\"Thrown when a zero address is provided\"}],\"InvalidAmount()\":[{\"notice\":\"Thrown when a zero is provided as amount to migrate\"}],\"NoMigrationDetails()\":[{\"notice\":\"Thrown when no assets are provided for migration\"}],\"UnauthorizedMigrationInitiator()\":[{\"notice\":\"Thrown when an unauthorized account attempts to initiate migration process\"}]},\"events\":{\"ERC20HoldingsMigration(address,uint256,address,address)\":{\"notice\":\"Emitted when migration of ERC20 tokens is initiated\"},\"ETHHoldingsMigration(uint256,address,address)\":{\"notice\":\"Emitted when ETH holdings migration is initiated\"},\"LogUserRegistered(address,uint256,address)\":{\"notice\":\"Emitted when a user registers their Stark key to an Ethereum address\"},\"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)\":{\"notice\":\"Emitted when a withdrawal of an already pending withdrawal is finalised\"}},\"kind\":\"user\",\"methods\":{\"VCO_ASSET_TYPE()\":{\"notice\":\"VCO token asset type ID from the StarkEx system\"},\"VERSION()\":{\"notice\":\"Version identifier for the contract\"},\"getAssetInfo(uint256)\":{\"notice\":\"Gets the asset info for a given asset type\"},\"getEthKey(uint256)\":{\"notice\":\"Returns the Ethereum public key (address) that owns the given ownerKey\"},\"getQuantum(uint256)\":{\"notice\":\"Gets the quantum for an asset type\"},\"getWithdrawalBalance(uint256,uint256)\":{\"notice\":\"Gets the withdrawal balance for a specific owner and asset\"},\"initialize(bytes)\":{\"notice\":\"Populates `pendingWithdrawals` with VCO token entries for the 7 holders and registers         Stark key → Ethereum address associations for holders not yet registered on-chain.\"},\"isFrozen()\":{\"notice\":\"Returns whether the contract is frozen\"},\"migrateHoldings((address,uint256,uint256)[])\":{\"notice\":\"Migrates the bridge's holdings of the specified assets and amounts to zkEVM, by depositing the funds to the zkEVM bridge contract.\"},\"migrateVaultRoot()\":{\"notice\":\"Sends the latest vault root data stored in this contract to the configured withdrawal processor contract on zkEVM.\"},\"migrationManager()\":{\"notice\":\"Address of the migration initiator\"},\"registerEthAddress(address,uint256,bytes)\":{\"notice\":\"Associates an Ethereum address with a Stark key, verified by a STARK-curve ECDSA signature.\"},\"registerSender(uint256,bytes)\":{\"notice\":\"Convenience function: registers msg.sender as the Ethereum address for the given Stark key.\"},\"rootSenderAdapter()\":{\"notice\":\"The vault root sender contract for cross-chain messaging\"},\"vaultRoot()\":{\"notice\":\"Vaults Tree Root\"},\"withdraw(uint256,uint256)\":{\"notice\":\"Moves funds from the pending withdrawal account to the owner address\"},\"zkEVMBridge()\":{\"notice\":\"Address of the zkEVM bridge contract\"},\"zkEVMWithdrawalProcessor()\":{\"notice\":\"Address of the zkEVM vault processor contract\"}},\"notice\":\"Upgrades the StarkEx bridge to register Stark key → Ethereum address associations for         holders whose keys are not yet registered on-chain, enabling them to call `withdraw`.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/bridge/starkex/StarkExchangeMigrationV2.sol\":\"StarkExchangeMigrationV2\"},\"evmVersion\":\"prague\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":@src/=src/\",\":axelar-cgp-solidity/=lib/axelar-cgp-solidity/contracts/\",\":axelar-gmp-sdk-solidity/=lib/axelar-gmp-sdk-solidity/contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\"],\"viaIR\":true},\"sources\":{\"lib/axelar-gmp-sdk-solidity/contracts/executable/AxelarExecutable.sol\":{\"keccak256\":\"0x89078799d3ff3501cb859e3b87c9ac9541dd54bcdeb194b230324a2d74f6a74a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7e24a3b23e54b4fa45e2184da956a04a76b68dbc27b5706f465d8989ecb7109\",\"dweb:/ipfs/QmeFzVaUCYWgHAt9sCF62cUkGpvFfchH3riu7ZQCd5f8RP\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarExecutable.sol\":{\"keccak256\":\"0xc62de7533d4891bfd5bd8792e6638cb1d3ff4389dee2ce1f1dc8de235a057daa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f934a6afcebde328dbf271af65a24370618f173c65f705739fb16e7f99195c15\",\"dweb:/ipfs/QmZ61TPX1wPk3UDhpGxktTdYvgei3kBG1iCMYLt99ANwhN\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol\":{\"keccak256\":\"0x7ad77d3af41f342e9032889a7b5aa224ab0c6dfaf9ce9350fe403d4a596c5eae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc2358f1f1138cd742a7cfdfc83420c488c19c3b3e39d703482e124e453953ee\",\"dweb:/ipfs/QmYki4j2yWrixJVs955DyS1ZmLD5zcxe8ss52w6DLBLRi4\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol\":{\"keccak256\":\"0xbd92798eade563d8a663db59f6f04db5acdee5beda3a6d091e44a7d5c6b2f68e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1519882aed7b6de2ee1e316e5188d2bda1e305fc18a96b3895831f49dc9f90b0\",\"dweb:/ipfs/QmYTLwLGwmDkyX6GSE6PU93TkWP5mFz8qhmFyBrWfj6gaB\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IContractIdentifier.sol\":{\"keccak256\":\"0x21a94655f7f1ed3d7188bd38ce6187892c615b80f9a74e123cbc38113d855a35\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e7e1f30e159d40a9f8431c26955a584507bc23a30f19380c723acdb4182ba7c1\",\"dweb:/ipfs/QmXb965di5pU3m3W36k19ZX8m6qCDaEi1jEt6NocqrGPXj\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IImplementation.sol\":{\"keccak256\":\"0xa7f275514d44bec3ab8ab8c768736329174d7cc6c5cd329c3509a66bce9cd468\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://983e8c97e4916b47244d71fa104fc368100991561fe8c28f1a6bae043763754d\",\"dweb:/ipfs/QmeFeJsCowShVsAe6RMiz3qjY2JTyRNYRRu1oYQcN9T6uV\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IInterchainGasEstimation.sol\":{\"keccak256\":\"0x5463c0d3632e53d3906796d4283a627bd7ebc63d0092685715d98340db9516ff\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9cd73f4b82b70f3e93b23ac591696de14b1cc88e1e60a5f66b1ac8b0e2ecd2ec\",\"dweb:/ipfs/Qmd8psz6tmcmop1iD6fqX8vCRfrkVm7aGMZCXEbsiVjBV8\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IOwnable.sol\":{\"keccak256\":\"0x5cb5691c9293e3011e1b133485411e8933ca1e110f2436a663df12991d134bf7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cdbeb0f7ec37155f976a3bdd9f13055c80f1b2d17043740d387403cb8d65a096\",\"dweb:/ipfs/QmXKLyWetJGgwUuEtexjPxfeZdgUywhrHS4898fQSFkC5y\"]},\"lib/axelar-gmp-sdk-solidity/contracts/interfaces/IUpgradable.sol\":{\"keccak256\":\"0x4e1f84c9711c3c15c77aee5fce8de99fcb49a902c7e6ff24626c924a60b8c22d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2f36d8fb4b365e78663579bfd0d3252a6e290f6dd763d9275f4c6f5f51577d9\",\"dweb:/ipfs/QmZjhnPbjqnRztwbYYs1BdxRbSsAmSLkCfE9SNRk4jMFMe\"]},\"lib/axelar-gmp-sdk-solidity/contracts/types/GasEstimationTypes.sol\":{\"keccak256\":\"0x7da6d20700698dfae8f8252c442e4bebd29030ffcdac4fbbe986f1ddbcb6365c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://992662e49dbc87ab994d8b68c5183dcd5453c71d04f98816b68cb00589938058\",\"dweb:/ipfs/QmYiuEMnYZod1iRTaEcqbJcUp3LwdDPyt2M7KUaqECivau\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0x9b6b3e7803bc5f2f8cd7ad57db8ac1def61a9930a5a3107df4882e028a9605d7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da62d6be1f5c6edf577f0cb45666a8aa9c2086a4bac87d95d65f02e2f4c36a4b\",\"dweb:/ipfs/QmNkpvBpoCMvX8JwAFNSc5XxJ2q5BXJpL5L1txb4QkqVFF\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0xde7e9fd9aee8d4f40772f96bb3b58836cbc6dfc0227014a061947f8821ea9724\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11fea9f8bc98949ac6709f0c1699db7430d2948137aa94d5a9e95a91f61a710a\",\"dweb:/ipfs/QmQdfRXxQjwP6yn3DVo1GHPpriKNcFghSPi94Z1oKEFUNS\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"]},\"lib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x70f2f713b13b7ce4610bcd0ac9fec0f3cc43693b043abcb8dc40a42a726eb330\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c13d13304ac79a83ab1c30168967d19e2203342ebbd6a9bbce4db7550522dcbf\",\"dweb:/ipfs/QmeN5jKMN2vw5bhacr6tkg78afbTTZUeaacNHqjWt4Ew1r\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a\",\"dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x79796192ec90263f21b464d5bc90b777a525971d3de8232be80d9c4f9fb353b8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f6fda447a62815e8064f47eff0dd1cf58d9207ad69b5d32280f8d7ed1d1e4621\",\"dweb:/ipfs/QmfDRc7pxfaXB2Dh9np5Uf29Na3pQ7tafRS684wd3GLjVL\"]},\"src/bridge/messaging/VaultRootSenderAdapter.sol\":{\"keccak256\":\"0xd62dedc49c33a5ae9ce9a8c29b4652a4dd3a94706938d1c84003e1260b1504ab\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://499235db923fbf3a69692c8abb269994802c5dc6ddbe1256cb62df3a9ab048c1\",\"dweb:/ipfs/QmSc6yDZnF6ex6TA4fjaS6ABNuhX714biVqRpf64s9EgGB\"]},\"src/bridge/starkex/GovernanceStorage.sol\":{\"keccak256\":\"0x7cc572e77746cf378cce6ea571ea44c1e07ccf0b2a538f29f3a3b9d15e5ccabf\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://6e9ef1fd6cf1fbbf8ae74b10da670240558cf252d88d077e8d71b8e7398f4b14\",\"dweb:/ipfs/QmPVfndKEW99TDDVRoW7o4QC82My3iG2VfyuCmfLiqFHhq\"]},\"src/bridge/starkex/IStarkExchangeMigration.sol\":{\"keccak256\":\"0xaf8d2807f037b446cdab526412d4dd02c616dd4135ccb5c64c268fcd0b05ed6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://260072e79063ed88e25bbadec7b05f16538318804f27de56368fb851e4285571\",\"dweb:/ipfs/QmeEfRD67mgvLanAZEpsCRPRFWhXJmUPqsokTUAvnECkuy\"]},\"src/bridge/starkex/LegacyStarkExchangeBridge.sol\":{\"keccak256\":\"0x464e545a0e1544d925becdd084f7bde839cf6b3e30bc80361fd3ab46017711ee\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://19aeefba645761b6ddb547844a914a92bbd3a4efff94777eb0ad217dd1343f6e\",\"dweb:/ipfs/QmefHu2Qx3JSN8kLDNsjykQmtRktKu9KC7f7UoagrcvqWK\"]},\"src/bridge/starkex/MainStorage.sol\":{\"keccak256\":\"0xc8c3a12f1411658e08884469f1532e05ce854d822a667c61517ce2ae88f262ae\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://95bb367c297651b8a9555921066bd49a656f22e61de99197f2db4466bfd52725\",\"dweb:/ipfs/QmW97uKEn6ABxArv1vcdpCeJYrt8FQzC9hoSQxChGks682\"]},\"src/bridge/starkex/ProxyStorage.sol\":{\"keccak256\":\"0x6ccf1df534efceda5942c898aa3aeebe8ffbc34ce05ffa944e4060f268fe0aa1\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://1bb4187dc190b1dd6fbd1f2469f1cd2ecc26f156e8c30a71f58fc536e0d312f6\",\"dweb:/ipfs/QmYnxs4tStm6pkV3tPom8Frw6N9DJRnruDdGmpsxRumUHv\"]},\"src/bridge/starkex/StarkExchangeMigration.sol\":{\"keccak256\":\"0x618ce263f2eb9a7bbd7ba3caa7d47585719e398ac434be2eb39e3b7bcb392ba7\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://0af30a566b0afa8dcaf0a55492eb58b7e375423b4d70e293ffd99981c0703427\",\"dweb:/ipfs/QmTzUaTfj6AVxPb2SzxTyS8uQwTU1p2VFtcRre3FBYDQby\"]},\"src/bridge/starkex/StarkExchangeMigrationV2.sol\":{\"keccak256\":\"0xe8b890446e87eea527ad58b5bf310999a957b4fea98d3ca2604aa92c61275ae0\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://f30356cdfc980b1bf9c0f152f79c4222b0156a80a5d0e3dc01fc356a7dba075d\",\"dweb:/ipfs/Qmf3SBBYcnPDmAQnM8GhkAXB6aGKv7amqBLXW5Rs6D4oNP\"]},\"src/bridge/starkex/libraries/Common.sol\":{\"keccak256\":\"0x9a8cf6a0392569b1ac83cf01c65b97620a3eac6a886e4bab79831b3747f7df9b\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://24ed71c1fef447261234f1b62a3b15a9fc0ddbb715a498d12648922cbbac38b7\",\"dweb:/ipfs/QmbocKu8w4xMyANJuZCQZf4Et1U7qn64H3rHX924sxDG7s\"]},\"src/bridge/starkex/libraries/EllipticCurve.sol\":{\"keccak256\":\"0x95029e954a0358fec3a9b83a67cadcf805b10497a57afb088353d40feebbf2a7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df1394afb46c5b9b25b1c3cd533057d86d00cfc426acc41105a6b4475e900ac8\",\"dweb:/ipfs/QmZqEikptNKCvMRGGk5ts1yXYsATbF3saY55wMxHHdHsj2\"]},\"src/bridge/starkex/libraries/StarkCurveECDSA.sol\":{\"keccak256\":\"0x7d54ba02b596dee3a6c7de30949eefc1461762db54214daddb5b7933732c5097\",\"license\":\"Apache-2.0.\",\"urls\":[\"bzz-raw://16fb4c59745e7bb7a158192d84c14c44eeaab8b23926567850bc68905f6f16c1\",\"dweb:/ipfs/QmNeKBWAXHhhVui9RYnk2JXg2SsjSQGSw2KATWNKLgwe8p\"]},\"src/bridge/zkEVM/IRootERC20Bridge.sol\":{\"keccak256\":\"0x8789e115ec3c3655e34b6e907e0a244a60291ec20619fec41371c6c415aaff5d\",\"license\":\"Apache 2.0\",\"urls\":[\"bzz-raw://c463a8b6bbf587b19233e110a626b4018257f8545848df23dd0c57abbcf95821\",\"dweb:/ipfs/QmPY2AL2wgk4joXeeZGryb5JEysjcFeAWban6mbusMB3F5\"]}},\"version\":1}","userdoc":{"kind":"user","errors":{"InvalidAmount()":[{"notice":"Thrown when a zero is provided as amount to migrate"}],"InvalidAddress()":[{"notice":"Thrown when a zero address is provided"}],"NoMigrationDetails()":[{"notice":"Thrown when no assets are provided for migration"}],"AmountExceedsBalance()":[{"notice":"Thrown if the bridge does not have sufficient funds of the token to perform the specified migration amount"}],"InsufficientBridgeFee()":[{"notice":"Thrown when the bridge fee provided is insufficient to cover the cost of bridging the assets to zkEVM"}],"ExcessBridgeFeeProvided()":[{"notice":"Thrown when the bridge fee provided exceeds the required amount"}],"UnauthorizedMigrationInitiator()":[{"notice":"Thrown when an unauthorized account attempts to initiate migration process"}]},"events":{"LogUserRegistered(address,uint256,address)":{"notice":"Emitted when a user registers their Stark key to an Ethereum address"},"ETHHoldingsMigration(uint256,address,address)":{"notice":"Emitted when ETH holdings migration is initiated"},"ERC20HoldingsMigration(address,uint256,address,address)":{"notice":"Emitted when migration of ERC20 tokens is initiated"},"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)":{"notice":"Emitted when a withdrawal of an already pending withdrawal is finalised"}},"notice":"Upgrades the StarkEx bridge to register Stark key → Ethereum address associations for         holders whose keys are not yet registered on-chain, enabling them to call `withdraw`.","methods":{"VERSION()":{"notice":"Version identifier for the contract"},"isFrozen()":{"notice":"Returns whether the contract is frozen"},"vaultRoot()":{"notice":"Vaults Tree Root"},"zkEVMBridge()":{"notice":"Address of the zkEVM bridge contract"},"VCO_ASSET_TYPE()":{"notice":"VCO token asset type ID from the StarkEx system"},"initialize(bytes)":{"notice":"Populates `pendingWithdrawals` with VCO token entries for the 7 holders and registers         Stark key → Ethereum address associations for holders not yet registered on-chain."},"getEthKey(uint256)":{"notice":"Returns the Ethereum public key (address) that owns the given ownerKey"},"migrateVaultRoot()":{"notice":"Sends the latest vault root data stored in this contract to the configured withdrawal processor contract on zkEVM."},"migrationManager()":{"notice":"Address of the migration initiator"},"getQuantum(uint256)":{"notice":"Gets the quantum for an asset type"},"rootSenderAdapter()":{"notice":"The vault root sender contract for cross-chain messaging"},"getAssetInfo(uint256)":{"notice":"Gets the asset info for a given asset type"},"withdraw(uint256,uint256)":{"notice":"Moves funds from the pending withdrawal account to the owner address"},"zkEVMWithdrawalProcessor()":{"notice":"Address of the zkEVM vault processor contract"},"registerSender(uint256,bytes)":{"notice":"Convenience function: registers msg.sender as the Ethereum address for the given Stark key."},"getWithdrawalBalance(uint256,uint256)":{"notice":"Gets the withdrawal balance for a specific owner and asset"},"registerEthAddress(address,uint256,bytes)":{"notice":"Associates an Ethereum address with a Stark key, verified by a STARK-curve ECDSA signature."},"migrateHoldings((address,uint256,uint256)[])":{"notice":"Migrates the bridge's holdings of the specified assets and amounts to zkEVM, by depositing the funds to the zkEVM bridge contract."}},"version":1},"devdoc":{"kind":"dev","title":"StarkExchangeMigrationV2","errors":{"NotInitializing()":[{"details":"The contract is not initializing."}],"InvalidInitialization()":[{"details":"The contract is already initialized."}],"ReentrancyGuardReentrantCall()":[{"details":"Unauthorized reentrant call."}],"SafeERC20FailedOperation(address)":[{"details":"An operation with an ERC-20 token failed."}]},"events":{"Initialized(uint64)":{"details":"Triggered when the contract has been initialized or reinitialized."},"ETHHoldingsMigration(uint256,address,address)":{"params":{"amount":"The amount of ETH being migrated","initiator":"The address that initiated the migration","recipient":"The address receiving the migrated ETH"}},"ERC20HoldingsMigration(address,uint256,address,address)":{"params":{"token":"The address of the ERC20 token being migrated","amount":"The amount of tokens being migrated","initiator":"The address that initiated the migration","recipient":"The address receiving the migrated tokens"}},"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)":{"params":{"ownerKey":"The Stark key of the vault owner","assetType":"The type of asset being withdrawn","recipient":"The address receiving the withdrawn funds","quantizedAmount":"The quantized amount withdrawn","nonQuantizedAmount":"The non-quantized amount withdrawn"}}},"details":"VCO tokens were not migrated during the original migration due to a bug in the VCO token's      `approve` method. This contract populates `pendingWithdrawals` and `ethKeys` entries for      the 7 VCO holders during initialization. Holders can then withdraw using the standard      `withdraw(uint256, uint256)` function inherited from LegacyStarkExchangeBridge.      All existing StarkExchangeMigration functionality is preserved.","methods":{"isFrozen()":{"returns":{"_0":"Always returns false as this contract is never frozen"}},"initialize(bytes)":{"details":"The bytes parameter is unused but required to match the parent function signature for StarkEx proxy compatibility.      Uses `reinitializer(2)` because the parent's `initialize` used `initializer` (equivalent to      reinitializer(1)). This ensures the function can only execute once."},"getEthKey(uint256)":{"params":{"ownerKey":"The Stark key to look up"},"details":"If the ownerKey is registered, the registered key is returned.      If not, and the size is within the range of an Ethereum address (i.e. < 2**160)      the owner key itself is returned. Otherwise, the zero address is returned.Note - prior to version 4.0 this function reverted on an unregistered starkKey.      For a variant of this function that reverts on an unregistered starkKey, use strictGetEthKey.","returns":{"_0":"The Ethereum address associated with the Stark key"}},"migrateVaultRoot()":{"details":"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset"},"getQuantum(uint256)":{"params":{"presumedAssetType":"The asset type to get quantum for"},"details":"Returns 1 as default quantum for unregistered asset types (e.g., NFTs)","returns":{"quantum":"The quantum value for the asset type"}},"getAssetInfo(uint256)":{"params":{"assetType":"The asset type to get info for"},"details":"Reverts if the asset type is not registered","returns":{"assetInfo":"The asset info bytes"}},"withdraw(uint256,uint256)":{"params":{"ownerKey":"The Stark key of the owner","assetType":"The asset type to withdraw"},"details":"This function can be called by anyoneCan be called normally while frozen"},"registerSender(uint256,bytes)":{"params":{"starkKey":"The Stark public key (x-coordinate on the Stark curve)","starkSignature":"96-byte signature: abi.encode(r, s, starkKeyY)"}},"getWithdrawalBalance(uint256,uint256)":{"params":{"assetId":"The asset ID to check","ownerKey":"The Stark key of the owner"},"returns":{"_0":"The withdrawal balance in non-quantized units"}},"registerEthAddress(address,uint256,bytes)":{"params":{"ethKey":"The Ethereum address to associate","starkKey":"The Stark public key (x-coordinate on the Stark curve)","starkSignature":"96-byte signature: abi.encode(r, s, starkKeyY)"},"details":"Ported from the original StarkEx Users.sol contract."},"migrateHoldings((address,uint256,uint256)[])":{"params":{"assets":"The list of assets to migrate, each containing the token address and amount. ETH is represented by the address(0xeee)"},"details":"Only the migration manager can call this functionAssumes that the caller is the gas refund receiver, and can receive native asset"}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_bytes32":{"label":"bytes32","encoding":"inplace","numberOfBytes":"32"},"t_uint256":{"label":"uint256","encoding":"inplace","numberOfBytes":"32"},"t_bytes_storage":{"label":"bytes","encoding":"bytes","numberOfBytes":"32"},"t_string_memory_ptr":{"label":"string","encoding":"bytes","numberOfBytes":"32"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_bool)":{"key":"t_bytes32","label":"mapping(bytes32 => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_bool)":{"key":"t_uint256","label":"mapping(uint256 => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"},"t_array(t_address)dyn_storage":{"base":"t_address","label":"address[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_array(t_bytes32)dyn_storage":{"base":"t_bytes32","label":"bytes32[]","encoding":"dynamic_array","numberOfBytes":"32"},"t_mapping(t_address,t_bytes32)":{"key":"t_address","label":"mapping(address => bytes32)","value":"t_bytes32","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_address,t_uint256)":{"key":"t_address","label":"mapping(address => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_bytes32,t_uint256)":{"key":"t_bytes32","label":"mapping(bytes32 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_address)":{"key":"t_uint256","label":"mapping(uint256 => address)","value":"t_address","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_uint256)":{"key":"t_uint256","label":"mapping(uint256 => uint256)","value":"t_uint256","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_bytes_storage)":{"key":"t_uint256","label":"mapping(uint256 => bytes)","value":"t_bytes_storage","encoding":"mapping","numberOfBytes":"32"},"t_contract(VaultRootSenderAdapter)2097":{"label":"contract VaultRootSenderAdapter","encoding":"inplace","numberOfBytes":"20"},"t_struct(ApprovalChainData)4037_storage":{"label":"struct StarkExTypes.ApprovalChainData","members":[{"slot":"0","type":"t_array(t_address)dyn_storage","astId":4032,"label":"list","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_mapping(t_address,t_uint256)","astId":4036,"label":"unlockedForRemovalTime","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"}],"encoding":"inplace","numberOfBytes":"64"},"t_struct(GovernanceInfoStruct)2109_storage":{"label":"struct GovernanceInfoStruct","members":[{"slot":"0","type":"t_mapping(t_address,t_bool)","astId":2104,"label":"effectiveGovernors","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_address","astId":2106,"label":"candidateGovernor","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_bool","astId":2108,"label":"initialized","offset":20,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"}],"encoding":"inplace","numberOfBytes":"64"},"t_array(t_uint256)18446744073709551575_storage":{"base":"t_uint256","label":"uint256[18446744073709551575]","encoding":"inplace","numberOfBytes":"590295810358705650400"},"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))":{"key":"t_uint256","label":"mapping(uint256 => mapping(uint256 => uint256))","value":"t_mapping(t_uint256,t_uint256)","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_uint256,t_uint256)))":{"key":"t_uint256","label":"mapping(uint256 => mapping(uint256 => mapping(uint256 => uint256)))","value":"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))","encoding":"mapping","numberOfBytes":"32"},"t_mapping(t_string_memory_ptr,t_struct(GovernanceInfoStruct)2109_storage)":{"key":"t_string_memory_ptr","label":"mapping(string => struct GovernanceInfoStruct)","value":"t_struct(GovernanceInfoStruct)2109_storage","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_mapping(t_string_memory_ptr,t_struct(GovernanceInfoStruct)2109_storage)","astId":2116,"label":"governanceInfo","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"1","type":"t_mapping(t_address,t_bytes32)","astId":3214,"label":"initializationHash_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"2","type":"t_mapping(t_bytes32,t_uint256)","astId":3219,"label":"enabledTime","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"3","type":"t_mapping(t_bytes32,t_bool)","astId":3224,"label":"initialized","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"4","type":"t_address","astId":3038,"label":"escapeVerifierAddress","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"4","type":"t_bool","astId":3041,"label":"stateFrozen","offset":20,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"5","type":"t_uint256","astId":3044,"label":"unFreezeTime","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"6","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_uint256,t_uint256)))","astId":3053,"label":"pendingDeposits","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"7","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_mapping(t_uint256,t_uint256)))","astId":3062,"label":"cancellationRequests","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"8","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))","astId":3069,"label":"pendingWithdrawals","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"9","type":"t_mapping(t_uint256,t_bool)","astId":3074,"label":"escapesUsed","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"10","type":"t_uint256","astId":3077,"label":"escapesUsedCount","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"11","type":"t_mapping(t_uint256,t_mapping(t_uint256,t_uint256))","astId":3084,"label":"fullWithdrawalRequests_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"12","type":"t_uint256","astId":3087,"label":"sequenceNumber","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"13","type":"t_uint256","astId":3090,"label":"vaultRoot","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"14","type":"t_uint256","astId":3093,"label":"vaultTreeHeight","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"15","type":"t_uint256","astId":3096,"label":"orderRoot","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"16","type":"t_uint256","astId":3099,"label":"orderTreeHeight","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"17","type":"t_mapping(t_address,t_bool)","astId":3104,"label":"tokenAdmins","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"18","type":"t_mapping(t_address,t_bool)","astId":3109,"label":"userAdmins_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"19","type":"t_mapping(t_address,t_bool)","astId":3114,"label":"operators","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"20","type":"t_mapping(t_uint256,t_bytes_storage)","astId":3119,"label":"assetTypeToAssetInfo","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"21","type":"t_mapping(t_uint256,t_bool)","astId":3124,"label":"registeredAssetType","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"22","type":"t_mapping(t_uint256,t_uint256)","astId":3129,"label":"assetTypeToQuantum","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"23","type":"t_mapping(t_address,t_uint256)","astId":3134,"label":"starkKeys_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"24","type":"t_mapping(t_uint256,t_address)","astId":3139,"label":"ethKeys","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"25","type":"t_struct(ApprovalChainData)4037_storage","astId":3143,"label":"verifiersChain","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"27","type":"t_struct(ApprovalChainData)4037_storage","astId":3146,"label":"availabilityVerifiersChain","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"29","type":"t_uint256","astId":3149,"label":"lastBatchId","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"30","type":"t_mapping(t_uint256,t_address)","astId":3154,"label":"subContracts","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"31","type":"t_mapping(t_uint256,t_bool)","astId":3159,"label":"permissiveAssetType_DEPRECATED","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"32","type":"t_uint256","astId":3162,"label":"onchainDataVersion","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"33","type":"t_mapping(t_uint256,t_uint256)","astId":3167,"label":"forcedRequestsInBlock","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"34","type":"t_mapping(t_bytes32,t_uint256)","astId":3172,"label":"forcedActionRequests","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"35","type":"t_mapping(t_bytes32,t_uint256)","astId":3177,"label":"actionsTimeLock","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"36","type":"t_array(t_bytes32)dyn_storage","astId":3181,"label":"actionHashList","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"37","type":"t_address","astId":3184,"label":"zkEVMBridge","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"38","type":"t_address","astId":3187,"label":"zkEVMWithdrawalProcessor","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"39","type":"t_address","astId":3190,"label":"migrationManager","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"40","type":"t_contract(VaultRootSenderAdapter)2097","astId":3194,"label":"rootSenderAdapter","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"41","type":"t_array(t_uint256)18446744073709551575_storage","astId":3201,"label":"__endGap","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"},{"slot":"18446744073709551616","type":"t_uint256","astId":1784,"label":"_status","offset":0,"contract":"src/bridge/starkex/StarkExchangeMigrationV2.sol:StarkExchangeMigrationV2"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"60806040523461002757610011610036565b61001961002c565b615a6661030e8239615a6690f35b610032565b60405190565b5f80fd5b61003e610040565b565b6100486100de565b6100506101e4565b565b90565b90565b90565b61006f61006a61007492610052565b610058565b610055565b90565b610081600161005b565b90565b5f1b90565b906100955f1991610084565b9181191691161790565b6100b36100ae6100b892610055565b610058565b610055565b90565b90565b906100d36100ce6100da9261009f565b6100bb565b8254610089565b9055565b6100f86100e9610077565b680100000000000000006100be565b565b60401c90565b60ff1690565b610112610117916100fa565b610100565b90565b6101249054610106565b90565b5f0190565b5f1c90565b60018060401b031690565b61014861014d9161012c565b610131565b90565b61015a905461013c565b90565b60018060401b031690565b9061017960018060401b0391610084565b9181191691161790565b61019761019261019c9261015d565b610058565b61015d565b90565b90565b906101b76101b26101be92610183565b61019f565b8254610168565b9055565b6101cb9061015d565b9052565b91906101e2905f602085019401906101c2565b565b6101ec61029c565b6101f75f820161011a565b610280576102065f8201610150565b61021e61021860018060401b0361015d565b9161015d565b03610227575b50565b61023a905f60018060401b0391016101a2565b60018060401b036102777fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29161026e61002c565b918291826101cf565b0390a15f610224565b5f63f92ee8a960e01b81528061029860048201610127565b0390fd5b6102a46102f9565b90565b5f90565b90565b90565b6102c56102c06102ca926102ab565b610084565b6102ae565b90565b6102f67ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006102b1565b90565b6103016102a7565b5061030a6102cd565b9056fe60806040526004361015610013575b6115e9565b61001d5f3561029c565b8063011e1167146102975780631710abaa14610292578063187ac4cb1461028d5780631dbd1da7146102885780631f0e8a12146102835780631f7daf0f1461027e57806330eff5dd1461027957806333eeb1471461027457806334759ca71461026f578063429a82081461026a578063439fab9114610265578063441a3e701461026057806346a577ed1461025b5780634780404d1461025657806354f3ea7f14610251578063556cf28b1461024c578063582b9044146102475780635837397114610242578063701f9fae1461023d5780637feaf0571461023857806386aeb4451461023357806387ec36e31461022e578063988760b0146102295780639a0fa042146102245780639cec9aaa1461021f578063b8ad077d1461021a578063b937f8f714610215578063bea8418714610210578063ccefe7b01461020b578063dd7202d814610206578063e2d8efd014610201578063e6fb8119146101fc578063e8a91f30146101f7578063e9f5a4a8146101f2578063ec3161b0146101ed578063ed3914d4146101e8578063ee4d01bf146101e3578063f405f17a146101de578063f637d950146101d95763ffa1ad740361000e576115b4565b61143c565b61139c565b61134a565b6112da565b611268565b611233565b6111ef565b611197565b61113f565b6110b4565b61107f565b610ff2565b610f48565b610edb565b610e83565b610df8565b610da0565b610d3c565b610d08565b610c8d565b610c54565b610baa565b610b52565b610ae2565b610a57565b61098c565b610919565b610890565b61082f565b610774565b610704565b610679565b61061d565b610592565b61053a565b6104e2565b610468565b6103ef565b61033f565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f9103126102ba57565b6102ac565b90565b60018060a01b031690565b90565b6102e46102df6102e9926102bf565b6102cd565b6102c2565b90565b6102f5906102d0565b90565b610303610eee6102ec565b90565b61030e6102f8565b90565b61031a906102c2565b90565b61032690610311565b9052565b919061033d905f6020850194019061031d565b565b3461036f5761034f3660046102b0565b61036b61035a610306565b6103626102a2565b9182918261032a565b0390f35b6102a8565b90565b90565b61038e61038961039392610374565b6102cd565b610377565b90565b6103bf7f01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb061037a565b90565b6103ca610396565b90565b6103d690610377565b9052565b91906103ed905f602085019401906103cd565b565b3461041f576103ff3660046102b0565b61041b61040a6103c2565b6104126102a2565b918291826103da565b0390f35b6102a8565b1c90565b60018060a01b031690565b6104439060086104489302610424565b610428565b90565b906104569154610433565b90565b61046560275f9061044b565b90565b34610498576104783660046102b0565b610494610483610459565b61048b6102a2565b9182918261032a565b0390f35b6102a8565b5f80fd5b6104aa81610377565b036104b157565b5f80fd5b905035906104c2826104a1565b565b906020828203126104dd576104da915f016104b5565b90565b6102ac565b346105125761050e6104fd6104f83660046104c4565b6116c1565b6105056102a2565b9182918261032a565b0390f35b6102a8565b73ce5a537d4da620de59efa6f74a0a065732600c7190565b610537610517565b90565b3461056a5761054a3660046102b0565b61056661055561052f565b61055d6102a2565b9182918261032a565b0390f35b6102a8565b73941f54cb53dc1478cb126a2ba8a83b2130419db590565b61058f61056f565b90565b346105c2576105a23660046102b0565b6105be6105ad610587565b6105b56102a2565b9182918261032a565b0390f35b6102a8565b90565b6105de6105d96105e3926105c7565b6102cd565b610377565b90565b61060f7f01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df26105ca565b90565b61061a6105e6565b90565b3461064d5761062d3660046102b0565b610649610638610612565b6106406102a2565b918291826103da565b0390f35b6102a8565b151590565b61066090610652565b9052565b9190610677905f60208501940190610657565b565b346106a9576106893660046102b0565b6106a561069461174f565b61069c6102a2565b91829182610664565b0390f35b6102a8565b90565b6106c56106c06106ca926106ae565b6102cd565b610377565b90565b6106f67f0348958c1322d3fc34f89b91b0b6473594725847184ee590e990bb70ef322b166106b1565b90565b6107016106cd565b90565b34610734576107143660046102b0565b61073061071f6106f9565b6107276102a2565b918291826103da565b0390f35b6102a8565b90565b61075061074b61075592610739565b6102cd565b610377565b90565b6107666401c16b450061073c565b90565b610771610758565b90565b346107a4576107843660046102b0565b6107a061078f610769565b6107976102a2565b918291826103da565b0390f35b6102a8565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156107ef5781359167ffffffffffffffff83116107ea5760200192600183028401116107e557565b6107b1565b6107ad565b6107a9565b90602082820312610825575f82013567ffffffffffffffff81116108205761081c92016107b5565b9091565b61049d565b6102ac565b5f0190565b3461085e576108486108423660046107f4565b90611f42565b6108506102a2565b8061085a8161082a565b0390f35b6102a8565b919060408382031261088b578061087f610888925f86016104b5565b936020016104b5565b90565b6102ac565b346108bf576108a96108a3366004610863565b906120ec565b6108b16102a2565b806108bb8161082a565b0390f35b6102a8565b90565b6108db6108d66108e0926108c4565b6102cd565b610377565b90565b61090b7eb59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e49586108c7565b90565b6109166108e3565b90565b34610949576109293660046102b0565b61094561093461090e565b61093c6102a2565b918291826103da565b0390f35b6102a8565b90565b61096561096061096a9261094e565b6102cd565b610377565b90565b61097e6703b2c201ffc2e880610951565b90565b61098961096d565b90565b346109bc5761099c3660046102b0565b6109b86109a7610981565b6109af6102a2565b918291826103da565b0390f35b6102a8565b60018060a01b031690565b6109dc9060086109e19302610424565b6109c1565b90565b906109ef91546109cc565b90565b6109fe60285f906109e4565b90565b610a15610a10610a1a926102c2565b6102cd565b6102c2565b90565b610a2690610a01565b90565b610a3290610a1d565b90565b610a3e90610a29565b9052565b9190610a55905f60208501940190610a35565b565b34610a8757610a673660046102b0565b610a83610a726109f2565b610a7a6102a2565b91829182610a42565b0390f35b6102a8565b90565b610aa3610a9e610aa892610a8c565b6102cd565b610377565b90565b610ad47f07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753610a8f565b90565b610adf610aab565b90565b34610b1257610af23660046102b0565b610b0e610afd610ad7565b610b056102a2565b918291826103da565b0390f35b6102a8565b90565b610b2e610b29610b3392610b17565b6102cd565b610377565b90565b610b44641d1a94a200610b1a565b90565b610b4f610b36565b90565b34610b8257610b623660046102b0565b610b7e610b6d610b47565b610b756102a2565b918291826103da565b0390f35b6102a8565b73216e8577b504ac3db213edd261e47fffbb35424890565b610ba7610b87565b90565b34610bda57610bba3660046102b0565b610bd6610bc5610b9f565b610bcd6102a2565b9182918261032a565b0390f35b6102a8565b909182601f83011215610c195781359167ffffffffffffffff8311610c14576020019260608302840111610c0f57565b6107b1565b6107ad565b6107a9565b90602082820312610c4f575f82013567ffffffffffffffff8111610c4a57610c469201610bdf565b9091565b61049d565b6102ac565b610c68610c62366004610c1e565b90612509565b610c706102a2565b80610c7a8161082a565b0390f35b610c8a60255f9061044b565b90565b34610cbd57610c9d3660046102b0565b610cb9610ca8610c7e565b610cb06102a2565b9182918261032a565b0390f35b6102a8565b919091604081840312610d0357610cdb835f83016104b5565b92602082013567ffffffffffffffff8111610cfe57610cfa92016107b5565b9091565b61049d565b6102ac565b34610d3757610d21610d1b366004610cc2565b91612515565b610d296102a2565b80610d338161082a565b0390f35b6102a8565b610d473660046102b0565b610d4f61267d565b610d576102a2565b80610d618161082a565b0390f35b90565b610d7c610d77610d8192610d65565b6102cd565b610377565b90565b610d926436b7176e00610d68565b90565b610d9d610d84565b90565b34610dd057610db03660046102b0565b610dcc610dbb610d95565b610dc36102a2565b918291826103da565b0390f35b6102a8565b73bc6eeb5111fea2b5e9b2bc534bbcbca9568999a490565b610df5610dd5565b90565b34610e2857610e083660046102b0565b610e24610e13610ded565b610e1b6102a2565b9182918261032a565b0390f35b6102a8565b90565b610e44610e3f610e4992610e2d565b6102cd565b610377565b90565b610e757f07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc610e30565b90565b610e80610e4c565b90565b34610eb357610e933660046102b0565b610eaf610e9e610e78565b610ea66102a2565b918291826103da565b0390f35b6102a8565b73409f85d2207796b543b8abdb6a0e2490bb1483d190565b610ed8610eb8565b90565b34610f0b57610eeb3660046102b0565b610f07610ef6610ed0565b610efe6102a2565b9182918261032a565b0390f35b6102a8565b90565b610f23906008610f289302610424565b610f10565b90565b90610f369154610f13565b90565b610f45600d5f90610f2b565b90565b34610f7857610f583660046102b0565b610f74610f63610f39565b610f6b6102a2565b918291826103da565b0390f35b6102a8565b610f8681610311565b03610f8d57565b5f80fd5b90503590610f9e82610f7d565b565b91606083830312610fed57610fb7825f8501610f91565b92610fc583602083016104b5565b92604082013567ffffffffffffffff8111610fe857610fe492016107b5565b9091565b61049d565b6102ac565b346110245761100e611005366004610fa0565b92919091612b2f565b6110166102a2565b806110208161082a565b0390f35b6102a8565b90565b61104061103b61104592611029565b6102cd565b610377565b90565b6110717f052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b43461102c565b90565b61107c611048565b90565b346110af5761108f3660046102b0565b6110ab61109a611074565b6110a26102a2565b918291826103da565b0390f35b6102a8565b346110e4576110e06110cf6110ca3660046104c4565b612d3a565b6110d76102a2565b918291826103da565b0390f35b6102a8565b90565b6111006110fb611105926110e9565b6102cd565b610377565b90565b6111317f025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca016110ec565b90565b61113c611108565b90565b3461116f5761114f3660046102b0565b61116b61115a611134565b6111626102a2565b918291826103da565b0390f35b6102a8565b7310cbbbb225bbea137ac01f0f6d91cdb126bccaa690565b611194611174565b90565b346111c7576111a73660046102b0565b6111c36111b261118c565b6111ba6102a2565b9182918261032a565b0390f35b6102a8565b735ebb994ebc1c44815fbf2fa61a6e1f8368dcb0c790565b6111ec6111cc565b90565b3461121f576111ff3660046102b0565b61121b61120a6111e4565b6112126102a2565b9182918261032a565b0390f35b6102a8565b61123060265f9061044b565b90565b34611263576112433660046102b0565b61125f61124e611224565b6112566102a2565b9182918261032a565b0390f35b6102a8565b346112995761129561128461127e366004610863565b90612d8e565b61128c6102a2565b918291826103da565b0390f35b6102a8565b90565b6112b56112b06112ba9261129e565b6102cd565b610377565b90565b6112cc650474dec268006112a1565b90565b6112d76112bd565b90565b3461130a576112ea3660046102b0565b6113066112f56112cf565b6112fd6102a2565b918291826103da565b0390f35b6102a8565b90565b61132661132161132b9261130f565b6102cd565b610377565b90565b61133c64590ec6d100611312565b90565b61134761132e565b90565b3461137a5761135a3660046102b0565b61137661136561133f565b61136d6102a2565b918291826103da565b0390f35b6102a8565b61138e650474dec268006112a1565b90565b61139961137f565b90565b346113cc576113ac3660046102b0565b6113c86113b7611391565b6113bf6102a2565b918291826103da565b0390f35b6102a8565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61141261141b60209361142093611409816113d1565b938480936113d5565b958691016113de565b6113e9565b0190565b6114399160208201915f8184039101526113f3565b90565b3461146c576114686114576114523660046104c4565b612f74565b61145f6102a2565b91829182611424565b0390f35b6102a8565b634e487b7160e01b5f52604160045260245ffd5b9061148f906113e9565b810190811067ffffffffffffffff8211176114a957604052565b611471565b906114c16114ba6102a2565b9283611485565b565b67ffffffffffffffff81116114e1576114dd6020916113e9565b0190565b611471565b906114f86114f3836114c3565b6114ae565b918252565b5f7f537461726b45782d494d582d4d6967726174696f6e2d312e302e300000000000910152565b61152e601b6114e6565b9061153b602083016114fd565b565b611545611524565b90565b61155061153d565b90565b61155b611548565b90565b5190565b60209181520190565b61158a611593602093611598936115818161155e565b93848093611562565b958691016113de565b6113e9565b0190565b6115b19160208201915f81840391015261156b565b90565b346115e4576115c43660046102b0565b6115e06115cf611553565b6115d76102a2565b9182918261159c565b0390f35b6102a8565b5f80fd5b5f90565b61160561160061160a92610377565b6102cd565b610377565b90565b90611617906115f1565b5f5260205260405f2090565b5f1c90565b61163461163991611623565b610428565b90565b6116469054611628565b90565b90565b61166061165b61166592611649565b6102cd565b6102c2565b90565b6116719061164c565b90565b90565b61168b61168661169092611674565b6102cd565b610377565b90565b6116a260018060a01b03611677565b90565b6116b96116b46116be92610377565b6102cd565b6102c2565b90565b6116c96115ed565b506116de6116d96018839061160d565b61163c565b806116f96116f36116ee5f611668565b610311565b91610311565b0361174657508061171b6117158361170f611693565b16610377565b91610377565b145f146117375761172e611733916116a5565b610a1d565b5b90565b506117415f611668565b611734565b905090565b5f90565b61175761174b565b505f90565b90565b67ffffffffffffffff1690565b61178061177b6117859261175c565b6102cd565b61175f565b90565b60401c90565b60ff1690565b6117a06117a591611788565b61178e565b90565b6117b29054611794565b90565b67ffffffffffffffff1690565b6117ce6117d391611623565b6117b5565b90565b6117e090546117c2565b90565b5f1b90565b906117fb67ffffffffffffffff916117e3565b9181191691161790565b61181961181461181e9261175f565b6102cd565b61175f565b90565b90565b9061183961183461184092611805565b611821565b82546117e8565b9055565b60401b90565b9061185e68ff000000000000000091611844565b9181191691161790565b61187190610652565b90565b90565b9061188c61188761189392611868565b611874565b825461184a565b9055565b6118a09061175f565b9052565b91906118b7905f60208501940190611897565b565b906118c4600261176c565b916118cd612faf565b906118d95f83016117a8565b801561196a575b61194e576119139261190a916118f8865f8601611824565b61190560015f8601611877565b611a98565b5f809101611877565b6119497fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916119406102a2565b918291826118a4565b0390a1565b5f63f92ee8a960e01b8152806119666004820161082a565b0390fd5b506119765f83016117d6565b6119886119828661175f565b9161175f565b10156118e0565b90611999906115f1565b5f5260205260405f2090565b906119af906115f1565b5f5260205260405f2090565b6119c76119cc91611623565b610f10565b90565b6119d990546119bb565b90565b634e487b7160e01b5f52601160045260245ffd5b6119ff611a0591939293610377565b92610377565b8201809211611a1057565b6119dc565b90611a215f19916117e3565b9181191691161790565b90565b90611a43611a3e611a4a926115f1565b611a2b565b8254611a15565b9055565b90611a5f60018060a01b03916117e3565b9181191691161790565b611a7290610a1d565b90565b90565b90611a8d611a88611a9492611a69565b611a75565b8254611a4e565b9055565b5050611ae1611aa561137f565b611adb611acc611abe6008611ab8610aab565b9061198f565b611ac66106cd565b906119a5565b91611ad6836119cf565b6119f0565b90611a2e565b611b28611aec610b36565b611b22611b13611b056008611aff610396565b9061198f565b611b0d6106cd565b906119a5565b91611b1d836119cf565b6119f0565b90611a2e565b611b6f611b33610758565b611b69611b5a611b4c6008611b46611048565b9061198f565b611b546106cd565b906119a5565b91611b64836119cf565b6119f0565b90611a2e565b611bb6611b7a6112bd565b611bb0611ba1611b936008611b8d610e4c565b9061198f565b611b9b6106cd565b906119a5565b91611bab836119cf565b6119f0565b90611a2e565b611bfd611bc161132e565b611bf7611be8611bda6008611bd46108e3565b9061198f565b611be26106cd565b906119a5565b91611bf2836119cf565b6119f0565b90611a2e565b611c44611c0861096d565b611c3e611c2f611c216008611c1b611108565b9061198f565b611c296106cd565b906119a5565b91611c39836119cf565b6119f0565b90611a2e565b611c8b611c4f610d84565b611c85611c76611c686008611c626105e6565b9061198f565b611c706106cd565b906119a5565b91611c80836119cf565b6119f0565b90611a2e565b611ca6611ca16018611c9b610aab565b9061160d565b61163c565b611cc0611cba611cb55f611668565b610311565b91610311565b14611f1a575b611ce1611cdc6018611cd6610396565b9061160d565b61163c565b611cfb611cf5611cf05f611668565b610311565b91610311565b14611ef2575b611d1c611d176018611d11611048565b9061160d565b61163c565b611d36611d30611d2b5f611668565b610311565b91610311565b14611eca575b611d57611d526018611d4c610e4c565b9061160d565b61163c565b611d71611d6b611d665f611668565b610311565b91610311565b14611ea2575b611d92611d8d6018611d876108e3565b9061160d565b61163c565b611dac611da6611da15f611668565b610311565b91610311565b14611e7a575b611dcd611dc86018611dc2611108565b9061160d565b61163c565b611de7611de1611ddc5f611668565b610311565b91610311565b14611e52575b611e08611e036018611dfd6105e6565b9061160d565b61163c565b611e22611e1c611e175f611668565b610311565b91610311565b14611e2a575b565b611e4d611e35610dd5565b611e486018611e426105e6565b9061160d565b611a78565b611e28565b611e75611e5d61056f565b611e706018611e6a611108565b9061160d565b611a78565b611ded565b611e9d611e85610517565b611e986018611e926108e3565b9061160d565b611a78565b611db2565b611ec5611ead610eb8565b611ec06018611eba610e4c565b9061160d565b611a78565b611d77565b611eed611ed5611174565b611ee86018611ee2611048565b9061160d565b611a78565b611d3c565b611f15611efd610b87565b611f106018611f0a610396565b9061160d565b611a78565b611d01565b611f3d611f256111cc565b611f386018611f32610aab565b9061160d565b611a78565b611cc6565b90611f4c916118b9565b565b611f5790610a01565b90565b611f6390611f4e565b90565b5f7f4e4f4e5f46554e4749424c455f41535345545f54595045000000000000000000910152565b611f9a6017602092611562565b611fa381611f66565b0190565b611fbc9060208101905f818303910152611f8d565b90565b15611fc657565b611fce6102a2565b62461bcd60e51b815280611fe460048201611fa7565b0390fd5b611ffc611ff761200192611649565b6102cd565b610377565b90565b5f7f4e4f5f50454e44494e475f5749544844524157414c0000000000000000000000910152565b6120386015602092611562565b61204181612004565b0190565b61205a9060208101905f81830391015261202b565b90565b1561206457565b61206c6102a2565b62461bcd60e51b81528061208260048201612045565b0390fd5b61208f90610a1d565b90565b61209b90612086565b9052565b909594926120ea946120d96120e3926120cf6080966120c560a088019c5f8901906103cd565b60208701906103cd565b60408501906103cd565b60608301906103cd565b0190612092565b565b906120fe6120f98361303c565b611f5a565b61210f61210a836130e6565b611fbf565b6121c182936121756121356121306121296008859061198f565b88906119a5565b6119cf565b956121528761214c6121465f611fe8565b91610377565b1161205d565b61217061215e5f611fe8565b9161216b6008869061198f565b6119a5565b611a2e565b612181838587916133f4565b9161218d848690613697565b947fb7477a7b93b2addc5272bbd7ad0986ef1c0d0bd265f26c3dc4bbe42727c2ac0c956121b86102a2565b9586958661209f565b0390a1565b906121d8916121d36136df565b612205565b6121e0613754565b565b156121e957565b5f636e7e1ba960e11b8152806122016004820161082a565b0390fd5b906122349161222f3361222961222361221e602761163c565b610311565b91610311565b146121e2565b61230d565b565b5090565b1561224157565b5f635091728960e01b8152806122596004820161082a565b0390fd5b60016122699101610377565b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015612290576060020190565b61226c565b3561229f81610f7d565b90565b356122ac816104a1565b90565b156122b657565b5f63dd3bd7d760e01b8152806122ce6004820161082a565b0390fd5b6122db90610a01565b90565b6122e7906122d2565b90565b156122f157565b5f631733f9d760e01b8152806123096004820161082a565b0390fd5b9061233461231c838390612236565b61232e6123285f611fe8565b91610377565b1161223a565b61233d5f611fe8565b916123475f611fe8565b5b8061236561235f61235a858790612236565b610377565b91610377565b10156124e857612468906123855f61237f85878591612280565b01612295565b61239c602061239686888691612280565b016122a2565b6123c16123b660406123b0888a8891612280565b016122a2565b9291929788906119f0565b966123df886123d86123d234610377565b91610377565b11156122af565b816123f96123f36123ee6102f8565b610311565b91610311565b145f1461246d5761240b915082613a31565b612415602661163c565b339061245f61244d6124477f680cdeb18e0632eaae1727127d3005efb3ea5dba23e34446c9e94cf2cf5f557793611a69565b93611a69565b936124566102a2565b918291826103da565b0390a35b61225d565b612348565b6124839061247a836122de565b90849091613854565b61248d602661163c565b33916124e06124ce6124c86124c27fbaffede578523e7bb616324498f96acc5cd38e6c6168c976d67866fb78ea958d94611a69565b94611a69565b94611a69565b946124d76102a2565b918291826103da565b0390a4612463565b505050612507906125016124fb34610377565b91610377565b146122ea565b565b90612513916121c6565b565b9091612525923392909192612b2f565b565b61252f6136df565b612537612541565b61253f613754565b565b6125663361256061255a612555602761163c565b610311565b91610311565b146121e2565b61256e6125dd565b565b61257c61258191611623565b6109c1565b90565b61258e9054612570565b90565b5f80fd5b60e01b90565b5f9103126125a557565b6102ac565b9160206125cb9294936125c460408201965f8301906103cd565b019061031d565b565b6125d56102a2565b3d5f823e3d90fd5b6125ef6125ea6028612584565b610a29565b63168b5ab73491909190612603600d6119cf565b903393813b15612678575f9361262a9161263561261e6102a2565b97889687958694612595565b8452600484016125aa565b03925af1801561267357612647575b50565b612666905f3d811161266c575b61265e8183611485565b81019061259b565b5f612644565b503d612654565b6125cd565b612591565b612685612527565b565b5f7f494e56414c49445f535441524b5f4b4559000000000000000000000000000000910152565b6126bb6011602092611562565b6126c481612687565b0190565b6126dd9060208101905f8183039101526126ae565b90565b156126e757565b6126ef6102a2565b62461bcd60e51b815280612705600482016126c8565b0390fd5b90565b61272061271b61272592612709565b6102cd565b610377565b90565b61273f600167080000000000001160c01b0161270c565b90565b5f7f494e56414c49445f4554485f4144445245535300000000000000000000000000910152565b6127766013602092611562565b61277f81612742565b0190565b6127989060208101905f818303910152612769565b90565b156127a257565b6127aa6102a2565b62461bcd60e51b8152806127c060048201612783565b0390fd5b5f7f535441524b5f4b45595f554e415641494c41424c450000000000000000000000910152565b6127f86015602092611562565b612801816127c4565b0190565b61281a9060208101905f8183039101526127eb565b90565b1561282457565b61282c6102a2565b62461bcd60e51b81528061284260048201612805565b0390fd5b5090565b90565b61286161285c6128669261284a565b6102cd565b610377565b90565b5f7f494e56414c49445f535441524b5f5349474e41545552455f4c454e4754480000910152565b61289d601e602092611562565b6128a681612869565b0190565b6128bf9060208101905f818303910152612890565b90565b156128c957565b6128d16102a2565b62461bcd60e51b8152806128e7600482016128aa565b0390fd5b5f80fd5b67ffffffffffffffff811161290d576129096020916113e9565b0190565b611471565b90825f939282370152565b9092919261293261292d826128ef565b6114ae565b9381855260208501908284011161294e5761294c92612912565b565b6128eb565b61295e91369161291d565b90565b9050519061296e826104a1565b565b90916060828403126129a5576129a261298b845f8501612961565b936129998160208601612961565b93604001612961565b90565b6102ac565b905090565b5f7f55736572526567697374726174696f6e3a000000000000000000000000000000910152565b6129e2601180926129aa565b6129eb816129af565b0190565b60601b90565b6129fe906129ef565b90565b612a0a906129f5565b90565b612a19612a1e91610311565b612a01565b9052565b90565b612a31612a3691610377565b612a22565b9052565b601460209392612a56612a4f612a5e946129d6565b8092612a0d565b018092612a25565b0190565b60200190565b612a74612a7991611623565b6115f1565b90565b90565b612a93612a8e612a9892612a7c565b6102cd565b610377565b90565b612ac47f0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f612a7f565b90565b634e487b7160e01b5f52601260045260245ffd5b612ae7612aed91610377565b91610377565b908115612af8570690565b612ac7565b604090612b26612b2d9496959396612b1c60608401985f85019061031d565b60208301906103cd565b019061031d565b565b91612c15612c8d9294612c2b92612b5987612b52612b4c5f611fe8565b91610377565b14156126e0565b612b7c87612b76612b70612b6b612728565b610377565b91610377565b106126e0565b612ba186612b9a612b94612b8f5f611668565b610311565b91610311565b141561279b565b612bd8612bb8612bb360188a9061160d565b61163c565b612bd2612bcc612bc75f611668565b610311565b91610311565b1461281d565b612be9612be488613b7a565b6126e0565b612c10612bf7828490612846565b612c0a612c04606061284d565b91610377565b146128c2565b612953565b6020612c20826113d1565b818301019101612970565b90612c84612c7686612c5e8991612c4f612c436102a2565b93849260208401612a3a565b60208201810382520382611485565b612c70612c6a826113d1565b91612a62565b20612a68565b612c7e612a9b565b90612adb565b92869293613fb8565b612ca281612c9d6018859061160d565b611a78565b903391612cdb7fcab1cf17c190e4e2195a7b8f7b362023246fa774390432b4704ab6b29d56b07b93612cd26102a2565b93849384612afd565b0390a1565b5f90565b90612cee906115f1565b5f5260205260405f2090565b612d06612d0b91611623565b61178e565b90565b612d189054612cfa565b90565b90565b612d32612d2d612d3792612d1b565b6102cd565b610377565b90565b612d42612ce0565b50612d60612d5a612d5560158490612ce4565b612d0e565b15610652565b5f14612d755750612d716001612d1e565b905b565b612d83612d889160166119a5565b6119cf565b90612d73565b612db7612db2612dbd93612da0612ce0565b50612dad8194600861198f565b6119a5565b6119cf565b90613697565b90565b606090565b5f7f41535345545f545950455f4e4f545f5245474953544552454400000000000000910152565b612df96019602092611562565b612e0281612dc5565b0190565b612e1b9060208101905f818303910152612dec565b90565b15612e2557565b612e2d6102a2565b62461bcd60e51b815280612e4360048201612e06565b0390fd5b90612e51906115f1565b5f5260205260405f2090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015612e91575b6020831014612e8c57565b612e5d565b91607f1691612e81565b60209181520190565b5f5260205f2090565b905f9291805490612ec7612ec083612e71565b8094612e9b565b916001811690815f14612f1e5750600114612ee2575b505050565b612eef9192939450612ea4565b915f925b818410612f0657505001905f8080612edd565b60018160209295939554848601520191019290612ef3565b92949550505060ff19168252151560200201905f8080612edd565b90612f4391612ead565b90565b90612f66612f5f92612f566102a2565b93848092612f39565b0383611485565b565b612f7190612f46565b90565b612fa7612fac91612f83612dc0565b50612fa0612f9b612f9660158490612ce4565b612d0e565b612e1e565b6014612e47565b612f68565b90565b612fb76142a4565b90565b5f7f555345525f554e52454749535445524544000000000000000000000000000000910152565b612fee6011602092611562565b612ff781612fba565b0190565b6130109060208101905f818303910152612fe1565b90565b1561301a57565b6130226102a2565b62461bcd60e51b81528061303860048201612ffb565b0390fd5b61304e906130486115ed565b506116c1565b906130748261306d6130676130625f611668565b610311565b91610311565b1415613013565b565b63ffffffff60e01b1690565b61308b90613076565b90565b6130b77f8322fff276cdf3f5716784c2e78b276d0d5cf1781fe7a7984e8bff96f75632c6613082565b90565b6130e37ff47261b06eedbfce68afd46d0f3c27c60b03faad319eaf33103611cf8f6456ad613082565b90565b6130f8906130f261174b565b506142bc565b8061311261310c61310761308e565b613076565b91613076565b1490811561311f575b5090565b905061313a61313461312f6130ba565b613076565b91613076565b145f61311b565b5f7f494e56414c49445f524543495049454e54000000000000000000000000000000910152565b6131756011602092611562565b61317e81613141565b0190565b6131979060208101905f818303910152613168565b90565b156131a157565b6131a96102a2565b62461bcd60e51b8152806131bf60048201613182565b0390fd5b5f7f554e535550504f525445445f544f4b454e5f5459504500000000000000000000910152565b6131f76016602092611562565b613200816131c3565b0190565b6132199060208101905f8183039101526131ea565b90565b61322590610a01565b90565b6132319061321c565b90565b61323d90610a1d565b90565b61324990610a1d565b90565b9060208282031261326557613262915f01612961565b90565b6102ac565b63ffffffff1690565b61328761328261328c9261326a565b612595565b613076565b90565b613298906102c2565b90565b6132a49061328f565b9052565b9160206132c99294936132c260408201965f83019061329b565b01906103cd565b565b5f7f554e444552464c4f570000000000000000000000000000000000000000000000910152565b6132ff6009602092611562565b613308816132cb565b0190565b6133219060208101905f8183039101526132f2565b90565b1561332b57565b6133336102a2565b62461bcd60e51b8152806133496004820161330c565b0390fd5b61335c61336291939293610377565b92610377565b820391821161336d57565b6119dc565b5f7f494e434f52524543545f414d4f554e545f5452414e5346455252454400000000910152565b6133a6601c602092611562565b6133af81613372565b0190565b6133c89060208101905f818303910152613399565b90565b156133d257565b6133da6102a2565b62461bcd60e51b8152806133f0600482016133b3565b0390fd5b909161341b8261341461340e6134095f611668565b610311565b91612086565b141561319a565b613426838290613697565b90613430846142d9565b5f146135fd576134486134425f611fe8565b91610377565b146135f85761345961349f93614448565b61346281613228565b602061346d82613234565b6370a082319061349461347f30613240565b926134886102a2565b998a9485938493612595565b83526004830161032a565b03915afa9081156135f35761350460209360046134fe6135099561353b9a5f916135c6575b50986134f06134d663a9059cbb613273565b918a906134e16102a2565b9586948c8601908152016132a8565b888201810382520382611485565b906145da565b613234565b6370a082319061353061351b30613240565b926135246102a2565b97889485938493612595565b83526004830161032a565b03915afa80156135c15761357f61358a9261358492613590965f91613593575b506135798161357261356c89610377565b91610377565b1115613324565b9461334d565b610377565b91610377565b146133cb565b5b565b6135b4915060203d81116135ba575b6135ac8183611485565b81019061324c565b5f61355b565b503d6135a2565b6125cd565b6135e69150883d81116135ec575b6135de8183611485565b81019061324c565b5f6134c4565b503d6135d4565b6125cd565b505050565b90919261360990614308565b5f146136405761362161361b5f611fe8565b91610377565b1461363c5761363261363792612086565b614419565b613591565b5050565b6136486102a2565b62461bcd60e51b81528061365e60048201613204565b0390fd5b61367161367791939293610377565b92610377565b91613683838202610377565b92818404149015171561369257565b6119dc565b906136ad6136b3926136a7612ce0565b50612d3a565b90613662565b90565b6136ca6136c56136cf9261175c565b6102cd565b610377565b90565b6136dc60026136b6565b90565b6136f1680100000000000000006119cf565b61370a6137046136ff6136d2565b610377565b91610377565b1461372b5761372961371a6136d2565b68010000000000000000611a2e565b565b5f633ee5aeb560e01b8152806137436004820161082a565b0390fd5b6137516001612d1e565b90565b61376e61375f613747565b68010000000000000000611a2e565b565b61377990610a1d565b90565b1561378357565b5f63e6c4247b60e01b81528061379b6004820161082a565b0390fd5b156137a657565b5f63162908e360e11b8152806137be6004820161082a565b0390fd5b6137cb90610a1d565b90565b156137d557565b5f6312d5633960e31b8152806137ed6004820161082a565b0390fd5b6137fa90610a01565b90565b613806906137f1565b90565b61381290610a1d565b90565b61381e90613770565b9052565b60409061384b613852949695939661384160608401985f850190613815565b602083019061031d565b01906103cd565b565b91909161388461386382613770565b61387d6138776138725f611668565b610311565b91610311565b141561377c565b6138a08361389a6138945f611fe8565b91610377565b1161379f565b6138e060206138ae83613770565b6370a08231906138d56138c0306137c2565b926138c96102a2565b95869485938493612595565b83526004830161032a565b03915afa8015613a095761390f915f916139db575b5061390861390286610377565b91610377565b10156137ce565b61393461392361391e83613770565b613228565b61392d602561163c565b8591614691565b61394e613949613944602561163c565b6137fd565b613809565b9163f213159c90929092613962602661163c565b9490823b156139d6575f946139936139889361397c6102a2565b98899788968795612595565b855260048501613822565b03925af180156139d1576139a5575b50565b6139c4905f3d81116139ca575b6139bc8183611485565b81019061259b565b5f6139a2565b503d6139b2565b6125cd565b612591565b6139fc915060203d8111613a02575b6139f48183611485565b81019061324c565b5f6138f5565b503d6139ea565b6125cd565b916020613a2f929493613a2860408201965f83019061031d565b01906103cd565b565b90613a4e82613a48613a425f611fe8565b91610377565b1161379f565b613a7e613a5a306137c2565b31613a77613a71613a6c8686906119f0565b610377565b91610377565b10156137ce565b613a98613a93613a8e602561163c565b6137fd565b613809565b91613aa863e041043292826119f0565b92919291613ab6602661163c565b9193813b15613b2a575f93613adc91613ae7613ad06102a2565b97889687958694612595565b845260048401613a0e565b03925af18015613b2557613af9575b50565b613b18905f3d8111613b1e575b613b108183611485565b81019061259b565b5f613af6565b503d613b06565b6125cd565b612591565b90565b613b46613b41613b4b92613b2f565b6102cd565b610377565b90565b613b777f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b613b8261174b565b508081613b8d612728565b918215613bea570981613b9e612728565b918215613be5570990613baf612728565b918215613be05708613bbf613b4e565b613bc7612728565b908115613bdb57613bd8920861476f565b90565b612ac7565b612ac7565b612ac7565b612ac7565b5f7f6d736748617368206f7574206f662072616e6765000000000000000000000000910152565b613c236014602092611562565b613c2c81613bef565b0190565b613c459060208101905f818303910152613c16565b90565b15613c4f57565b613c576102a2565b62461bcd60e51b815280613c6d60048201613c30565b0390fd5b5f7f73206f7574206f662072616e6765000000000000000000000000000000000000910152565b613ca5600e602092611562565b613cae81613c71565b0190565b613cc79060208101905f818303910152613c98565b90565b15613cd157565b613cd96102a2565b62461bcd60e51b815280613cef60048201613cb2565b0390fd5b90565b613d0a613d05613d0f92613cf3565b6102cd565b610377565b90565b613d1c60fb613cf6565b90565b1b90565b613d4290613d3c613d36613d4794610377565b91610377565b90613d1f565b610377565b90565b5f7f72206f7574206f662072616e6765000000000000000000000000000000000000910152565b613d7e600e602092611562565b613d8781613d4a565b0190565b613da09060208101905f818303910152613d71565b90565b15613daa57565b613db26102a2565b62461bcd60e51b815280613dc860048201613d8b565b0390fd5b5f7f77206f7574206f662072616e6765000000000000000000000000000000000000910152565b613e00600e602092611562565b613e0981613dcc565b0190565b613e229060208101905f818303910152613df3565b90565b15613e2c57565b613e346102a2565b62461bcd60e51b815280613e4a60048201613e0d565b0390fd5b613e65600167080000000000001160c01b0161270c565b90565b613e917f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b90565b613eab613ea6613eb092613e94565b6102cd565b610377565b90565b613edc7f01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca613e97565b90565b90565b613ef6613ef1613efb92613edf565b6102cd565b610377565b90565b613f267e5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f613ee2565b90565b613f336001612d1e565b90565b5f7f494e56414c49445f535441524b5f5349474e4154555245000000000000000000910152565b613f6a6017602092611562565b613f7381613f36565b0190565b613f8c9060208101905f818303910152613f5d565b90565b15613f9657565b613f9e6102a2565b62461bcd60e51b815280613fb460048201613f77565b0390fd5b90929161401f90613fec613fd484613fce612a9b565b90612adb565b613fe6613fe086610377565b91610377565b14613c48565b6001614000613ffa83610377565b91612d1e565b11158061422c575b61401190613cca565b614019612a9b565b90614849565b91600161403461402e86610377565b91612d1e565b1115806141f3575b61404590613da3565b600161405961405385610377565b91612d1e565b1115806141ba575b61406a90613e25565b8081614074613e4e565b9182156141b5570981614085613e4e565b9182156141b05709928586614098613e4e565b9182156141ab570993826140aa613e4e565b9182156141a65708936140bb613e68565b966140c4613e4e565b9384156141a15761415861413a61419397614101614175966140fb6140f561419f9f9b61418c9c6141999f08610377565b91610377565b146126e0565b614109612ce0565b50614112612ce0565b5061411b613eb3565b614123613efe565b61412b613f29565b91614134613e4e565b9361494c565b929092938a9190614149613f29565b91614152613e4e565b9361494c565b919091909291614166613f29565b9261416f613e4e565b94614993565b61417d613f29565b91614186613e4e565b9361494c565b5092610377565b91610377565b14613f8f565b565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b5061406a836141eb6141e56141e060016141db6141d5613d12565b91612d1e565b613d23565b610377565b91610377565b109050614061565b506140458461422461421e614219600161421461420e613d12565b91612d1e565b613d23565b610377565b91610377565b10905061403c565b506140118161424a61424461423f612a9b565b610377565b91610377565b109050614008565b5f90565b90565b90565b61427061426b61427592614256565b6117e3565b614259565b90565b6142a17ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061425c565b90565b6142ac614252565b506142b5614278565b90565b5f90565b6142d16142d6916142cb6142b8565b50612f74565b614a91565b90565b6142eb906142e561174b565b506142bc565b6143046142fe6142f96130ba565b613076565b91613076565b1490565b61431a9061431461174b565b506142bc565b61433361432d61432861308e565b613076565b91613076565b1490565b905090565b6143475f8092614337565b0190565b6143549061433c565b90565b90614369614364836128ef565b6114ae565b918252565b3d5f146143895761437e3d614357565b903d5f602084013e5b565b614391612dc0565b90614387565b5f7f4554485f5452414e534645525f4641494c454400000000000000000000000000910152565b6143cb6013602092611562565b6143d481614397565b0190565b6143ed9060208101905f8183039101526143be565b90565b156143f757565b6143ff6102a2565b62461bcd60e51b815280614415600482016143d8565b0390fd5b5f614446928192906144296102a2565b90816144348161434b565b03925af161444061436e565b506143f0565b565b61445d614462916144576115ed565b50612f74565b614b1f565b90565b5f7f4241445f544f4b454e5f41444452455353000000000000000000000000000000910152565b6144996011602092611562565b6144a281614465565b0190565b6144bb9060208101905f81830391015261448c565b90565b156144c557565b6144cd6102a2565b62461bcd60e51b8152806144e3600482016144a6565b0390fd5b90565b156144f25750565b614513906144fe6102a2565b91829162461bcd60e51b83526004830161159c565b0390fd5b61452081610652565b0361452757565b5f80fd5b9050519061453882614517565b565b9060208282031261455357614550915f0161452b565b90565b6102ac565b5f7f544f4b454e5f4f5045524154494f4e5f4641494c454400000000000000000000910152565b61458c6016602092611562565b61459581614558565b0190565b6145ae9060208101905f81830391015261457f565b90565b156145b857565b6145c06102a2565b62461bcd60e51b8152806145d660048201614599565b0390fd5b5f9182916145ef6145ea82614b50565b6144be565b9082602082019151925af161461561460561436e565b9161460f836144e7565b906144ea565b61461e816113d1565b61463061462a5f611fe8565b91610377565b11614639575b50565b61465661465b91602061464b826113d1565b81830101910161453a565b6145b1565b5f614636565b61466a90611fe8565b9052565b91602061468f92949361468860408201965f83019061031d565b0190614661565b565b90916146d46004916146c563095ea7b36146ac879391613273565b926146b56102a2565b9586946020860190815201613a0e565b60208201810382520382611485565b906146e96146e3828490614b79565b15610652565b6146f3575b505050565b61474060046147459461473b849161472c63095ea7b36147135f91613273565b9261471c6102a2565b968794602086019081520161466e565b60208201810382520383611485565b614c1b565b614c1b565b5f80806146ee565b61475961475f91610377565b91610377565b90811561476a570490565b612ac7565b61477761174b565b506147c36147bd6147b86001936147b26147a2614792612728565b61479c6001612d1e565b9061334d565b6147ac60026136b6565b9061474d565b90614e06565b610377565b91612d1e565b1490565b5f7f496e76616c6964206e756d626572000000000000000000000000000000000000910152565b6147fb600e602092611562565b614804816147c7565b0190565b61481d9060208101905f8183039101526147ee565b90565b1561482757565b61482f6102a2565b62461bcd60e51b81528061484560048201614808565b0390fd5b614851612ce0565b508061486561485f5f611fe8565b91610377565b141580614931575b80614911575b61487c90614820565b6148855f611fe8565b61488f6001612d1e565b8390614899612ce0565b505b836148ae6148a85f611fe8565b91610377565b14614909576148be82859061474d565b81939186829188908115614904576148d793099061334d565b918680156148ff576148f8936148f292089495809492613662565b9061334d565b929161489b565b612ac7565b612ac7565b505091505090565b5061487c826149286149225f611fe8565b91610377565b14159050614873565b508061494561493f84610377565b91610377565b141561486d565b9161498d94939161497f9361495f612ce0565b50614968612ce0565b509091600193926149798795612d1e565b92614e8f565b929190929092909192614fa9565b91909190565b92909493916149a0612ce0565b506149a9612ce0565b506149b35f611fe8565b506149bd5f611fe8565b506149c75f611fe8565b50836149db6149d583610377565b91610377565b145f14614a595750849084918215614a545708614a006149fa5f611fe8565b91610377565b145f14614a2357505050505f90614a20614a1a5f93611fe8565b92611fe8565b90565b614a4e93614a3f9260019291614a398694612d1e565b9161586c565b92919290925b92909192614fa9565b91909190565b612ac7565b915093614a4e94614a879391906001939091600190614a81614a7b8997612d1e565b92612d1e565b9461514d565b9291929092614a45565b602090614a9c6142b8565b50015163ffffffff60e01b1690565b90565b614ac2614abd614ac792614aab565b6102cd565b610377565b90565b614ad46020614aae565b90565b90565b614aee614ae9614af392614ad7565b6102cd565b610377565b90565b614b006004614ada565b90565b614b1c614b0e614aca565b614b16614af6565b906119f0565b90565b614b48614b4d91614b2e6115ed565b50614b37614b03565b90614b40612ce0565b5001516116a5565b610a1d565b90565b614b5861174b565b50614b61612ce0565b503b614b75614b6f5f611fe8565b91610377565b1190565b905f602091614b8661174b565b50614b8f61174b565b50614b98612ce0565b50614ba1612ce0565b50828151910182855af13d915f51919283614bbd575b50505090565b90919250614bd3614bcd5f611fe8565b91610377565b145f14614c0157614be49150613234565b3b614bf7614bf15f611fe8565b91610377565b115b5f8080614bb7565b50614c15614c0f6001612d1e565b91610377565b14614bf9565b905f602091614c28612ce0565b50614c31612ce0565b50828151910182855af115614cc4573d5f5190614c56614c505f611fe8565b91610377565b145f14614caa5750614c6781613234565b3b614c7a614c745f611fe8565b91610377565b145b614c835750565b614c8f614ca691613234565b5f918291635274afe760e01b83526004830161032a565b0390fd5b614cbd614cb76001612d1e565b91610377565b1415614c7c565b6040513d5f823e3d90fd5b90565b614ce6614ce1614ceb92614ccf565b6102cd565b6102c2565b90565b614cf790614cd2565b90565b60ff1690565b614d14614d0f614d1992614aab565b6102cd565b614cfa565b90565b614d2590614d00565b9052565b9194614d71614d7b92989795614d6760a096614d5d614d829a614d5360c08a019e5f8b0190614d1c565b6020890190614d1c565b6040870190614d1c565b60608501906103cd565b60808301906103cd565b01906103cd565b565b5f7f4649454c445f504f575f4641494c454400000000000000000000000000000000910152565b614db86010602092611562565b614dc181614d84565b0190565b614dda9060208101905f818303910152614dab565b90565b15614de457565b614dec6102a2565b62461bcd60e51b815280614e0260048201614dc5565b0390fd5b5f8091614e8c93614e15612ce0565b50614e5c614e236005614cee565b92614e4d602091602094602091614e38612728565b92614e416102a2565b97889660208801614d29565b60208201810382520382611485565b602081019051915afa614e76614e7061436e565b91614ddd565b6020614e81826113d1565b81830101910161324c565b90565b9493929194614e9c612ce0565b50614ea5612ce0565b50614eae612ce0565b5080614ec2614ebc5f611fe8565b91610377565b14614f9b579590614ed25f611fe8565b95614edc5f611fe8565b93614ee76001612d1e565b985b80614efc614ef65f611fe8565b91610377565b14614f8a5780614f0c6001612d1e565b16614f1f614f195f611fe8565b91610377565b03614f5c575b90614f3e614f4a9392614f3860026136b6565b9061474d565b9391908791899361586c565b97919794909792979197949094614ee9565b97614f3e95829a614f4a9493614f7a93929187908692938d9561514d565b9a91969096999192935050614f25565b505050509250929050919291929190565b509150939150919291929190565b91614fcb9094939194614fba612ce0565b50614fc3612ce0565b508290614849565b918283839182156150095709908183918215615004570994929082918215614fff570990918215614ffa570990565b612ac7565b612ac7565b612ac7565b612ac7565b67ffffffffffffffff81116150235760200290565b611471565b6150346150399161500e565b6114ae565b90565b369037565b9061505f61504e83615028565b92615059849161500e565b9061503c565b565b61506b6004615041565b90565b50600490565b9061507e8261506e565b81101561508c576020020190565b61226c565b9061509b90610377565b9052565b6150a99051610377565b90565b90565b6150c36150be6150c8926150ac565b6102cd565b610377565b90565b5f7f557365206a6163446f75626c652066756e6374696f6e20696e73746561640000910152565b6150ff601e602092611562565b615108816150cb565b0190565b6151219060208101905f8183039101526150f2565b90565b1561512b57565b6151336102a2565b62461bcd60e51b8152806151496004820161510c565b0390fd5b92969495969390919361515e612ce0565b50615167612ce0565b50615170612ce0565b508361518461517e5f611fe8565b91610377565b1480615833575b61582457806151a261519c5f611fe8565b91610377565b148061580a575b6157fb576151b5615061565b9285868a9081156157f6576151dd92096151d8866151d25f611fe8565b90615074565b615091565b856151f96151f4866151ee5f611fe8565b90615074565b61509f565b8a9081156157f15761521f920961521a866152146001612d1e565b90615074565b615091565b87888a9081156157ec5761524792096152428661523c60026136b6565b90615074565b615091565b8761526461525f8661525960026136b6565b90615074565b61509f565b8a9081156157e75761528a92096152858661527f60036150af565b90615074565b615091565b6152946004615028565b946152b16152ac866152a660026136b6565b90615074565b61509f565b8a9081156157e2576152c692095f8701615091565b6152e26152dd856152d760036150af565b90615074565b61509f565b899081156157dd576152f8920960208601615091565b9061531461530f846153095f611fe8565b90615074565b61509f565b90889283156157d8576153499361534493615333920960408701615091565b9261533e6001612d1e565b90615074565b61509f565b869081156157d35761535f920960608301615091565b9361537b615376866153705f611fe8565b90615074565b61509f565b6153a86153a261539d6153988961539260026136b6565b90615074565b61509f565b610377565b91610377565b1415801561577d575b6153ba90615124565b6153c2615061565b936153df6153da876153d460026136b6565b90615074565b61509f565b615404836153fe6153f98a6153f35f611fe8565b90615074565b61509f565b9061334d565b839081156157785761542992086154248761541e5f611fe8565b90615074565b615091565b6154456154408761543a60036150af565b90615074565b61509f565b61546b836154656154608a61545a6001612d1e565b90615074565b61509f565b9061334d565b8390811561577357615491920861548c876154866001612d1e565b90615074565b615091565b6154ac6154a7866154a15f611fe8565b90615074565b61509f565b6154c76154c2876154bc5f611fe8565b90615074565b61509f565b8390811561576e576154ed92096154e8876154e260026136b6565b90615074565b615091565b615509615504866154fe60026136b6565b90615074565b61509f565b61552461551f876155195f611fe8565b90615074565b61509f565b839081156157695761554a92096155458761553f60036150af565b90615074565b615091565b6155666155618661555b6001612d1e565b90615074565b61509f565b61558261557d876155776001612d1e565b90615074565b61509f565b8391821561576457096155b1836155ab6155a6896155a060036150af565b90615074565b61509f565b9061334d565b8391821561575f5708826002906155d96155d48a6155ce5f611fe8565b90615074565b61509f565b6155f56155f08a6155ea60026136b6565b90615074565b61509f565b8691821561575a57098590811561575557615612615619946136b6565b099061334d565b8391821561575057089561563f61563a876156346001612d1e565b90615074565b61509f565b61565a6156558361564f5f611fe8565b90615074565b61509f565b6156766156718961566b60026136b6565b90615074565b61509f565b8591821561574b570961568a858a9061334d565b859182156157465708849182156157415709906156ba6156b585926156af6001612d1e565b90615074565b61509f565b906156d76156d2896156cc60036150af565b90615074565b61509f565b8590811561573c576156ea93099061334d565b90838015615737576157109261570b9208966157055f611fe8565b90615074565b61509f565b92908291821561573257099091821561572d570992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b506153ba61579d615798876157926001612d1e565b90615074565b61509f565b6157ca6157c46157bf6157ba8a6157b460036150af565b90615074565b61509f565b610377565b91610377565b141590506153b1565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b50509350909350919291929190565b508161581e6158185f611fe8565b91610377565b146151a9565b93509495505050919291929190565b50826158476158415f611fe8565b91610377565b1461518b565b90565b61586461585f6158699261584d565b6102cd565b610377565b90565b9492949390919361587b612ce0565b50615884612ce0565b5061588d612ce0565b50846158a161589b5f611fe8565b91610377565b14615a2357808183918215615a1e570995838484918215615a19570991868785918215615a145709906004908486918215615a0f570985918215615a0a576158e890614ada565b099760039085918215615a05576158fe906150af565b0991908085918215615a005709849182156159fb5709839182156159f65708958687849182156159f1570983829083869081156159ec5761594093089061334d565b849182156159e75708969061595684899061334d565b849182156159e25708839182156159dd5709908260089180859182156159d85709849081156159d35761598b61599294615850565b099061334d565b829182156159ce57089360029290829182156159c95709909182156159c4576159ba906136b6565b0992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b919394505091929192919056fea26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","sourceMap":"868:4258:26:-:0;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;:::i;:::-;:::o;2126:53:25:-;;;:::i;:::-;;;:::i;:::-;:::o;868:4258:26:-;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1818:40:17:-;1857:1;;;:::i;:::-;1818:40;:::o;1857:1::-;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;2037:52::-;2061:21;2071:11;;:::i;:::-;2061:21;;:::i;:::-;2037:52::o;868:4258:26:-;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;:::o;:::-;2061:21:17;868:4258:26;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;2061:21:17;868:4258:26;;;;;;:::o;:::-;;;2061:21:17;868:4258:26;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;7709:422:13:-;7857:26;;:::i;:::-;7898:15;;:1;:15;;:::i;:::-;7894:76;;7983:14;;:1;:14;;:::i;:::-;:34;;2061:21:17;868:4258:26;;;;7983:34:13;:::i;:::-;;;:::i;:::-;;7979:146;;7709:422;;:::o;7979:146::-;8033:33;868:4258:26;8033:14:13;2061:21:17;868:4258:26;;;;8033:1:13;:14;:33;:::i;:::-;2061:21:17;868:4258:26;;;;8085:29:13;;;;;:::i;:::-;;;;;;:::i;:::-;;;;7979:146;;;7894:76;7936:23;;;;;;;;;;;;:::i;:::-;;;;9071:205;9186:27;;:::i;:::-;9071:205;:::o;868:4258:26:-;;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3098:115:13:-;3147:66;;;:::i;:::-;3098:115;:::o;8819:122::-;8887:7;;:::i;:::-;8913:21;;;:::i;:::-;8906:28;:::o","linkReferences":{}},"deployedBytecode":{"object":"60806040526004361015610013575b6115e9565b61001d5f3561029c565b8063011e1167146102975780631710abaa14610292578063187ac4cb1461028d5780631dbd1da7146102885780631f0e8a12146102835780631f7daf0f1461027e57806330eff5dd1461027957806333eeb1471461027457806334759ca71461026f578063429a82081461026a578063439fab9114610265578063441a3e701461026057806346a577ed1461025b5780634780404d1461025657806354f3ea7f14610251578063556cf28b1461024c578063582b9044146102475780635837397114610242578063701f9fae1461023d5780637feaf0571461023857806386aeb4451461023357806387ec36e31461022e578063988760b0146102295780639a0fa042146102245780639cec9aaa1461021f578063b8ad077d1461021a578063b937f8f714610215578063bea8418714610210578063ccefe7b01461020b578063dd7202d814610206578063e2d8efd014610201578063e6fb8119146101fc578063e8a91f30146101f7578063e9f5a4a8146101f2578063ec3161b0146101ed578063ed3914d4146101e8578063ee4d01bf146101e3578063f405f17a146101de578063f637d950146101d95763ffa1ad740361000e576115b4565b61143c565b61139c565b61134a565b6112da565b611268565b611233565b6111ef565b611197565b61113f565b6110b4565b61107f565b610ff2565b610f48565b610edb565b610e83565b610df8565b610da0565b610d3c565b610d08565b610c8d565b610c54565b610baa565b610b52565b610ae2565b610a57565b61098c565b610919565b610890565b61082f565b610774565b610704565b610679565b61061d565b610592565b61053a565b6104e2565b610468565b6103ef565b61033f565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f9103126102ba57565b6102ac565b90565b60018060a01b031690565b90565b6102e46102df6102e9926102bf565b6102cd565b6102c2565b90565b6102f5906102d0565b90565b610303610eee6102ec565b90565b61030e6102f8565b90565b61031a906102c2565b90565b61032690610311565b9052565b919061033d905f6020850194019061031d565b565b3461036f5761034f3660046102b0565b61036b61035a610306565b6103626102a2565b9182918261032a565b0390f35b6102a8565b90565b90565b61038e61038961039392610374565b6102cd565b610377565b90565b6103bf7f01fb73de41e5392ef06b02030759d30da7d4da9d64e31115a705e62127f9dcb061037a565b90565b6103ca610396565b90565b6103d690610377565b9052565b91906103ed905f602085019401906103cd565b565b3461041f576103ff3660046102b0565b61041b61040a6103c2565b6104126102a2565b918291826103da565b0390f35b6102a8565b1c90565b60018060a01b031690565b6104439060086104489302610424565b610428565b90565b906104569154610433565b90565b61046560275f9061044b565b90565b34610498576104783660046102b0565b610494610483610459565b61048b6102a2565b9182918261032a565b0390f35b6102a8565b5f80fd5b6104aa81610377565b036104b157565b5f80fd5b905035906104c2826104a1565b565b906020828203126104dd576104da915f016104b5565b90565b6102ac565b346105125761050e6104fd6104f83660046104c4565b6116c1565b6105056102a2565b9182918261032a565b0390f35b6102a8565b73ce5a537d4da620de59efa6f74a0a065732600c7190565b610537610517565b90565b3461056a5761054a3660046102b0565b61056661055561052f565b61055d6102a2565b9182918261032a565b0390f35b6102a8565b73941f54cb53dc1478cb126a2ba8a83b2130419db590565b61058f61056f565b90565b346105c2576105a23660046102b0565b6105be6105ad610587565b6105b56102a2565b9182918261032a565b0390f35b6102a8565b90565b6105de6105d96105e3926105c7565b6102cd565b610377565b90565b61060f7f01a8f1faf9536efcf2bedf660c9f8d529ad07978812926823d29df617adb8df26105ca565b90565b61061a6105e6565b90565b3461064d5761062d3660046102b0565b610649610638610612565b6106406102a2565b918291826103da565b0390f35b6102a8565b151590565b61066090610652565b9052565b9190610677905f60208501940190610657565b565b346106a9576106893660046102b0565b6106a561069461174f565b61069c6102a2565b91829182610664565b0390f35b6102a8565b90565b6106c56106c06106ca926106ae565b6102cd565b610377565b90565b6106f67f0348958c1322d3fc34f89b91b0b6473594725847184ee590e990bb70ef322b166106b1565b90565b6107016106cd565b90565b34610734576107143660046102b0565b61073061071f6106f9565b6107276102a2565b918291826103da565b0390f35b6102a8565b90565b61075061074b61075592610739565b6102cd565b610377565b90565b6107666401c16b450061073c565b90565b610771610758565b90565b346107a4576107843660046102b0565b6107a061078f610769565b6107976102a2565b918291826103da565b0390f35b6102a8565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156107ef5781359167ffffffffffffffff83116107ea5760200192600183028401116107e557565b6107b1565b6107ad565b6107a9565b90602082820312610825575f82013567ffffffffffffffff81116108205761081c92016107b5565b9091565b61049d565b6102ac565b5f0190565b3461085e576108486108423660046107f4565b90611f42565b6108506102a2565b8061085a8161082a565b0390f35b6102a8565b919060408382031261088b578061087f610888925f86016104b5565b936020016104b5565b90565b6102ac565b346108bf576108a96108a3366004610863565b906120ec565b6108b16102a2565b806108bb8161082a565b0390f35b6102a8565b90565b6108db6108d66108e0926108c4565b6102cd565b610377565b90565b61090b7eb59aa8b25d30099884e724376fe562e15bdc8c24eda4a6212edffc1c4e49586108c7565b90565b6109166108e3565b90565b34610949576109293660046102b0565b61094561093461090e565b61093c6102a2565b918291826103da565b0390f35b6102a8565b90565b61096561096061096a9261094e565b6102cd565b610377565b90565b61097e6703b2c201ffc2e880610951565b90565b61098961096d565b90565b346109bc5761099c3660046102b0565b6109b86109a7610981565b6109af6102a2565b918291826103da565b0390f35b6102a8565b60018060a01b031690565b6109dc9060086109e19302610424565b6109c1565b90565b906109ef91546109cc565b90565b6109fe60285f906109e4565b90565b610a15610a10610a1a926102c2565b6102cd565b6102c2565b90565b610a2690610a01565b90565b610a3290610a1d565b90565b610a3e90610a29565b9052565b9190610a55905f60208501940190610a35565b565b34610a8757610a673660046102b0565b610a83610a726109f2565b610a7a6102a2565b91829182610a42565b0390f35b6102a8565b90565b610aa3610a9e610aa892610a8c565b6102cd565b610377565b90565b610ad47f07d2ca42b17532a203fa5ed81a3a5abf5b16e05bd46b5583e05265b09a3f4753610a8f565b90565b610adf610aab565b90565b34610b1257610af23660046102b0565b610b0e610afd610ad7565b610b056102a2565b918291826103da565b0390f35b6102a8565b90565b610b2e610b29610b3392610b17565b6102cd565b610377565b90565b610b44641d1a94a200610b1a565b90565b610b4f610b36565b90565b34610b8257610b623660046102b0565b610b7e610b6d610b47565b610b756102a2565b918291826103da565b0390f35b6102a8565b73216e8577b504ac3db213edd261e47fffbb35424890565b610ba7610b87565b90565b34610bda57610bba3660046102b0565b610bd6610bc5610b9f565b610bcd6102a2565b9182918261032a565b0390f35b6102a8565b909182601f83011215610c195781359167ffffffffffffffff8311610c14576020019260608302840111610c0f57565b6107b1565b6107ad565b6107a9565b90602082820312610c4f575f82013567ffffffffffffffff8111610c4a57610c469201610bdf565b9091565b61049d565b6102ac565b610c68610c62366004610c1e565b90612509565b610c706102a2565b80610c7a8161082a565b0390f35b610c8a60255f9061044b565b90565b34610cbd57610c9d3660046102b0565b610cb9610ca8610c7e565b610cb06102a2565b9182918261032a565b0390f35b6102a8565b919091604081840312610d0357610cdb835f83016104b5565b92602082013567ffffffffffffffff8111610cfe57610cfa92016107b5565b9091565b61049d565b6102ac565b34610d3757610d21610d1b366004610cc2565b91612515565b610d296102a2565b80610d338161082a565b0390f35b6102a8565b610d473660046102b0565b610d4f61267d565b610d576102a2565b80610d618161082a565b0390f35b90565b610d7c610d77610d8192610d65565b6102cd565b610377565b90565b610d926436b7176e00610d68565b90565b610d9d610d84565b90565b34610dd057610db03660046102b0565b610dcc610dbb610d95565b610dc36102a2565b918291826103da565b0390f35b6102a8565b73bc6eeb5111fea2b5e9b2bc534bbcbca9568999a490565b610df5610dd5565b90565b34610e2857610e083660046102b0565b610e24610e13610ded565b610e1b6102a2565b9182918261032a565b0390f35b6102a8565b90565b610e44610e3f610e4992610e2d565b6102cd565b610377565b90565b610e757f07c57cd4c9cf16ca3d66aa50278e7e4e2baeb55562f81553573cff7bdbeb3bcc610e30565b90565b610e80610e4c565b90565b34610eb357610e933660046102b0565b610eaf610e9e610e78565b610ea66102a2565b918291826103da565b0390f35b6102a8565b73409f85d2207796b543b8abdb6a0e2490bb1483d190565b610ed8610eb8565b90565b34610f0b57610eeb3660046102b0565b610f07610ef6610ed0565b610efe6102a2565b9182918261032a565b0390f35b6102a8565b90565b610f23906008610f289302610424565b610f10565b90565b90610f369154610f13565b90565b610f45600d5f90610f2b565b90565b34610f7857610f583660046102b0565b610f74610f63610f39565b610f6b6102a2565b918291826103da565b0390f35b6102a8565b610f8681610311565b03610f8d57565b5f80fd5b90503590610f9e82610f7d565b565b91606083830312610fed57610fb7825f8501610f91565b92610fc583602083016104b5565b92604082013567ffffffffffffffff8111610fe857610fe492016107b5565b9091565b61049d565b6102ac565b346110245761100e611005366004610fa0565b92919091612b2f565b6110166102a2565b806110208161082a565b0390f35b6102a8565b90565b61104061103b61104592611029565b6102cd565b610377565b90565b6110717f052b2366397e911659836f1304d4fa9bf55188c0152ad2ff42fadc77a757b43461102c565b90565b61107c611048565b90565b346110af5761108f3660046102b0565b6110ab61109a611074565b6110a26102a2565b918291826103da565b0390f35b6102a8565b346110e4576110e06110cf6110ca3660046104c4565b612d3a565b6110d76102a2565b918291826103da565b0390f35b6102a8565b90565b6111006110fb611105926110e9565b6102cd565b610377565b90565b6111317f025ee41b0f85758eab738070b553e0f966776481df6d3bc4c57858909080ca016110ec565b90565b61113c611108565b90565b3461116f5761114f3660046102b0565b61116b61115a611134565b6111626102a2565b918291826103da565b0390f35b6102a8565b7310cbbbb225bbea137ac01f0f6d91cdb126bccaa690565b611194611174565b90565b346111c7576111a73660046102b0565b6111c36111b261118c565b6111ba6102a2565b9182918261032a565b0390f35b6102a8565b735ebb994ebc1c44815fbf2fa61a6e1f8368dcb0c790565b6111ec6111cc565b90565b3461121f576111ff3660046102b0565b61121b61120a6111e4565b6112126102a2565b9182918261032a565b0390f35b6102a8565b61123060265f9061044b565b90565b34611263576112433660046102b0565b61125f61124e611224565b6112566102a2565b9182918261032a565b0390f35b6102a8565b346112995761129561128461127e366004610863565b90612d8e565b61128c6102a2565b918291826103da565b0390f35b6102a8565b90565b6112b56112b06112ba9261129e565b6102cd565b610377565b90565b6112cc650474dec268006112a1565b90565b6112d76112bd565b90565b3461130a576112ea3660046102b0565b6113066112f56112cf565b6112fd6102a2565b918291826103da565b0390f35b6102a8565b90565b61132661132161132b9261130f565b6102cd565b610377565b90565b61133c64590ec6d100611312565b90565b61134761132e565b90565b3461137a5761135a3660046102b0565b61137661136561133f565b61136d6102a2565b918291826103da565b0390f35b6102a8565b61138e650474dec268006112a1565b90565b61139961137f565b90565b346113cc576113ac3660046102b0565b6113c86113b7611391565b6113bf6102a2565b918291826103da565b0390f35b6102a8565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61141261141b60209361142093611409816113d1565b938480936113d5565b958691016113de565b6113e9565b0190565b6114399160208201915f8184039101526113f3565b90565b3461146c576114686114576114523660046104c4565b612f74565b61145f6102a2565b91829182611424565b0390f35b6102a8565b634e487b7160e01b5f52604160045260245ffd5b9061148f906113e9565b810190811067ffffffffffffffff8211176114a957604052565b611471565b906114c16114ba6102a2565b9283611485565b565b67ffffffffffffffff81116114e1576114dd6020916113e9565b0190565b611471565b906114f86114f3836114c3565b6114ae565b918252565b5f7f537461726b45782d494d582d4d6967726174696f6e2d312e302e300000000000910152565b61152e601b6114e6565b9061153b602083016114fd565b565b611545611524565b90565b61155061153d565b90565b61155b611548565b90565b5190565b60209181520190565b61158a611593602093611598936115818161155e565b93848093611562565b958691016113de565b6113e9565b0190565b6115b19160208201915f81840391015261156b565b90565b346115e4576115c43660046102b0565b6115e06115cf611553565b6115d76102a2565b9182918261159c565b0390f35b6102a8565b5f80fd5b5f90565b61160561160061160a92610377565b6102cd565b610377565b90565b90611617906115f1565b5f5260205260405f2090565b5f1c90565b61163461163991611623565b610428565b90565b6116469054611628565b90565b90565b61166061165b61166592611649565b6102cd565b6102c2565b90565b6116719061164c565b90565b90565b61168b61168661169092611674565b6102cd565b610377565b90565b6116a260018060a01b03611677565b90565b6116b96116b46116be92610377565b6102cd565b6102c2565b90565b6116c96115ed565b506116de6116d96018839061160d565b61163c565b806116f96116f36116ee5f611668565b610311565b91610311565b0361174657508061171b6117158361170f611693565b16610377565b91610377565b145f146117375761172e611733916116a5565b610a1d565b5b90565b506117415f611668565b611734565b905090565b5f90565b61175761174b565b505f90565b90565b67ffffffffffffffff1690565b61178061177b6117859261175c565b6102cd565b61175f565b90565b60401c90565b60ff1690565b6117a06117a591611788565b61178e565b90565b6117b29054611794565b90565b67ffffffffffffffff1690565b6117ce6117d391611623565b6117b5565b90565b6117e090546117c2565b90565b5f1b90565b906117fb67ffffffffffffffff916117e3565b9181191691161790565b61181961181461181e9261175f565b6102cd565b61175f565b90565b90565b9061183961183461184092611805565b611821565b82546117e8565b9055565b60401b90565b9061185e68ff000000000000000091611844565b9181191691161790565b61187190610652565b90565b90565b9061188c61188761189392611868565b611874565b825461184a565b9055565b6118a09061175f565b9052565b91906118b7905f60208501940190611897565b565b906118c4600261176c565b916118cd612faf565b906118d95f83016117a8565b801561196a575b61194e576119139261190a916118f8865f8601611824565b61190560015f8601611877565b611a98565b5f809101611877565b6119497fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916119406102a2565b918291826118a4565b0390a1565b5f63f92ee8a960e01b8152806119666004820161082a565b0390fd5b506119765f83016117d6565b6119886119828661175f565b9161175f565b10156118e0565b90611999906115f1565b5f5260205260405f2090565b906119af906115f1565b5f5260205260405f2090565b6119c76119cc91611623565b610f10565b90565b6119d990546119bb565b90565b634e487b7160e01b5f52601160045260245ffd5b6119ff611a0591939293610377565b92610377565b8201809211611a1057565b6119dc565b90611a215f19916117e3565b9181191691161790565b90565b90611a43611a3e611a4a926115f1565b611a2b565b8254611a15565b9055565b90611a5f60018060a01b03916117e3565b9181191691161790565b611a7290610a1d565b90565b90565b90611a8d611a88611a9492611a69565b611a75565b8254611a4e565b9055565b5050611ae1611aa561137f565b611adb611acc611abe6008611ab8610aab565b9061198f565b611ac66106cd565b906119a5565b91611ad6836119cf565b6119f0565b90611a2e565b611b28611aec610b36565b611b22611b13611b056008611aff610396565b9061198f565b611b0d6106cd565b906119a5565b91611b1d836119cf565b6119f0565b90611a2e565b611b6f611b33610758565b611b69611b5a611b4c6008611b46611048565b9061198f565b611b546106cd565b906119a5565b91611b64836119cf565b6119f0565b90611a2e565b611bb6611b7a6112bd565b611bb0611ba1611b936008611b8d610e4c565b9061198f565b611b9b6106cd565b906119a5565b91611bab836119cf565b6119f0565b90611a2e565b611bfd611bc161132e565b611bf7611be8611bda6008611bd46108e3565b9061198f565b611be26106cd565b906119a5565b91611bf2836119cf565b6119f0565b90611a2e565b611c44611c0861096d565b611c3e611c2f611c216008611c1b611108565b9061198f565b611c296106cd565b906119a5565b91611c39836119cf565b6119f0565b90611a2e565b611c8b611c4f610d84565b611c85611c76611c686008611c626105e6565b9061198f565b611c706106cd565b906119a5565b91611c80836119cf565b6119f0565b90611a2e565b611ca6611ca16018611c9b610aab565b9061160d565b61163c565b611cc0611cba611cb55f611668565b610311565b91610311565b14611f1a575b611ce1611cdc6018611cd6610396565b9061160d565b61163c565b611cfb611cf5611cf05f611668565b610311565b91610311565b14611ef2575b611d1c611d176018611d11611048565b9061160d565b61163c565b611d36611d30611d2b5f611668565b610311565b91610311565b14611eca575b611d57611d526018611d4c610e4c565b9061160d565b61163c565b611d71611d6b611d665f611668565b610311565b91610311565b14611ea2575b611d92611d8d6018611d876108e3565b9061160d565b61163c565b611dac611da6611da15f611668565b610311565b91610311565b14611e7a575b611dcd611dc86018611dc2611108565b9061160d565b61163c565b611de7611de1611ddc5f611668565b610311565b91610311565b14611e52575b611e08611e036018611dfd6105e6565b9061160d565b61163c565b611e22611e1c611e175f611668565b610311565b91610311565b14611e2a575b565b611e4d611e35610dd5565b611e486018611e426105e6565b9061160d565b611a78565b611e28565b611e75611e5d61056f565b611e706018611e6a611108565b9061160d565b611a78565b611ded565b611e9d611e85610517565b611e986018611e926108e3565b9061160d565b611a78565b611db2565b611ec5611ead610eb8565b611ec06018611eba610e4c565b9061160d565b611a78565b611d77565b611eed611ed5611174565b611ee86018611ee2611048565b9061160d565b611a78565b611d3c565b611f15611efd610b87565b611f106018611f0a610396565b9061160d565b611a78565b611d01565b611f3d611f256111cc565b611f386018611f32610aab565b9061160d565b611a78565b611cc6565b90611f4c916118b9565b565b611f5790610a01565b90565b611f6390611f4e565b90565b5f7f4e4f4e5f46554e4749424c455f41535345545f54595045000000000000000000910152565b611f9a6017602092611562565b611fa381611f66565b0190565b611fbc9060208101905f818303910152611f8d565b90565b15611fc657565b611fce6102a2565b62461bcd60e51b815280611fe460048201611fa7565b0390fd5b611ffc611ff761200192611649565b6102cd565b610377565b90565b5f7f4e4f5f50454e44494e475f5749544844524157414c0000000000000000000000910152565b6120386015602092611562565b61204181612004565b0190565b61205a9060208101905f81830391015261202b565b90565b1561206457565b61206c6102a2565b62461bcd60e51b81528061208260048201612045565b0390fd5b61208f90610a1d565b90565b61209b90612086565b9052565b909594926120ea946120d96120e3926120cf6080966120c560a088019c5f8901906103cd565b60208701906103cd565b60408501906103cd565b60608301906103cd565b0190612092565b565b906120fe6120f98361303c565b611f5a565b61210f61210a836130e6565b611fbf565b6121c182936121756121356121306121296008859061198f565b88906119a5565b6119cf565b956121528761214c6121465f611fe8565b91610377565b1161205d565b61217061215e5f611fe8565b9161216b6008869061198f565b6119a5565b611a2e565b612181838587916133f4565b9161218d848690613697565b947fb7477a7b93b2addc5272bbd7ad0986ef1c0d0bd265f26c3dc4bbe42727c2ac0c956121b86102a2565b9586958661209f565b0390a1565b906121d8916121d36136df565b612205565b6121e0613754565b565b156121e957565b5f636e7e1ba960e11b8152806122016004820161082a565b0390fd5b906122349161222f3361222961222361221e602761163c565b610311565b91610311565b146121e2565b61230d565b565b5090565b1561224157565b5f635091728960e01b8152806122596004820161082a565b0390fd5b60016122699101610377565b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015612290576060020190565b61226c565b3561229f81610f7d565b90565b356122ac816104a1565b90565b156122b657565b5f63dd3bd7d760e01b8152806122ce6004820161082a565b0390fd5b6122db90610a01565b90565b6122e7906122d2565b90565b156122f157565b5f631733f9d760e01b8152806123096004820161082a565b0390fd5b9061233461231c838390612236565b61232e6123285f611fe8565b91610377565b1161223a565b61233d5f611fe8565b916123475f611fe8565b5b8061236561235f61235a858790612236565b610377565b91610377565b10156124e857612468906123855f61237f85878591612280565b01612295565b61239c602061239686888691612280565b016122a2565b6123c16123b660406123b0888a8891612280565b016122a2565b9291929788906119f0565b966123df886123d86123d234610377565b91610377565b11156122af565b816123f96123f36123ee6102f8565b610311565b91610311565b145f1461246d5761240b915082613a31565b612415602661163c565b339061245f61244d6124477f680cdeb18e0632eaae1727127d3005efb3ea5dba23e34446c9e94cf2cf5f557793611a69565b93611a69565b936124566102a2565b918291826103da565b0390a35b61225d565b612348565b6124839061247a836122de565b90849091613854565b61248d602661163c565b33916124e06124ce6124c86124c27fbaffede578523e7bb616324498f96acc5cd38e6c6168c976d67866fb78ea958d94611a69565b94611a69565b94611a69565b946124d76102a2565b918291826103da565b0390a4612463565b505050612507906125016124fb34610377565b91610377565b146122ea565b565b90612513916121c6565b565b9091612525923392909192612b2f565b565b61252f6136df565b612537612541565b61253f613754565b565b6125663361256061255a612555602761163c565b610311565b91610311565b146121e2565b61256e6125dd565b565b61257c61258191611623565b6109c1565b90565b61258e9054612570565b90565b5f80fd5b60e01b90565b5f9103126125a557565b6102ac565b9160206125cb9294936125c460408201965f8301906103cd565b019061031d565b565b6125d56102a2565b3d5f823e3d90fd5b6125ef6125ea6028612584565b610a29565b63168b5ab73491909190612603600d6119cf565b903393813b15612678575f9361262a9161263561261e6102a2565b97889687958694612595565b8452600484016125aa565b03925af1801561267357612647575b50565b612666905f3d811161266c575b61265e8183611485565b81019061259b565b5f612644565b503d612654565b6125cd565b612591565b612685612527565b565b5f7f494e56414c49445f535441524b5f4b4559000000000000000000000000000000910152565b6126bb6011602092611562565b6126c481612687565b0190565b6126dd9060208101905f8183039101526126ae565b90565b156126e757565b6126ef6102a2565b62461bcd60e51b815280612705600482016126c8565b0390fd5b90565b61272061271b61272592612709565b6102cd565b610377565b90565b61273f600167080000000000001160c01b0161270c565b90565b5f7f494e56414c49445f4554485f4144445245535300000000000000000000000000910152565b6127766013602092611562565b61277f81612742565b0190565b6127989060208101905f818303910152612769565b90565b156127a257565b6127aa6102a2565b62461bcd60e51b8152806127c060048201612783565b0390fd5b5f7f535441524b5f4b45595f554e415641494c41424c450000000000000000000000910152565b6127f86015602092611562565b612801816127c4565b0190565b61281a9060208101905f8183039101526127eb565b90565b1561282457565b61282c6102a2565b62461bcd60e51b81528061284260048201612805565b0390fd5b5090565b90565b61286161285c6128669261284a565b6102cd565b610377565b90565b5f7f494e56414c49445f535441524b5f5349474e41545552455f4c454e4754480000910152565b61289d601e602092611562565b6128a681612869565b0190565b6128bf9060208101905f818303910152612890565b90565b156128c957565b6128d16102a2565b62461bcd60e51b8152806128e7600482016128aa565b0390fd5b5f80fd5b67ffffffffffffffff811161290d576129096020916113e9565b0190565b611471565b90825f939282370152565b9092919261293261292d826128ef565b6114ae565b9381855260208501908284011161294e5761294c92612912565b565b6128eb565b61295e91369161291d565b90565b9050519061296e826104a1565b565b90916060828403126129a5576129a261298b845f8501612961565b936129998160208601612961565b93604001612961565b90565b6102ac565b905090565b5f7f55736572526567697374726174696f6e3a000000000000000000000000000000910152565b6129e2601180926129aa565b6129eb816129af565b0190565b60601b90565b6129fe906129ef565b90565b612a0a906129f5565b90565b612a19612a1e91610311565b612a01565b9052565b90565b612a31612a3691610377565b612a22565b9052565b601460209392612a56612a4f612a5e946129d6565b8092612a0d565b018092612a25565b0190565b60200190565b612a74612a7991611623565b6115f1565b90565b90565b612a93612a8e612a9892612a7c565b6102cd565b610377565b90565b612ac47f0800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f612a7f565b90565b634e487b7160e01b5f52601260045260245ffd5b612ae7612aed91610377565b91610377565b908115612af8570690565b612ac7565b604090612b26612b2d9496959396612b1c60608401985f85019061031d565b60208301906103cd565b019061031d565b565b91612c15612c8d9294612c2b92612b5987612b52612b4c5f611fe8565b91610377565b14156126e0565b612b7c87612b76612b70612b6b612728565b610377565b91610377565b106126e0565b612ba186612b9a612b94612b8f5f611668565b610311565b91610311565b141561279b565b612bd8612bb8612bb360188a9061160d565b61163c565b612bd2612bcc612bc75f611668565b610311565b91610311565b1461281d565b612be9612be488613b7a565b6126e0565b612c10612bf7828490612846565b612c0a612c04606061284d565b91610377565b146128c2565b612953565b6020612c20826113d1565b818301019101612970565b90612c84612c7686612c5e8991612c4f612c436102a2565b93849260208401612a3a565b60208201810382520382611485565b612c70612c6a826113d1565b91612a62565b20612a68565b612c7e612a9b565b90612adb565b92869293613fb8565b612ca281612c9d6018859061160d565b611a78565b903391612cdb7fcab1cf17c190e4e2195a7b8f7b362023246fa774390432b4704ab6b29d56b07b93612cd26102a2565b93849384612afd565b0390a1565b5f90565b90612cee906115f1565b5f5260205260405f2090565b612d06612d0b91611623565b61178e565b90565b612d189054612cfa565b90565b90565b612d32612d2d612d3792612d1b565b6102cd565b610377565b90565b612d42612ce0565b50612d60612d5a612d5560158490612ce4565b612d0e565b15610652565b5f14612d755750612d716001612d1e565b905b565b612d83612d889160166119a5565b6119cf565b90612d73565b612db7612db2612dbd93612da0612ce0565b50612dad8194600861198f565b6119a5565b6119cf565b90613697565b90565b606090565b5f7f41535345545f545950455f4e4f545f5245474953544552454400000000000000910152565b612df96019602092611562565b612e0281612dc5565b0190565b612e1b9060208101905f818303910152612dec565b90565b15612e2557565b612e2d6102a2565b62461bcd60e51b815280612e4360048201612e06565b0390fd5b90612e51906115f1565b5f5260205260405f2090565b634e487b7160e01b5f52602260045260245ffd5b9060016002830492168015612e91575b6020831014612e8c57565b612e5d565b91607f1691612e81565b60209181520190565b5f5260205f2090565b905f9291805490612ec7612ec083612e71565b8094612e9b565b916001811690815f14612f1e5750600114612ee2575b505050565b612eef9192939450612ea4565b915f925b818410612f0657505001905f8080612edd565b60018160209295939554848601520191019290612ef3565b92949550505060ff19168252151560200201905f8080612edd565b90612f4391612ead565b90565b90612f66612f5f92612f566102a2565b93848092612f39565b0383611485565b565b612f7190612f46565b90565b612fa7612fac91612f83612dc0565b50612fa0612f9b612f9660158490612ce4565b612d0e565b612e1e565b6014612e47565b612f68565b90565b612fb76142a4565b90565b5f7f555345525f554e52454749535445524544000000000000000000000000000000910152565b612fee6011602092611562565b612ff781612fba565b0190565b6130109060208101905f818303910152612fe1565b90565b1561301a57565b6130226102a2565b62461bcd60e51b81528061303860048201612ffb565b0390fd5b61304e906130486115ed565b506116c1565b906130748261306d6130676130625f611668565b610311565b91610311565b1415613013565b565b63ffffffff60e01b1690565b61308b90613076565b90565b6130b77f8322fff276cdf3f5716784c2e78b276d0d5cf1781fe7a7984e8bff96f75632c6613082565b90565b6130e37ff47261b06eedbfce68afd46d0f3c27c60b03faad319eaf33103611cf8f6456ad613082565b90565b6130f8906130f261174b565b506142bc565b8061311261310c61310761308e565b613076565b91613076565b1490811561311f575b5090565b905061313a61313461312f6130ba565b613076565b91613076565b145f61311b565b5f7f494e56414c49445f524543495049454e54000000000000000000000000000000910152565b6131756011602092611562565b61317e81613141565b0190565b6131979060208101905f818303910152613168565b90565b156131a157565b6131a96102a2565b62461bcd60e51b8152806131bf60048201613182565b0390fd5b5f7f554e535550504f525445445f544f4b454e5f5459504500000000000000000000910152565b6131f76016602092611562565b613200816131c3565b0190565b6132199060208101905f8183039101526131ea565b90565b61322590610a01565b90565b6132319061321c565b90565b61323d90610a1d565b90565b61324990610a1d565b90565b9060208282031261326557613262915f01612961565b90565b6102ac565b63ffffffff1690565b61328761328261328c9261326a565b612595565b613076565b90565b613298906102c2565b90565b6132a49061328f565b9052565b9160206132c99294936132c260408201965f83019061329b565b01906103cd565b565b5f7f554e444552464c4f570000000000000000000000000000000000000000000000910152565b6132ff6009602092611562565b613308816132cb565b0190565b6133219060208101905f8183039101526132f2565b90565b1561332b57565b6133336102a2565b62461bcd60e51b8152806133496004820161330c565b0390fd5b61335c61336291939293610377565b92610377565b820391821161336d57565b6119dc565b5f7f494e434f52524543545f414d4f554e545f5452414e5346455252454400000000910152565b6133a6601c602092611562565b6133af81613372565b0190565b6133c89060208101905f818303910152613399565b90565b156133d257565b6133da6102a2565b62461bcd60e51b8152806133f0600482016133b3565b0390fd5b909161341b8261341461340e6134095f611668565b610311565b91612086565b141561319a565b613426838290613697565b90613430846142d9565b5f146135fd576134486134425f611fe8565b91610377565b146135f85761345961349f93614448565b61346281613228565b602061346d82613234565b6370a082319061349461347f30613240565b926134886102a2565b998a9485938493612595565b83526004830161032a565b03915afa9081156135f35761350460209360046134fe6135099561353b9a5f916135c6575b50986134f06134d663a9059cbb613273565b918a906134e16102a2565b9586948c8601908152016132a8565b888201810382520382611485565b906145da565b613234565b6370a082319061353061351b30613240565b926135246102a2565b97889485938493612595565b83526004830161032a565b03915afa80156135c15761357f61358a9261358492613590965f91613593575b506135798161357261356c89610377565b91610377565b1115613324565b9461334d565b610377565b91610377565b146133cb565b5b565b6135b4915060203d81116135ba575b6135ac8183611485565b81019061324c565b5f61355b565b503d6135a2565b6125cd565b6135e69150883d81116135ec575b6135de8183611485565b81019061324c565b5f6134c4565b503d6135d4565b6125cd565b505050565b90919261360990614308565b5f146136405761362161361b5f611fe8565b91610377565b1461363c5761363261363792612086565b614419565b613591565b5050565b6136486102a2565b62461bcd60e51b81528061365e60048201613204565b0390fd5b61367161367791939293610377565b92610377565b91613683838202610377565b92818404149015171561369257565b6119dc565b906136ad6136b3926136a7612ce0565b50612d3a565b90613662565b90565b6136ca6136c56136cf9261175c565b6102cd565b610377565b90565b6136dc60026136b6565b90565b6136f1680100000000000000006119cf565b61370a6137046136ff6136d2565b610377565b91610377565b1461372b5761372961371a6136d2565b68010000000000000000611a2e565b565b5f633ee5aeb560e01b8152806137436004820161082a565b0390fd5b6137516001612d1e565b90565b61376e61375f613747565b68010000000000000000611a2e565b565b61377990610a1d565b90565b1561378357565b5f63e6c4247b60e01b81528061379b6004820161082a565b0390fd5b156137a657565b5f63162908e360e11b8152806137be6004820161082a565b0390fd5b6137cb90610a1d565b90565b156137d557565b5f6312d5633960e31b8152806137ed6004820161082a565b0390fd5b6137fa90610a01565b90565b613806906137f1565b90565b61381290610a1d565b90565b61381e90613770565b9052565b60409061384b613852949695939661384160608401985f850190613815565b602083019061031d565b01906103cd565b565b91909161388461386382613770565b61387d6138776138725f611668565b610311565b91610311565b141561377c565b6138a08361389a6138945f611fe8565b91610377565b1161379f565b6138e060206138ae83613770565b6370a08231906138d56138c0306137c2565b926138c96102a2565b95869485938493612595565b83526004830161032a565b03915afa8015613a095761390f915f916139db575b5061390861390286610377565b91610377565b10156137ce565b61393461392361391e83613770565b613228565b61392d602561163c565b8591614691565b61394e613949613944602561163c565b6137fd565b613809565b9163f213159c90929092613962602661163c565b9490823b156139d6575f946139936139889361397c6102a2565b98899788968795612595565b855260048501613822565b03925af180156139d1576139a5575b50565b6139c4905f3d81116139ca575b6139bc8183611485565b81019061259b565b5f6139a2565b503d6139b2565b6125cd565b612591565b6139fc915060203d8111613a02575b6139f48183611485565b81019061324c565b5f6138f5565b503d6139ea565b6125cd565b916020613a2f929493613a2860408201965f83019061031d565b01906103cd565b565b90613a4e82613a48613a425f611fe8565b91610377565b1161379f565b613a7e613a5a306137c2565b31613a77613a71613a6c8686906119f0565b610377565b91610377565b10156137ce565b613a98613a93613a8e602561163c565b6137fd565b613809565b91613aa863e041043292826119f0565b92919291613ab6602661163c565b9193813b15613b2a575f93613adc91613ae7613ad06102a2565b97889687958694612595565b845260048401613a0e565b03925af18015613b2557613af9575b50565b613b18905f3d8111613b1e575b613b108183611485565b81019061259b565b5f613af6565b503d613b06565b6125cd565b612591565b90565b613b46613b41613b4b92613b2f565b6102cd565b610377565b90565b613b777f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b613b8261174b565b508081613b8d612728565b918215613bea570981613b9e612728565b918215613be5570990613baf612728565b918215613be05708613bbf613b4e565b613bc7612728565b908115613bdb57613bd8920861476f565b90565b612ac7565b612ac7565b612ac7565b612ac7565b5f7f6d736748617368206f7574206f662072616e6765000000000000000000000000910152565b613c236014602092611562565b613c2c81613bef565b0190565b613c459060208101905f818303910152613c16565b90565b15613c4f57565b613c576102a2565b62461bcd60e51b815280613c6d60048201613c30565b0390fd5b5f7f73206f7574206f662072616e6765000000000000000000000000000000000000910152565b613ca5600e602092611562565b613cae81613c71565b0190565b613cc79060208101905f818303910152613c98565b90565b15613cd157565b613cd96102a2565b62461bcd60e51b815280613cef60048201613cb2565b0390fd5b90565b613d0a613d05613d0f92613cf3565b6102cd565b610377565b90565b613d1c60fb613cf6565b90565b1b90565b613d4290613d3c613d36613d4794610377565b91610377565b90613d1f565b610377565b90565b5f7f72206f7574206f662072616e6765000000000000000000000000000000000000910152565b613d7e600e602092611562565b613d8781613d4a565b0190565b613da09060208101905f818303910152613d71565b90565b15613daa57565b613db26102a2565b62461bcd60e51b815280613dc860048201613d8b565b0390fd5b5f7f77206f7574206f662072616e6765000000000000000000000000000000000000910152565b613e00600e602092611562565b613e0981613dcc565b0190565b613e229060208101905f818303910152613df3565b90565b15613e2c57565b613e346102a2565b62461bcd60e51b815280613e4a60048201613e0d565b0390fd5b613e65600167080000000000001160c01b0161270c565b90565b613e917f06f21413efbe40de150e596d72f7a8c5609ad26c15c915c1f4cdfcb99cee9e89613b32565b90565b90565b613eab613ea6613eb092613e94565b6102cd565b610377565b90565b613edc7f01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca613e97565b90565b90565b613ef6613ef1613efb92613edf565b6102cd565b610377565b90565b613f267e5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f613ee2565b90565b613f336001612d1e565b90565b5f7f494e56414c49445f535441524b5f5349474e4154555245000000000000000000910152565b613f6a6017602092611562565b613f7381613f36565b0190565b613f8c9060208101905f818303910152613f5d565b90565b15613f9657565b613f9e6102a2565b62461bcd60e51b815280613fb460048201613f77565b0390fd5b90929161401f90613fec613fd484613fce612a9b565b90612adb565b613fe6613fe086610377565b91610377565b14613c48565b6001614000613ffa83610377565b91612d1e565b11158061422c575b61401190613cca565b614019612a9b565b90614849565b91600161403461402e86610377565b91612d1e565b1115806141f3575b61404590613da3565b600161405961405385610377565b91612d1e565b1115806141ba575b61406a90613e25565b8081614074613e4e565b9182156141b5570981614085613e4e565b9182156141b05709928586614098613e4e565b9182156141ab570993826140aa613e4e565b9182156141a65708936140bb613e68565b966140c4613e4e565b9384156141a15761415861413a61419397614101614175966140fb6140f561419f9f9b61418c9c6141999f08610377565b91610377565b146126e0565b614109612ce0565b50614112612ce0565b5061411b613eb3565b614123613efe565b61412b613f29565b91614134613e4e565b9361494c565b929092938a9190614149613f29565b91614152613e4e565b9361494c565b919091909291614166613f29565b9261416f613e4e565b94614993565b61417d613f29565b91614186613e4e565b9361494c565b5092610377565b91610377565b14613f8f565b565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b5061406a836141eb6141e56141e060016141db6141d5613d12565b91612d1e565b613d23565b610377565b91610377565b109050614061565b506140458461422461421e614219600161421461420e613d12565b91612d1e565b613d23565b610377565b91610377565b10905061403c565b506140118161424a61424461423f612a9b565b610377565b91610377565b109050614008565b5f90565b90565b90565b61427061426b61427592614256565b6117e3565b614259565b90565b6142a17ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061425c565b90565b6142ac614252565b506142b5614278565b90565b5f90565b6142d16142d6916142cb6142b8565b50612f74565b614a91565b90565b6142eb906142e561174b565b506142bc565b6143046142fe6142f96130ba565b613076565b91613076565b1490565b61431a9061431461174b565b506142bc565b61433361432d61432861308e565b613076565b91613076565b1490565b905090565b6143475f8092614337565b0190565b6143549061433c565b90565b90614369614364836128ef565b6114ae565b918252565b3d5f146143895761437e3d614357565b903d5f602084013e5b565b614391612dc0565b90614387565b5f7f4554485f5452414e534645525f4641494c454400000000000000000000000000910152565b6143cb6013602092611562565b6143d481614397565b0190565b6143ed9060208101905f8183039101526143be565b90565b156143f757565b6143ff6102a2565b62461bcd60e51b815280614415600482016143d8565b0390fd5b5f614446928192906144296102a2565b90816144348161434b565b03925af161444061436e565b506143f0565b565b61445d614462916144576115ed565b50612f74565b614b1f565b90565b5f7f4241445f544f4b454e5f41444452455353000000000000000000000000000000910152565b6144996011602092611562565b6144a281614465565b0190565b6144bb9060208101905f81830391015261448c565b90565b156144c557565b6144cd6102a2565b62461bcd60e51b8152806144e3600482016144a6565b0390fd5b90565b156144f25750565b614513906144fe6102a2565b91829162461bcd60e51b83526004830161159c565b0390fd5b61452081610652565b0361452757565b5f80fd5b9050519061453882614517565b565b9060208282031261455357614550915f0161452b565b90565b6102ac565b5f7f544f4b454e5f4f5045524154494f4e5f4641494c454400000000000000000000910152565b61458c6016602092611562565b61459581614558565b0190565b6145ae9060208101905f81830391015261457f565b90565b156145b857565b6145c06102a2565b62461bcd60e51b8152806145d660048201614599565b0390fd5b5f9182916145ef6145ea82614b50565b6144be565b9082602082019151925af161461561460561436e565b9161460f836144e7565b906144ea565b61461e816113d1565b61463061462a5f611fe8565b91610377565b11614639575b50565b61465661465b91602061464b826113d1565b81830101910161453a565b6145b1565b5f614636565b61466a90611fe8565b9052565b91602061468f92949361468860408201965f83019061031d565b0190614661565b565b90916146d46004916146c563095ea7b36146ac879391613273565b926146b56102a2565b9586946020860190815201613a0e565b60208201810382520382611485565b906146e96146e3828490614b79565b15610652565b6146f3575b505050565b61474060046147459461473b849161472c63095ea7b36147135f91613273565b9261471c6102a2565b968794602086019081520161466e565b60208201810382520383611485565b614c1b565b614c1b565b5f80806146ee565b61475961475f91610377565b91610377565b90811561476a570490565b612ac7565b61477761174b565b506147c36147bd6147b86001936147b26147a2614792612728565b61479c6001612d1e565b9061334d565b6147ac60026136b6565b9061474d565b90614e06565b610377565b91612d1e565b1490565b5f7f496e76616c6964206e756d626572000000000000000000000000000000000000910152565b6147fb600e602092611562565b614804816147c7565b0190565b61481d9060208101905f8183039101526147ee565b90565b1561482757565b61482f6102a2565b62461bcd60e51b81528061484560048201614808565b0390fd5b614851612ce0565b508061486561485f5f611fe8565b91610377565b141580614931575b80614911575b61487c90614820565b6148855f611fe8565b61488f6001612d1e565b8390614899612ce0565b505b836148ae6148a85f611fe8565b91610377565b14614909576148be82859061474d565b81939186829188908115614904576148d793099061334d565b918680156148ff576148f8936148f292089495809492613662565b9061334d565b929161489b565b612ac7565b612ac7565b505091505090565b5061487c826149286149225f611fe8565b91610377565b14159050614873565b508061494561493f84610377565b91610377565b141561486d565b9161498d94939161497f9361495f612ce0565b50614968612ce0565b509091600193926149798795612d1e565b92614e8f565b929190929092909192614fa9565b91909190565b92909493916149a0612ce0565b506149a9612ce0565b506149b35f611fe8565b506149bd5f611fe8565b506149c75f611fe8565b50836149db6149d583610377565b91610377565b145f14614a595750849084918215614a545708614a006149fa5f611fe8565b91610377565b145f14614a2357505050505f90614a20614a1a5f93611fe8565b92611fe8565b90565b614a4e93614a3f9260019291614a398694612d1e565b9161586c565b92919290925b92909192614fa9565b91909190565b612ac7565b915093614a4e94614a879391906001939091600190614a81614a7b8997612d1e565b92612d1e565b9461514d565b9291929092614a45565b602090614a9c6142b8565b50015163ffffffff60e01b1690565b90565b614ac2614abd614ac792614aab565b6102cd565b610377565b90565b614ad46020614aae565b90565b90565b614aee614ae9614af392614ad7565b6102cd565b610377565b90565b614b006004614ada565b90565b614b1c614b0e614aca565b614b16614af6565b906119f0565b90565b614b48614b4d91614b2e6115ed565b50614b37614b03565b90614b40612ce0565b5001516116a5565b610a1d565b90565b614b5861174b565b50614b61612ce0565b503b614b75614b6f5f611fe8565b91610377565b1190565b905f602091614b8661174b565b50614b8f61174b565b50614b98612ce0565b50614ba1612ce0565b50828151910182855af13d915f51919283614bbd575b50505090565b90919250614bd3614bcd5f611fe8565b91610377565b145f14614c0157614be49150613234565b3b614bf7614bf15f611fe8565b91610377565b115b5f8080614bb7565b50614c15614c0f6001612d1e565b91610377565b14614bf9565b905f602091614c28612ce0565b50614c31612ce0565b50828151910182855af115614cc4573d5f5190614c56614c505f611fe8565b91610377565b145f14614caa5750614c6781613234565b3b614c7a614c745f611fe8565b91610377565b145b614c835750565b614c8f614ca691613234565b5f918291635274afe760e01b83526004830161032a565b0390fd5b614cbd614cb76001612d1e565b91610377565b1415614c7c565b6040513d5f823e3d90fd5b90565b614ce6614ce1614ceb92614ccf565b6102cd565b6102c2565b90565b614cf790614cd2565b90565b60ff1690565b614d14614d0f614d1992614aab565b6102cd565b614cfa565b90565b614d2590614d00565b9052565b9194614d71614d7b92989795614d6760a096614d5d614d829a614d5360c08a019e5f8b0190614d1c565b6020890190614d1c565b6040870190614d1c565b60608501906103cd565b60808301906103cd565b01906103cd565b565b5f7f4649454c445f504f575f4641494c454400000000000000000000000000000000910152565b614db86010602092611562565b614dc181614d84565b0190565b614dda9060208101905f818303910152614dab565b90565b15614de457565b614dec6102a2565b62461bcd60e51b815280614e0260048201614dc5565b0390fd5b5f8091614e8c93614e15612ce0565b50614e5c614e236005614cee565b92614e4d602091602094602091614e38612728565b92614e416102a2565b97889660208801614d29565b60208201810382520382611485565b602081019051915afa614e76614e7061436e565b91614ddd565b6020614e81826113d1565b81830101910161324c565b90565b9493929194614e9c612ce0565b50614ea5612ce0565b50614eae612ce0565b5080614ec2614ebc5f611fe8565b91610377565b14614f9b579590614ed25f611fe8565b95614edc5f611fe8565b93614ee76001612d1e565b985b80614efc614ef65f611fe8565b91610377565b14614f8a5780614f0c6001612d1e565b16614f1f614f195f611fe8565b91610377565b03614f5c575b90614f3e614f4a9392614f3860026136b6565b9061474d565b9391908791899361586c565b97919794909792979197949094614ee9565b97614f3e95829a614f4a9493614f7a93929187908692938d9561514d565b9a91969096999192935050614f25565b505050509250929050919291929190565b509150939150919291929190565b91614fcb9094939194614fba612ce0565b50614fc3612ce0565b508290614849565b918283839182156150095709908183918215615004570994929082918215614fff570990918215614ffa570990565b612ac7565b612ac7565b612ac7565b612ac7565b67ffffffffffffffff81116150235760200290565b611471565b6150346150399161500e565b6114ae565b90565b369037565b9061505f61504e83615028565b92615059849161500e565b9061503c565b565b61506b6004615041565b90565b50600490565b9061507e8261506e565b81101561508c576020020190565b61226c565b9061509b90610377565b9052565b6150a99051610377565b90565b90565b6150c36150be6150c8926150ac565b6102cd565b610377565b90565b5f7f557365206a6163446f75626c652066756e6374696f6e20696e73746561640000910152565b6150ff601e602092611562565b615108816150cb565b0190565b6151219060208101905f8183039101526150f2565b90565b1561512b57565b6151336102a2565b62461bcd60e51b8152806151496004820161510c565b0390fd5b92969495969390919361515e612ce0565b50615167612ce0565b50615170612ce0565b508361518461517e5f611fe8565b91610377565b1480615833575b61582457806151a261519c5f611fe8565b91610377565b148061580a575b6157fb576151b5615061565b9285868a9081156157f6576151dd92096151d8866151d25f611fe8565b90615074565b615091565b856151f96151f4866151ee5f611fe8565b90615074565b61509f565b8a9081156157f15761521f920961521a866152146001612d1e565b90615074565b615091565b87888a9081156157ec5761524792096152428661523c60026136b6565b90615074565b615091565b8761526461525f8661525960026136b6565b90615074565b61509f565b8a9081156157e75761528a92096152858661527f60036150af565b90615074565b615091565b6152946004615028565b946152b16152ac866152a660026136b6565b90615074565b61509f565b8a9081156157e2576152c692095f8701615091565b6152e26152dd856152d760036150af565b90615074565b61509f565b899081156157dd576152f8920960208601615091565b9061531461530f846153095f611fe8565b90615074565b61509f565b90889283156157d8576153499361534493615333920960408701615091565b9261533e6001612d1e565b90615074565b61509f565b869081156157d35761535f920960608301615091565b9361537b615376866153705f611fe8565b90615074565b61509f565b6153a86153a261539d6153988961539260026136b6565b90615074565b61509f565b610377565b91610377565b1415801561577d575b6153ba90615124565b6153c2615061565b936153df6153da876153d460026136b6565b90615074565b61509f565b615404836153fe6153f98a6153f35f611fe8565b90615074565b61509f565b9061334d565b839081156157785761542992086154248761541e5f611fe8565b90615074565b615091565b6154456154408761543a60036150af565b90615074565b61509f565b61546b836154656154608a61545a6001612d1e565b90615074565b61509f565b9061334d565b8390811561577357615491920861548c876154866001612d1e565b90615074565b615091565b6154ac6154a7866154a15f611fe8565b90615074565b61509f565b6154c76154c2876154bc5f611fe8565b90615074565b61509f565b8390811561576e576154ed92096154e8876154e260026136b6565b90615074565b615091565b615509615504866154fe60026136b6565b90615074565b61509f565b61552461551f876155195f611fe8565b90615074565b61509f565b839081156157695761554a92096155458761553f60036150af565b90615074565b615091565b6155666155618661555b6001612d1e565b90615074565b61509f565b61558261557d876155776001612d1e565b90615074565b61509f565b8391821561576457096155b1836155ab6155a6896155a060036150af565b90615074565b61509f565b9061334d565b8391821561575f5708826002906155d96155d48a6155ce5f611fe8565b90615074565b61509f565b6155f56155f08a6155ea60026136b6565b90615074565b61509f565b8691821561575a57098590811561575557615612615619946136b6565b099061334d565b8391821561575057089561563f61563a876156346001612d1e565b90615074565b61509f565b61565a6156558361564f5f611fe8565b90615074565b61509f565b6156766156718961566b60026136b6565b90615074565b61509f565b8591821561574b570961568a858a9061334d565b859182156157465708849182156157415709906156ba6156b585926156af6001612d1e565b90615074565b61509f565b906156d76156d2896156cc60036150af565b90615074565b61509f565b8590811561573c576156ea93099061334d565b90838015615737576157109261570b9208966157055f611fe8565b90615074565b61509f565b92908291821561573257099091821561572d570992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b506153ba61579d615798876157926001612d1e565b90615074565b61509f565b6157ca6157c46157bf6157ba8a6157b460036150af565b90615074565b61509f565b610377565b91610377565b141590506153b1565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b50509350909350919291929190565b508161581e6158185f611fe8565b91610377565b146151a9565b93509495505050919291929190565b50826158476158415f611fe8565b91610377565b1461518b565b90565b61586461585f6158699261584d565b6102cd565b610377565b90565b9492949390919361587b612ce0565b50615884612ce0565b5061588d612ce0565b50846158a161589b5f611fe8565b91610377565b14615a2357808183918215615a1e570995838484918215615a19570991868785918215615a145709906004908486918215615a0f570985918215615a0a576158e890614ada565b099760039085918215615a05576158fe906150af565b0991908085918215615a005709849182156159fb5709839182156159f65708958687849182156159f1570983829083869081156159ec5761594093089061334d565b849182156159e75708969061595684899061334d565b849182156159e25708839182156159dd5709908260089180859182156159d85709849081156159d35761598b61599294615850565b099061334d565b829182156159ce57089360029290829182156159c95709909182156159c4576159ba906136b6565b0992919291929190565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b612ac7565b919394505091929192919056fea26469706673582212204a8ceedf0a6e5779af79d8a3d2f095b858463d2ce2c27ec283955e6a75e31a8764736f6c634300081b0033","sourceMap":"868:4258:26:-:0;;;;;;;;;-1:-1:-1;868:4258:26;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;2068:51:25:-;2105:14;2113:5;2105:14;:::i;:::-;2068:51;:::o;:::-;;;:::i;:::-;;:::o;868:4258:26:-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1627:105::-;1666:66;;;:::i;:::-;1627:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;6314:31:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;2511:81::-;2550:42;2511:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;2769:81::-;2808:42;2769:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2922:105::-;2961:66;;;:::i;:::-;2922:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;998:125::-;1047:76;;;:::i;:::-;998:125;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2083:52::-;2125:10;;;:::i;:::-;2083:52;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2400:105::-;2439:66;;;:::i;:::-;2400:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2856:60::-;2898:18;;;:::i;:::-;2856:60;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;6473:47:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1368:105::-;1407:66;;;:::i;:::-;1368:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1825:54::-;1867:12;;;:::i;:::-;1825:54;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1738:81::-;1777:42;1738:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;6026:26:23;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3120:54::-;3162:12;;;:::i;:::-;3120:54;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;3033:81::-;3072:42;3033:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2141:105::-;2180:66;;;:::i;:::-;2141:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;2252:81::-;2291:42;2252:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::o;2670:24:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1885:105::-;1924:66;;;:::i;:::-;1885:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2658:105::-;2697:66;;;:::i;:::-;2658:105;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1996:81::-;2035:42;1996:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1479:81::-;1518:42;1479:81;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;6169:39:23:-;;;;;;:::i;:::-;;:::o;868:4258:26:-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2339:55::-;2381:13;;;:::i;:::-;2339:55;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;2598:54::-;2640:12;;;:::i;:::-;2598:54;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;1566:55::-;1608:13;;;:::i;:::-;1566:55;:::o;:::-;;;:::i;:::-;;:::o;868:4258::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;:::o;:::-;;;;:::i;:::-;;;;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;:::o;1299:62:22:-;1332:29;;:::i;:::-;1299:62;:::o;:::-;;;:::i;:::-;;:::o;868:4258:26:-;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;;;;:::i;:::-;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1433:55:22:-;1474:14;868:4258:26;;;;;1474:14:22;:::i;:::-;1433:55;:::o;1474:14::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;4503:314::-;4561:7;;:::i;:::-;4604;:17;;:7;4612:8;4604:17;;:::i;:::-;;:::i;:::-;4636:13;:29;;4653:12;4661:3;4653:12;:::i;:::-;4636:29;:::i;:::-;;;:::i;:::-;;4632:80;;4729:8;;:37;;4742:8;4753:12;;:::i;:::-;4742:23;4729:37;:::i;:::-;;;:::i;:::-;;:81;;;;4777:17;4769:26;4785:8;4777:17;:::i;:::-;4769:26;:::i;:::-;4729:81;4722:88;:::o;4729:81::-;4806:3;4798:12;4806:3;4798:12;:::i;:::-;4729:81;;4632:80;4688:13;;4681:20;:::o;868:4258:26:-;;;:::o;3751:78:22:-;3794:4;;:::i;:::-;3817:5;;3810:12;:::o;868:4258:26:-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;:::o;6250:431:13:-;;3826:1:26;;;:::i;:::-;6388:26:13;;;:::i;:::-;6429:1;:15;;:1;:15;;:::i;:::-;:44;;;;6250:431;6425:105;;6616:23;6556:7;6605:1;6556:7;6539:24;6556:7;6539:14;:1;:14;:24;:::i;:::-;6573:22;6591:4;6573:15;:1;:15;:22;:::i;:::-;6605:1;:::i;:::-;6616:15;6634:5;6616:1;:15;:23;:::i;:::-;6654:20;;;;;:::i;:::-;;;;;;:::i;:::-;;;;6250:431::o;6425:105::-;6496:23;;;;;;;;;;;;:::i;:::-;;;;6429:44;6448:1;:14;;:1;:14;;:::i;:::-;:25;;6466:7;6448:25;:::i;:::-;;;:::i;:::-;;;6429:44;;868:4258:26;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;;:::i;:::-;;:::i;:::-;;;;:::i;:::-;;;:::o;3709:1415::-;;;3887:67;3939:15;;:::i;:::-;3887:67;:48;:32;:18;3906:12;;:::i;:::-;3887:32;;:::i;:::-;3920:14;;:::i;:::-;3887:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;3964;4016:15;;:::i;:::-;3964:67;:48;:32;:18;3983:12;;:::i;:::-;3964:32;;:::i;:::-;3997:14;;:::i;:::-;3964:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4041;4093:15;;:::i;:::-;4041:67;:48;:32;:18;4060:12;;:::i;:::-;4041:32;;:::i;:::-;4074:14;;:::i;:::-;4041:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4118;4170:15;;:::i;:::-;4118:67;:48;:32;:18;4137:12;;:::i;:::-;4118:32;;:::i;:::-;4151:14;;:::i;:::-;4118:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4195;4247:15;;:::i;:::-;4195:67;:48;:32;:18;4214:12;;:::i;:::-;4195:32;;:::i;:::-;4228:14;;:::i;:::-;4195:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4272;4324:15;;:::i;:::-;4272:67;:48;:32;:18;4291:12;;:::i;:::-;4272:32;;:::i;:::-;4305:14;;:::i;:::-;4272:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4349;4401:15;;:::i;:::-;4349:67;:48;:32;:18;4368:12;;:::i;:::-;4349:32;;:::i;:::-;4382:14;;:::i;:::-;4349:48;;:::i;:::-;:67;;;;:::i;:::-;;:::i;:::-;;;:::i;:::-;4522:21;;:7;4530:12;;:::i;:::-;4522:21;;:::i;:::-;;:::i;:::-;:35;;4547:10;4555:1;4547:10;:::i;:::-;4522:35;:::i;:::-;;;:::i;:::-;;4518:77;;3709:1415;4609:21;;:7;4617:12;;:::i;:::-;4609:21;;:::i;:::-;;:::i;:::-;:35;;4634:10;4642:1;4634:10;:::i;:::-;4609:35;:::i;:::-;;;:::i;:::-;;4605:77;;3709:1415;4696:21;;:7;4704:12;;:::i;:::-;4696:21;;:::i;:::-;;:::i;:::-;:35;;4721:10;4729:1;4721:10;:::i;:::-;4696:35;:::i;:::-;;;:::i;:::-;;4692:77;;3709:1415;4783:21;;:7;4791:12;;:::i;:::-;4783:21;;:::i;:::-;;:::i;:::-;:35;;4808:10;4816:1;4808:10;:::i;:::-;4783:35;:::i;:::-;;;:::i;:::-;;4779:77;;3709:1415;4870:21;;:7;4878:12;;:::i;:::-;4870:21;;:::i;:::-;;:::i;:::-;:35;;4895:10;4903:1;4895:10;:::i;:::-;4870:35;:::i;:::-;;;:::i;:::-;;4866:77;;3709:1415;4957:21;;:7;4965:12;;:::i;:::-;4957:21;;:::i;:::-;;:::i;:::-;:35;;4982:10;4990:1;4982:10;:::i;:::-;4957:35;:::i;:::-;;;:::i;:::-;;4953:77;;3709:1415;5044:21;;:7;5052:12;;:::i;:::-;5044:21;;:::i;:::-;;:::i;:::-;:35;;5069:10;5077:1;5069:10;:::i;:::-;5044:35;:::i;:::-;;;:::i;:::-;;5040:77;;3709:1415;:::o;5040:77::-;5081:36;5105:12;;:::i;:::-;5081:21;:7;5089:12;;:::i;:::-;5081:21;;:::i;:::-;:36;:::i;:::-;5040:77;;4953;4994:36;5018:12;;:::i;:::-;4994:21;:7;5002:12;;:::i;:::-;4994:21;;:::i;:::-;:36;:::i;:::-;4953:77;;4866;4907:36;4931:12;;:::i;:::-;4907:21;:7;4915:12;;:::i;:::-;4907:21;;:::i;:::-;:36;:::i;:::-;4866:77;;4779;4820:36;4844:12;;:::i;:::-;4820:21;:7;4828:12;;:::i;:::-;4820:21;;:::i;:::-;:36;:::i;:::-;4779:77;;4692;4733:36;4757:12;;:::i;:::-;4733:21;:7;4741:12;;:::i;:::-;4733:21;;:::i;:::-;:36;:::i;:::-;4692:77;;4605;4646:36;4670:12;;:::i;:::-;4646:21;:7;4654:12;;:::i;:::-;4646:21;;:::i;:::-;:36;:::i;:::-;4605:77;;4518;4559:36;4583:12;;:::i;:::-;4559:21;:7;4567:12;;:::i;:::-;4559:21;;:::i;:::-;:36;:::i;:::-;4518:77;;3709:1415;;;;;:::i;:::-;:::o;868:4258::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;2388:729:22:-;;2490:34;2498:25;2514:8;2498:25;:::i;:::-;2490:34;:::i;:::-;2534:66;2542:30;2562:9;2542:30;:::i;:::-;2534:66;:::i;:::-;2973:137;2628:9;2718:18;2828:41;2718:37;;:28;:18;2737:8;2718:28;;:::i;:::-;2747:7;2718:37;;:::i;:::-;;:::i;:::-;2773:15;2765:53;2773:15;:19;;2791:1;2773:19;:::i;:::-;;;:::i;:::-;;2765:53;:::i;:::-;2828:37;:41;2868:1;2828:41;:::i;:::-;:18;:28;:18;2847:8;2828:28;;:::i;:::-;:37;:::i;:::-;:41;:::i;:::-;2942:15;2920:9;2931;2942:15;;;:::i;:::-;3019:9;3030:42;3019:9;3056:15;3030:42;;:::i;:::-;3074:15;2973:137;;;;:::i;:::-;;;;;;:::i;:::-;;;;2388:729::o;2466:103:17:-;;2531:1;2466:103;;;:::i;:::-;2531:1;:::i;:::-;;;:::i;:::-;2466:103::o;868:4258:26:-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;1829:133:25;;1954:1;1829:133;1871:73;1879:10;:30;;1893:16;;;:::i;:::-;1879:30;:::i;:::-;;;:::i;:::-;;1871:73;:::i;:::-;1954:1;:::i;:::-;1829:133::o;868:4258:26:-;;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;4108:1014:25;;4288:48;4296:13;:6;;:13;;:::i;:::-;:17;;4312:1;4296:17;:::i;:::-;;;:::i;:::-;;4288:48;:::i;:::-;4347:21;4367:1;4347:21;:::i;:::-;4395:1;4383:13;4395:1;4383:13;:::i;:::-;4417:3;4398:1;:17;;4402:13;:6;;:13;;:::i;:::-;4398:17;:::i;:::-;;;:::i;:::-;;;;;4417:3;4484:6;:15;;:9;:6;;4491:1;4484:9;;:::i;:::-;:15;;:::i;:::-;4501:16;;:9;:6;;4508:1;4501:9;;:::i;:::-;:16;;:::i;:::-;4554;4519:19;;:9;:6;;4526:1;4519:9;;:::i;:::-;:19;;:::i;:::-;4436:103;;;4567:3;;4554:16;;:::i;:::-;4592:9;4584:56;4592:9;:22;;4605:9;4592:22;:::i;:::-;;;:::i;:::-;;;4584:56;:::i;:::-;4659:5;:19;;4668:10;;:::i;:::-;4659:19;:::i;:::-;;;:::i;:::-;;4655:383;;;;4731:3;4723:6;;;4731:3;:::i;:::-;4787:24;;;:::i;:::-;4813:10;4758:66;;;;;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;:::i;:::-;;;;4655:383;4417:3;:::i;:::-;4383:13;;4655:383;4921:3;4905:5;4890:21;4905:5;4890:21;:::i;:::-;4913:6;;4921:3;;;:::i;:::-;4986:24;;;:::i;:::-;5012:10;4948:75;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;;;:::i;:::-;;;;;;:::i;:::-;;;;4655:383;;4398:17;;;;5057:58;4398:17;5065:22;;5078:9;5065:22;:::i;:::-;;;:::i;:::-;;5057:58;:::i;:::-;4108:1014::o;:::-;;;;;:::i;:::-;:::o;12890:155:22:-;;;13023:14;12890:155;13001:10;13013:8;13023:14;;;;:::i;:::-;12890:155::o;2466:103:17:-;;;:::i;:::-;2531:1;;:::i;:::-;;;:::i;:::-;2466:103::o;1829:133:25:-;1871:73;1879:10;:30;;1893:16;;;:::i;:::-;1879:30;:::i;:::-;;;:::i;:::-;;1871:73;:::i;:::-;1954:1;;:::i;:::-;1829:133::o;868:4258:26:-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;:::i;:::-;;;;;;;;3711:177:25;3809:31;:17;;;:::i;:::-;:31;:::i;:::-;;3848:9;3809:49;;;3859:9;;;;:::i;:::-;3870:10;;3809:72;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;3711:177;;:::o;3809:72::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;3711:177::-;;;:::i;:::-;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;12191:102:22:-;12228:65;868:4258:26;12228:65:22;;;;;:::i;:::-;12191:102;:::o;12228:65::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;12228:65:22;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;12228:65:22;;;;;;;;:::i;:::-;;;;;;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;12228:65:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;:::o;:::-;;:::i;:::-;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;;:::o;:::-;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;750:113:29:-;787:76;;;:::i;:::-;750:113;:::o;787:76::-;868:4258:26;;;787:76:29;;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;13448:955:22:-;;13953:33;14286:9;13448:955;;14040:44;13448:955;13558:43;13566:8;:13;;13578:1;13566:13;:::i;:::-;;;:::i;:::-;;;13558:43;:::i;:::-;13611:50;13619:8;:20;;13630:9;;:::i;:::-;13619:20;:::i;:::-;;;:::i;:::-;;13611:50;:::i;:::-;13671:52;13679:6;:20;;13689:10;13697:1;13689:10;:::i;:::-;13679:20;:::i;:::-;;;:::i;:::-;;;13671:52;:::i;:::-;13733:65;13741:17;;:7;13749:8;13741:17;;:::i;:::-;;:::i;:::-;:31;;13762:10;13770:1;13762:10;:::i;:::-;13741:31;:::i;:::-;;;:::i;:::-;;13733:65;:::i;:::-;13808:50;13816:20;13827:8;13816:20;:::i;:::-;13808:50;:::i;:::-;13868:74;13876:21;:14;;:21;;:::i;:::-;:31;;13901:6;13876:31;:::i;:::-;;;:::i;:::-;;13868:74;:::i;:::-;13953:33;:::i;:::-;14040:44;;;;:::i;:::-;;;;;;;;:::i;:::-;13996:88;14125:102;:75;14181:6;14143:55;14189:8;14143:55;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;14133:66;;;;:::i;:::-;;;:::i;:::-;;14125:75;:::i;:::-;14203:24;;:::i;:::-;14125:102;;:::i;:::-;14270:1;14276:8;14286:9;;;:::i;:::-;14307:26;14327:6;14307:17;:7;14315:8;14307:17;;:::i;:::-;:26;:::i;:::-;14375:8;14385:10;14349:47;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;13448:955::o;868:4258:26:-;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;5652:344:22:-;5720:15;;:::i;:::-;5752:19;5751:39;5752:38;;:19;5772:17;5752:38;;:::i;:::-;;:::i;:::-;5751:39;;:::i;:::-;5747:243;;;;5862:1;5852:11;5862:1;5852:11;:::i;:::-;5747:243;;5652:344::o;5747:243::-;5942:37;;:18;;:37;:::i;:::-;;:::i;:::-;5747:243;;;3368:238;3561:37;;3527:72;3368:238;3456:7;;:::i;:::-;3503;3561:28;3503:7;3561:18;;:28;:::i;:::-;:37;:::i;:::-;;:::i;:::-;3527:72;;:::i;:::-;3520:79;:::o;868:4258:26:-;;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;5054:317:22:-;5333:31;5321:43;5054:317;5116:22;;:::i;:::-;5216:19;5208:68;5216:30;;:19;5236:9;5216:30;;:::i;:::-;;:::i;:::-;5208:68;:::i;:::-;5333:20;:31;:::i;:::-;5321:43;:::i;:::-;5054:317;:::o;9071:205:13:-;9186:27;;:::i;:::-;9071:205;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;9196:189:22;9297:19;9196:189;9262:14;;:::i;:::-;9307:8;9297:19;:::i;:::-;9334:6;9326:52;9334:6;:22;;9344:12;9352:3;9344:12;:::i;:::-;9334:22;:::i;:::-;;;:::i;:::-;;;9326:52;:::i;:::-;9196:189::o;868:4258:26:-;;;;;;:::o;:::-;;;;:::i;:::-;;:::o;1668:66:22:-;1708:26;1715:18;1708:26;:::i;:::-;1668:66;:::o;1538:82::-;1580:40;1587:32;1580:40;:::i;:::-;1538:82;:::o;8676:243::-;8786:45;8676:243;8747:4;;:::i;:::-;8821:9;8786:45;:::i;:::-;8848:13;:29;;8865:12;;:::i;:::-;8848:29;:::i;:::-;;;:::i;:::-;;:64;;;;;8676:243;8841:71;;:::o;8848:64::-;8881:13;;:31;;8898:14;;:::i;:::-;8881:31;:::i;:::-;;;:::i;:::-;;8848:64;;;868:4258:26;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;6310:1286:22;;;6477:55;6485:9;:25;;6498:12;6506:3;6498:12;:::i;:::-;6485:25;:::i;:::-;;;:::i;:::-;;;6477:55;:::i;:::-;6559:42;6574:9;6585:15;6559:42;;:::i;:::-;6623:9;6615:18;6623:9;6615:18;:::i;:::-;6611:979;;;;6653:20;;6672:1;6653:20;:::i;:::-;;;:::i;:::-;;6649:33;;6718:34;6847:30;6742:9;6718:34;:::i;:::-;6781:20;6788:12;6781:20;:::i;:::-;6847:30;:15;:5;:15;:::i;:::-;;6871:4;6847:30;6863:13;6871:4;6863:13;:::i;:::-;6847:30;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;7030:8;7084:30;6847;6915:66;;7084:15;6847:30;7084;6847;;;;;6611:979;6815:62;6938:14;6915:66;6938:23;:14;:23;:::i;:::-;6963:9;6974:6;6915:66;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;7030:8;;:::i;:::-;7084:15;:::i;:::-;;7108:4;7084:30;7100:13;7108:4;7100:13;:::i;:::-;7084:30;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;7316;7292:54;7084:30;7292:54;7084:30;7284:95;7084:30;;;;;6611:979;7053:61;7128:67;7136:20;:45;;7160:21;7136:45;:::i;:::-;;;:::i;:::-;;;7128:67;:::i;:::-;7316:21;:30;:::i;:::-;7292:54;:::i;:::-;;;:::i;:::-;;7284:95;:::i;:::-;6611:979;6310:1286::o;7084:30::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;6847:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;6649:33::-;6675:7;;;:::o;6611:979::-;7408:9;;;7400:18;7408:9;7400:18;:::i;:::-;7396:194;;;;7438:20;;7457:1;7438:20;:::i;:::-;;;:::i;:::-;;7434:33;;7480:28;7509:6;7480:9;:28;:::i;:::-;7509:6;:::i;:::-;6611:979;;7434:33;7460:7;;:::o;7396:194::-;7547:32;;:::i;:::-;868:4258:26;;;7547:32:22;;;;;;;;:::i;:::-;;;;868:4258:26;;;;;;;;:::i;:::-;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;:::-;;:::i;8267:223:22:-;;8410:29;8458:25;8267:223;8366:14;;:::i;:::-;8421:17;8410:29;:::i;:::-;8458:25;;:::i;:::-;8267:223;:::o;868:4258:26:-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1864:36:17:-;1899:1;;;:::i;:::-;1864:36;:::o;2575:307::-;2702:7;;;:::i;:::-;:18;;2713:7;;:::i;:::-;2702:18;:::i;:::-;;;:::i;:::-;;2698:86;;2858:17;2868:7;;:::i;:::-;2858:17;;:::i;:::-;2575:307::o;2698:86::-;2743:30;;;;;;;;;;;;:::i;:::-;;;;1818:40;1857:1;;;:::i;:::-;1818:40;:::o;2888:208::-;3068:21;3078:11;;:::i;:::-;3068:21;;:::i;:::-;2888:208::o;868:4258:26:-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;5391:661:25:-;;;;5502:55;5510:14;5518:5;5510:14;:::i;:::-;:28;;5528:10;5536:1;5528:10;:::i;:::-;5510:28;:::i;:::-;;;:::i;:::-;;;5502:55;:::i;:::-;5567:36;5575:6;:10;;5584:1;5575:10;:::i;:::-;;;:::i;:::-;;5567:36;:::i;:::-;5632:30;;:15;:5;:15;:::i;:::-;;5656:4;5632:30;5648:13;5656:4;5648:13;:::i;:::-;5632:30;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;5672:50;5632:30;;;;;5391:661;5614:48;5680:17;;5691:6;5680:17;:::i;:::-;;;:::i;:::-;;;5672:50;:::i;:::-;5930:6;5881:22;5888:14;5896:5;5888:14;:::i;:::-;5881:22;:::i;:::-;5917:11;;;:::i;:::-;5930:6;;;:::i;:::-;5947:39;:29;5964:11;;;:::i;:::-;5947:29;:::i;:::-;:39;:::i;:::-;;;5994:9;5947:57;;;6012:24;;;:::i;:::-;6038:6;5947:98;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;5391:661;;:::o;5947:98::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;5632:30::-;;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;868:4258:26:-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;6259:366:25:-;;6346:36;6354:6;:10;;6363:1;6354:10;:::i;:::-;;;:::i;:::-;;6346:36;:::i;:::-;6442:62;6411:13;6419:4;6411:13;:::i;:::-;:21;6450:29;;6461:18;:6;6470:9;6461:18;;:::i;:::-;6450:29;:::i;:::-;;;:::i;:::-;;;6442:62;:::i;:::-;6515:42;:29;6532:11;;;:::i;:::-;6515:29;:::i;:::-;:42;:::i;:::-;;6565:18;6515:42;6565:6;;:18;:::i;:::-;6515:69;;;6585:24;;;;:::i;:::-;6611:6;6515:103;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;6259:366;;:::o;6515:103::-;;;;;;;;;;;;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;868:4258:26:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;12342:99:22:-;12376:65;;;:::i;:::-;12342:99;:::o;14589:266::-;14649:4;;:::i;:::-;14696:8;;14706;14716:9;;:::i;:::-;14689:37;;;;;;14728:8;14738:9;;:::i;:::-;14682:66;;;;;;14807:8;14817:9;;:::i;:::-;14792:35;;;;;;14829:6;;:::i;:::-;14837:9;;:::i;:::-;14785:62;;;;;14765:83;14785:62;;14765:83;:::i;:::-;14758:90;:::o;14785:62::-;;:::i;14792:35::-;;:::i;14682:66::-;;:::i;14689:37::-;;:::i;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;869:52:29:-;918:3;;;:::i;:::-;869:52;:::o;918:3::-;;;:::o;:::-;;;;;;;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;918:3:29;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;918:3:29;;;;;;;;:::i;:::-;;;;483:105;523:65;868:4258:26;12228:65:22;;;;523::29;:::i;:::-;483:105;:::o;635:109::-;668:76;;;:::i;:::-;635:109;:::o;668:76::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;927:102::-;964:65;;;:::i;:::-;927:102;:::o;964:65::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1035:101::-;1072:64;;;:::i;:::-;1035:101;:::o;594:35::-;628:1;;;:::i;:::-;594:35;:::o;628:1::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;868:4258:26;;;628:1:29;;;;;;;;:::i;:::-;;;;1143:1253;;;;1397:18;1143:1253;1250:62;1258:18;:7;1268:8;;:::i;:::-;1258:18;;:::i;:::-;:29;;1280:7;1258:29;:::i;:::-;;;:::i;:::-;;1250:62;:::i;:::-;1331:1;:6;;1336:1;1331:6;:::i;:::-;;;:::i;:::-;;;1330:26;;;1143:1253;1322:53;;;:::i;:::-;1406:8;;:::i;:::-;1397:18;;:::i;:::-;1434:1;;:6;;1439:1;1434:6;:::i;:::-;;;:::i;:::-;;;1433:45;;;1143:1253;1425:72;;;:::i;:::-;1516:1;:6;;1521:1;1516:6;:::i;:::-;;;:::i;:::-;;;1515:45;;;1143:1253;1507:72;;;:::i;:::-;1699:4;1705;1711:11;;:::i;:::-;1692:31;;;;;;1725:4;1731:11;;:::i;:::-;1685:58;;;;;;1777:4;;1783;1789:11;;:::i;:::-;1770:31;;;;;;1843:2;1847:4;1853:11;;:::i;:::-;1836:29;;;;;;1867:4;;;:::i;:::-;1873:11;;;:::i;:::-;1829:56;;;;;2142:39;2044:53;2351:10;1829:56;1815:92;2208:48;1829:56;1823:62;;2343:46;1829:56;;2295:37;1829:56;2351:10;1829:56;;1823:62;:::i;:::-;;;:::i;:::-;;1815:92;:::i;:::-;1957:11;;:::i;:::-;1978;;;:::i;:::-;2044:7;2058:8;;:::i;:::-;2068;;:::i;:::-;2078:5;;:::i;:::-;2085:11;;;:::i;:::-;2044:53;;:::i;:::-;2013:84;;;2142:1;;2150:4;2156;2162:5;;:::i;:::-;2169:11;;;:::i;:::-;2142:39;;:::i;:::-;2111:70;;;2208:4;2219;2225;2237:5;;:::i;:::-;2244:11;;;:::i;:::-;2208:48;;:::i;:::-;2313:5;;:::i;:::-;2320:11;;;:::i;:::-;2295:37;;:::i;:::-;2276:56;2360:1;2351:10;:::i;:::-;;;:::i;:::-;;2343:46;:::i;:::-;1143:1253::o;1829:56::-;;:::i;1836:29::-;;:::i;1770:31::-;;:::i;1685:58::-;;:::i;1692:31::-;;:::i;1515:45::-;1528:1;1507:72;1528:1;:31;;1533:25;:1;:25;1538:20;;:::i;:::-;1533:25;;:::i;:::-;;:::i;:::-;1528:31;:::i;:::-;;;:::i;:::-;;1515:45;;;;1433;1446:1;1425:72;1446:1;:31;;1451:25;:1;:25;1456:20;;:::i;:::-;1451:25;;:::i;:::-;;:::i;:::-;1446:31;:::i;:::-;;;:::i;:::-;;1433:45;;;;1330:26;1343:1;1322:53;1343:1;:12;;1347:8;;:::i;:::-;1343:12;:::i;:::-;;;:::i;:::-;;1330:26;;;;868:4258:26;;;:::o;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;3098:115:13:-;3147:66;;;:::i;:::-;3098:115;:::o;8819:122::-;8887:7;;:::i;:::-;8913:21;;;:::i;:::-;8906:28;:::o;868:4258:26:-;;;:::o;10571:176:22:-;10716:23;10681:59;10571:176;10656:6;;:::i;:::-;10729:9;10716:23;:::i;:::-;10681:59;:::i;:::-;10674:66;:::o;10237:152::-;10319:45;10237:152;10296:4;;:::i;:::-;10354:9;10319:45;:::i;:::-;:63;;10368:14;;:::i;:::-;10319:63;:::i;:::-;;;:::i;:::-;;10312:70;:::o;9896:150::-;9978:45;9896:150;9955:4;;:::i;:::-;10013:9;9978:45;:::i;:::-;:61;;10027:12;;:::i;:::-;9978:61;:::i;:::-;;;:::i;:::-;;9971:68;:::o;868:4258:26:-;;;;:::o;:::-;;;;;;:::i;:::-;;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;;;:::o;:::-;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;628:217:27;728:33;799:39;628:217;;;728:29;:33;;:::i;:::-;;;;;;:::i;:::-;;;;;;;:::i;:::-;;799:39;:::i;:::-;628:217::o;7781:169:22:-;7919:23;7882:61;7781:169;7856:7;;:::i;:::-;7932:9;7919:23;:::i;:::-;7882:61;:::i;:::-;7875:68;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;:::o;:::-;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;:::i;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;1054:452:27;1299:27;1054:452;;;1149:54;1157:24;1168:12;1157:24;:::i;:::-;1149:54;:::i;:::-;1317:8;1299:27;;;;;;;;;1336:36;1299:27;;:::i;:::-;1344:7;1353:18;1360:10;1353:18;:::i;:::-;1336:36;;:::i;:::-;1387:17;:10;:17;:::i;:::-;:21;;1407:1;1387:21;:::i;:::-;;;:::i;:::-;;1383:117;;1054:452;;:::o;1383:117::-;1432:30;1424:65;1443:10;1432:30;;;;:::i;:::-;;;;;;;;:::i;:::-;1424:65;:::i;:::-;1383:117;;;868:4258:26;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;:::o;5084:380:16:-;;;5199:47;;5084:380;5199:47;5214:13;5199:47;5230:7;5239:5;5199:47;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;5286:5;5261:45;5262:44;5286:5;5293:12;5262:44;;:::i;:::-;5261:45;;:::i;:::-;5257:201;;5084:380;;;;:::o;5257:201::-;5349:43;;5434:12;5342:5;5349:43;5342:5;5364:13;5349:43;5364:13;5349:43;5389:1;5349:43;;:::i;:::-;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;:::i;:::-;5434:12;:::i;:::-;5257:201;;;;;868:4258:26;;;;;:::i;:::-;;;:::i;:::-;;;;;;;;:::o;:::-;;:::i;14966:154:22:-;15039:4;;:::i;:::-;15062:1;:51;;15067:46;15062:1;15077:12;15092:19;15093:13;:9;;:::i;:::-;:13;15105:1;15093:13;:::i;:::-;;;:::i;:::-;15092:19;15110:1;15092:19;:::i;:::-;;;:::i;:::-;15067:46;;:::i;:::-;15062:51;:::i;:::-;;;:::i;:::-;;15055:58;:::o;868:4258:26:-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;834:438:28;898:7;;:::i;:::-;925:2;;:7;;931:1;925:7;:::i;:::-;;;:::i;:::-;;;:20;;;834:438;925:32;;;834:438;917:59;;;:::i;:::-;986:13;998:1;986:13;:::i;:::-;1009:16;1024:1;1009:16;:::i;:::-;1047:3;1060:9;;;:::i;:::-;1079:169;;1086:2;:7;;1092:1;1086:7;:::i;:::-;;;:::i;:::-;;;;1113:6;:1;1117:2;1113:6;;:::i;:::-;1146:4;1159:1;1163:3;;1176:1;1179:4;1185:3;1169:20;;;;;1163:26;1169:20;;1163:26;;:::i;:::-;1192:3;;1152:44;;;;1226:10;1152:44;1230:6;1152:44;;1133:64;1222:2;;1226:1;1230;:6;:::i;:::-;1226:10;;:::i;:::-;1079:169;;;;1152:44;;:::i;1169:20::-;;:::i;1086:7::-;;;;;;1257:8;:::o;925:32::-;949:3;917:59;949:3;:8;;956:1;949:8;:::i;:::-;;;:::i;:::-;;;925:32;;;;:20;936:2;;:9;;942:3;936:9;:::i;:::-;;;:::i;:::-;;;925:20;;3316:275;;3559:25;3316:275;;;3511:31;3316:275;3440:7;;:::i;:::-;3449;;;:::i;:::-;3518:2;3522;3526;3530:1;3533:3;3538;3511:31;3538:3;3511:31;;:::i;:::-;;;:::i;:::-;3472:70;;;;3568:2;3572;3576;3580:3;3559:25;;:::i;:::-;3552:32;;;;:::o;2671:567::-;;;;;;2811:7;;:::i;:::-;2820;;;:::i;:::-;2855:1;2843:13;2855:1;2843:13;:::i;:::-;2878:1;2866:13;2878:1;2866:13;:::i;:::-;2901:1;2889:13;2901:1;2889:13;:::i;:::-;2916:3;;:10;;2923:3;2916:10;:::i;:::-;;;:::i;:::-;;2912:281;;;;2953:3;;2958;2963;2946:21;;;;;;:26;;2971:1;2946:26;:::i;:::-;;;:::i;:::-;;2942:161;;;;3000:1;;;;;3003;2992:13;;3003:1;2992:13;;:::i;:::-;;;:::i;:::-;;:::o;2942:161::-;3209:22;3066:3;3056:32;3066:3;3076:1;3079:3;3084;3056:32;3084:3;3056:32;;:::i;:::-;;;:::i;:::-;3044:44;;;;;2912:281;3221:1;3224;3227:3;3209:22;;:::i;:::-;3202:29;;;;:::o;2946:21::-;;:::i;2912:281::-;3152:3;;;3209:22;3152:3;3145:37;3152:3;3157;3162:1;;3165:3;3170;3175:1;;3178:3;3145:37;;3178:3;3145:37;;:::i;:::-;;;:::i;:::-;;;:::i;:::-;3133:49;;;;;2912:281;;11098:325:22;11215:202;11098:325;11188:15;;:::i;:::-;11215:202;;;868:4258:26;;;11215:202:22;11098:325;:::o;868:4258:26:-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1788:48:22:-;1832:4;;;:::i;:::-;1788:48;:::o;1832:4::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;1882:43::-;1924:1;;;:::i;:::-;1882:43;:::o;1993:89::-;2051:31;:15;;:::i;:::-;2069:13;;:::i;:::-;2051:31;;:::i;:::-;1993:89;:::o;11587:301::-;11868:12;11860:21;11587:301;11679:7;;:::i;:::-;11715:29;;;:::i;:::-;11754:11;;;:::i;:::-;11775:69;;;11868:12;:::i;:::-;11860:21;:::i;:::-;11853:28;:::o;432:190:27:-;492:4;;:::i;:::-;508:12;;;:::i;:::-;530:61;;607:8;;614:1;607:8;:::i;:::-;;;:::i;:::-;;600:15;:::o;9592:480:16:-;;9770:199;;9592:480;9675:4;;:::i;:::-;9691:12;;;:::i;:::-;9713:18;;;:::i;:::-;9741:19;;;:::i;:::-;9770:199;;;;;;;;;;;;;;9985:7;:80;;;;9592:480;9978:87;;;;:::o;9985:80::-;9997:10;;;;:15;;10011:1;9997:15;:::i;:::-;;;:::i;:::-;;:67;;;;10015:14;10023:5;;10015:14;:::i;:::-;:26;:30;;10044:1;10015:30;:::i;:::-;;;:::i;:::-;;9997:67;9985:80;;;;;9997:67;10048:11;:16;;10063:1;10048:16;:::i;:::-;;;:::i;:::-;;9997:67;;8370:720;;8507:421;;8370:720;8450:18;;:::i;:::-;8478:19;;;:::i;:::-;8507:421;;;;;;;;;;;;;;;;8942:10;:15;;8956:1;8942:15;:::i;:::-;;;:::i;:::-;;:68;;;;8968:5;8960:14;8968:5;8960:14;:::i;:::-;:26;:31;;8990:1;8960:31;:::i;:::-;;;:::i;:::-;;8942:68;8938:146;;8370:720;:::o;8938:146::-;9058:14;9033:40;9066:5;9058:14;:::i;:::-;9033:40;;;;;;;;;;;;;:::i;:::-;;;;8942:68;8994:16;;9009:1;8994:16;:::i;:::-;;;:::i;:::-;;;8942:68;;8507:421;;;;;;;;;;868:4258:26;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;:::i;:::-;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;15224:327:22;15370:78;15224:327;;15511:33;15224:327;15297:7;;:::i;:::-;15378:1;15392:55;15370:10;15378:1;15370:10;:::i;:::-;15403:4;15392:55;15403:4;15409;;15415;;15421;15437:9;;:::i;:::-;15392:55;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;15370:78;;;;;;;;15458:36;15370:78;;:::i;:::-;15466:7;15458:36;:::i;:::-;15511:33;;;;:::i;:::-;;;;;;;;:::i;:::-;15504:40;:::o;5877:616:28:-;;;;;;6014:7;;:::i;:::-;6023;;;:::i;:::-;6032;;;:::i;:::-;6059:2;;:7;;6065:1;6059:7;:::i;:::-;;;:::i;:::-;;6055:32;;6118:2;;6130:14;6143:1;6130:14;:::i;:::-;6167:1;6154:14;6167:1;6154:14;:::i;:::-;6191:1;6178:14;6191:1;6178:14;:::i;:::-;6203:255;;6210:9;:14;;6223:1;6210:14;:::i;:::-;;;:::i;:::-;;;;6245:9;:13;6257:1;6245:13;:::i;:::-;;6244:20;;6263:1;6244:20;:::i;:::-;;;:::i;:::-;;6240:109;;6203:255;6374:9;:13;6416:31;6374:9;;:13;6386:1;6374:13;:::i;:::-;;;:::i;:::-;6426:2;6430;6434;6438:3;6443;;6416:31;;:::i;:::-;6401:46;;;;;;6203:255;;;;;;;;;6240:109;6306:2;6374:13;6306:2;;;6416:31;6306:2;;6299:35;6306:2;6310;6314;6318;6322;;6326;6330:3;;6299:35;;:::i;:::-;6284:50;;;;;6240:109;;;;;;;;6210:14;;;;;;;;;;6479:2;6483;6467:19;;;;:::o;6055:32::-;6076:2;;;;;;6080;6084;6068:19;;;;:::o;2254:338::-;;2387:15;2254:338;;;;;2344:7;;:::i;:::-;2353;;;:::i;:::-;2394:2;2398:3;2387:15;;:::i;:::-;2435:4;;2441;2447:3;2428:23;;;;;;2481:2;2485:5;2492:3;2474:22;;;;;;2526:2;2537:4;2543:5;2550:3;2530:24;;;;;;2556:3;2519:41;;;;;;2570:15;:::o;2519:41::-;;:::i;2530:24::-;;:::i;2474:22::-;;:::i;2428:23::-;;:::i;868:4258:26:-;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;;:::i;:::-;;;;;;:::i;:::-;;;:::i;:::-;:::o;:::-;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;:::i;:::-;;;;;:::i;:::-;;;:::o;:::-;;;;;:::i;:::-;;:::o;:::-;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;:::-;;;;;;:::o;:::-;;;;;;:::i;:::-;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;:::o;:::-;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;3680:1319:28;;;;;;;;;;3834:7;;:::i;:::-;3843;;;:::i;:::-;3852;;;:::i;:::-;3879:3;;:8;;3886:1;3879:8;:::i;:::-;;;:::i;:::-;;:20;;;3680:1319;3875:48;;3937:3;:8;;3944:1;3937:8;:::i;:::-;;;:::i;:::-;;:20;;;3680:1319;3933:48;;3992:20;;:::i;:::-;4037:3;;4042;4047;4030:21;;;;;4022:29;4030:21;;4022:29;:2;:29;4025:1;4022:29;:::i;:::-;;;:::i;:::-;;:::i;:::-;4076:3;4081:5;;:2;:5;4084:1;4081:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4088:3;4069:23;;;;;4061:31;4069:23;;4061:31;:2;:31;4064:1;4061:31;:::i;:::-;;;:::i;:::-;;:::i;:::-;4117:3;4122;4127;4110:21;;;;;4102:29;4110:21;;4102:29;:2;:29;4105:1;4102:29;:::i;:::-;;;:::i;:::-;;:::i;:::-;4156:3;4161:5;;:2;:5;4164:1;4161:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4168:3;4149:23;;;;;4141:31;4149:23;;4141:31;:2;:31;4144:1;4141:31;:::i;:::-;;;:::i;:::-;;:::i;:::-;4188:100;;;:::i;:::-;4196:3;4201:5;;:2;:5;4204:1;4201:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4208:3;4189:23;;;;;4188:100;4189:23;;4188:100;;;;:::i;:::-;4226:5;;:2;:5;4229:1;4226:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4233:3;4214:23;;;;;4188:100;4214:23;;4188:100;;;;:::i;:::-;4251:2;:5;;:2;:5;4254:1;4251:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4258:3;;4239:23;;;;;4276:5;4239:23;4276:5;4239:23;4188:100;4239:23;;4188:100;;;;:::i;:::-;4276:2;:5;4279:1;4276:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4283:3;4264:23;;;;;4188:100;4264:23;;4188:100;;;;:::i;:::-;4307:2;:5;;:2;:5;4310:1;4307:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;:14;;4316:5;;:2;:5;4319:1;4316:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4307:14;:::i;:::-;;;:::i;:::-;;;:32;;;;3680:1319;4299:75;;;:::i;:::-;4385:20;;:::i;:::-;4430:2;:5;;:2;:5;4433:1;4430:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4437:11;:3;4443:5;;:2;:5;4446:1;4443:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4437:11;;:::i;:::-;4450:3;4423:31;;;;;4415:39;4423:31;;4415:39;:2;:39;4418:1;4415:39;:::i;:::-;;;:::i;:::-;;:::i;:::-;4479:5;;:2;:5;4482:1;4479:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4486:11;:3;4492:5;;:2;:5;4495:1;4492:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4486:11;;:::i;:::-;4499:3;4472:31;;;;;4464:39;4472:31;;4464:39;:2;:39;4467:1;4464:39;:::i;:::-;;;:::i;:::-;;:::i;:::-;4528:5;;:2;:5;4531:1;4528:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4535;;:2;:5;4538:1;4535:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4542:3;4521:25;;;;;4513:33;4521:25;;4513:33;:2;:33;4516:1;4513:33;:::i;:::-;;;:::i;:::-;;:::i;:::-;4571:5;;:2;:5;4574:1;4571:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4578;;:2;:5;4581:1;4578:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4585:3;4564:25;;;;;4556:33;4564:25;;4556:33;:2;:33;4559:1;4556:33;:::i;:::-;;;:::i;:::-;;:::i;:::-;4627:5;;:2;:5;4630:1;4627:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4634;;:2;:5;4637:1;4634:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4641:3;4620:25;;;;;;4647:11;:3;4653:5;;:2;:5;4656:1;4653:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4647:11;;:::i;:::-;4660:3;4613:51;;;;;;4690:3;4703:1;4713:2;:5;;:2;:5;4716:1;4713:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4720;;:2;:5;4723:1;4720:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4727:3;4706:25;;;;;;4733:3;4696:41;;;;;;4690:47;4696:41;;:::i;:::-;;4690:47;;:::i;:::-;4739:3;4679:64;;;;;;4774:2;:5;;:2;:5;4777:1;4774:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4795;;:2;:5;4798:1;4795:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4802;;:2;:5;4805:1;4802:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4809:3;4788:25;;;;;;4815:8;:3;4821:2;4815:8;;:::i;:::-;4825:3;4781:48;;;;;;4831:3;4767:68;;;;;;4861:3;4874:5;;4861:3;4874:2;:5;4877:1;4874:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4881:2;:5;;:2;:5;4884:1;4881:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4888:3;4867:25;;;;;4861:31;4867:25;;4861:31;;:::i;:::-;4894:3;;4850:48;;;;4929:5;4850:48;4929:5;4850:48;;4929:2;:5;4932:1;4929:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4943:3;4948;4953;4936:21;;;;;;4959:3;4922:41;;;;;;4981:2;4985;4989;4973:19;;;;:::o;4922:41::-;;:::i;4936:21::-;;:::i;4850:48::-;;:::i;4867:25::-;;:::i;4767:68::-;;:::i;4781:48::-;;:::i;4788:25::-;;:::i;4679:64::-;;:::i;4696:41::-;;:::i;4706:25::-;;:::i;4613:51::-;;:::i;4620:25::-;;:::i;4564:::-;;:::i;4521:::-;;:::i;4472:31::-;;:::i;4423:::-;;:::i;4307:32::-;4325:2;4299:75;4325:5;;:2;:5;4328:1;4325:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;:14;;4334:5;;:2;:5;4337:1;4334:5;:::i;:::-;;;:::i;:::-;;:::i;:::-;4325:14;:::i;:::-;;;:::i;:::-;;;4307:32;;;;4264:23;;:::i;4239:::-;;:::i;4214:::-;;:::i;4189:::-;;:::i;4149:::-;;:::i;4110:21::-;;:::i;4069:23::-;;:::i;4030:21::-;;:::i;3933:48::-;3967:3;;;;;;;3972;3977;3959:22;;;;:::o;3937:20::-;3949:3;;:8;;3956:1;3949:8;:::i;:::-;;;:::i;:::-;;3937:20;;3875:48;3909:3;;;;;;;3914;3919;3901:22;;;;:::o;3879:20::-;3891:3;;:8;;3898:1;3891:8;:::i;:::-;;;:::i;:::-;;3879:20;;868:4258:26;;:::o;:::-;;;;;;:::i;:::-;;:::i;:::-;;:::i;:::-;;:::o;5069:731:28:-;;;;;;;;5197:7;;:::i;:::-;5206;;;:::i;:::-;5215;;;:::i;:::-;5242:2;;:7;;5248:1;5242:7;:::i;:::-;;;:::i;:::-;;5238:32;;5300:2;5304;5308:3;5293:19;;;;;;5341:2;;5345;5349:3;5334:19;;;;;;5382:2;;5386;5390:3;5375:19;;;;;;5424:1;;5434:2;5438:1;5441:3;5427:18;;;;;;5447:3;5417:34;;;;;;;;:::i;:::-;;5487:1;;5490;5493:3;5480:17;;;;;;;;:::i;:::-;;5506:3;5518:1;;5524:3;5511:17;;;;;;5530:3;5499:35;;;;;;5536:3;5473:67;;;;;;5569:1;;5572;5575:3;5562:17;;;;;;5581:3;5594:1;5597;;5600:3;5587:17;;;;;5581:23;5587:17;;5581:23;;:::i;:::-;5606:3;5555:55;;;;;;5638:1;5648;5651:7;:3;5657:1;5651:7;;:::i;:::-;5660:3;5641:23;;;;;;5666:3;5631:39;;;;;;5672:3;;5685:1;5695;;5701:3;5688:17;;;;;;5707:3;5678:33;;;;;;5672:39;5678:33;;:::i;:::-;;5672:39;;:::i;:::-;5713:3;5624:93;;;;;;5738:1;;5748:2;5752;5756:3;5741:19;;;;;;5762:3;5731:35;;;;;;;;:::i;:::-;;5785:1;5788;5791;5777:16;;;;:::o;5731:35::-;;:::i;5741:19::-;;:::i;5624:93::-;;:::i;5678:33::-;;:::i;5688:17::-;;:::i;5631:39::-;;:::i;5641:23::-;;:::i;5555:55::-;;:::i;5587:17::-;;:::i;5562:::-;;:::i;5473:67::-;;:::i;5499:35::-;;:::i;5511:17::-;;:::i;5480:::-;;:::i;5417:34::-;;:::i;5427:18::-;;:::i;5375:19::-;;:::i;5334:::-;;:::i;5293:::-;;:::i;5238:32::-;5259:2;;;;;5263;5267;5251:19;;;;:::o","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"getAssetInfo(uint256)","signatureHash4":"0xf637d950","signatureHash32":"0xf637d95099f1ea45f9d9ce39cf59bde8c28f6d41f3124a808b0c89bda7a9f0b3"},{"signature":"getEthKey(uint256)","signatureHash4":"0x1dbd1da7","signatureHash32":"0x1dbd1da701175b33db14eee349a704a08ba161fc5fdfd52f6b77daadaaaa7e38"},{"signature":"getQuantum(uint256)","signatureHash4":"0xdd7202d8","signatureHash32":"0xdd7202d8f7d6820ee36742d047b07c51b3a227196b5b9e077f0c755eb6d78a68"},{"signature":"getWithdrawalBalance(uint256,uint256)","signatureHash4":"0xec3161b0","signatureHash32":"0xec3161b097f863be08c9e02557a1e16ddd106f7db5d6af26d23020262b570a92"},{"signature":"HOLDER_1_AMOUNT()","signatureHash4":"0xf405f17a","signatureHash32":"0xf405f17a828d3566bb15868dbb06f732b5cca465fe86e35e44a7c2ea7dca8f8f"},{"signature":"HOLDER_1_ETH()","signatureHash4":"0xe8a91f30","signatureHash32":"0xe8a91f3037c53d4159a4456fbb13ce80f69a347936c11919172ee5f4931b4858"},{"signature":"HOLDER_1_KEY()","signatureHash4":"0x556cf28b","signatureHash32":"0x556cf28bd963ebcc8362ec8cb1b3b97f5ee23673583abc73832f634ea8825316"},{"signature":"HOLDER_2_AMOUNT()","signatureHash4":"0x582b9044","signatureHash32":"0x582b9044d6cac379936c3d3a11c0306c27c476ab849213f7bfa3089d0e578c84"},{"signature":"HOLDER_2_ETH()","signatureHash4":"0x58373971","signatureHash32":"0x5837397100846a4394787db6c7a4bf9b583ac311f8edb698545d05442fb36380"},{"signature":"HOLDER_2_KEY()","signatureHash4":"0x1710abaa","signatureHash32":"0x1710abaae04c8c89254b4742e84ea4437bda2cfaadbb00b89f2e3140a3fdd21a"},{"signature":"HOLDER_3_AMOUNT()","signatureHash4":"0x429a8208","signatureHash32":"0x429a820872d82af462080f72d9dc6a84c41b8046923018f15b21facde1b5d3c4"},{"signature":"HOLDER_3_ETH()","signatureHash4":"0xe6fb8119","signatureHash32":"0xe6fb8119676eeaa6fa028136495a65f1033c4fd4d966d3a13af0d3c63c1e898c"},{"signature":"HOLDER_3_KEY()","signatureHash4":"0xccefe7b0","signatureHash32":"0xccefe7b0d6cb0559d1c6cfd8901f71de7fe411221edd03d2fd94b70f0b236aba"},{"signature":"HOLDER_4_AMOUNT()","signatureHash4":"0xed3914d4","signatureHash32":"0xed3914d408b3e77326ba3a0617101437285ec94a11189dbd54ae469b76629071"},{"signature":"HOLDER_4_ETH()","signatureHash4":"0xb8ad077d","signatureHash32":"0xb8ad077d693d70fb9a8bb2bc195c81c9392d7c3dc5bc6f19a02dc8b30970fc2b"},{"signature":"HOLDER_4_KEY()","signatureHash4":"0x9cec9aaa","signatureHash32":"0x9cec9aaa244db28e81035daabbeb32253186ec8038dcd990bf93dfb3bda15252"},{"signature":"HOLDER_5_AMOUNT()","signatureHash4":"0xee4d01bf","signatureHash32":"0xee4d01bf92feea0dd01f56b0b98ce28c4944611d6e36a71150b68cbdbd66504b"},{"signature":"HOLDER_5_ETH()","signatureHash4":"0x1f0e8a12","signatureHash32":"0x1f0e8a129641d401ee3ed141d1184a98ccb9c93530187d4375b0337055685d88"},{"signature":"HOLDER_5_KEY()","signatureHash4":"0x46a577ed","signatureHash32":"0x46a577edca366cdd5cbcf868f1f551847fa0a5fa72eeb3c1fd9c098a09028e64"},{"signature":"HOLDER_6_AMOUNT()","signatureHash4":"0x4780404d","signatureHash32":"0x4780404d355ee12bca50142c926fee8eda2c05b4861a5906e0aa7c21d31762e2"},{"signature":"HOLDER_6_ETH()","signatureHash4":"0x1f7daf0f","signatureHash32":"0x1f7daf0f96ddf11ac7377ac15a1894c9643e14c1200bb0c1e60294bad3e4a27c"},{"signature":"HOLDER_6_KEY()","signatureHash4":"0xe2d8efd0","signatureHash32":"0xe2d8efd0c8127d613ca60a7356de8fa94d8388d0155662669f8cf7da962824f6"},{"signature":"HOLDER_7_AMOUNT()","signatureHash4":"0x988760b0","signatureHash32":"0x988760b09926da3e6d69ae27fbc4da039406fe76409b10f652f6960e40b1395e"},{"signature":"HOLDER_7_ETH()","signatureHash4":"0x9a0fa042","signatureHash32":"0x9a0fa042c3ca8392782ba11058b8fa5b087865fb30f60e6f9de3aed2675cac35"},{"signature":"HOLDER_7_KEY()","signatureHash4":"0x30eff5dd","signatureHash32":"0x30eff5ddc99cef5cbc5e0155b9b3e11a1167883572a7bfaa4397033df638580b"},{"signature":"initialize(bytes)","signatureHash4":"0x439fab91","signatureHash32":"0x439fab91f8ccf5be59586b9cf7bb7786c67a661a95ce1cfc146c1ed62922ae26"},{"signature":"isFrozen()","signatureHash4":"0x33eeb147","signatureHash32":"0x33eeb147b8dcd853bd1406dc19f8c3fc256250f30d658ed4a185d8ec5146ebe8"},{"signature":"migrateHoldings((address,uint256,uint256)[])","signatureHash4":"0x701f9fae","signatureHash32":"0x701f9fae22cc37fcb7a8ebb74b31f4ef784a1face06cd20b9e53ceab83a11c05"},{"signature":"migrateVaultRoot()","signatureHash4":"0x87ec36e3","signatureHash32":"0x87ec36e3d26a43f13221c28f28e12b0bb58064ccc82de0cb6b5485bb01c03efb"},{"signature":"migrationManager()","signatureHash4":"0x187ac4cb","signatureHash32":"0x187ac4cb508f07bff6f7ea8212589a61eb55ee23b2e7a6315c278b4e96453b04"},{"signature":"NATIVE_ETH()","signatureHash4":"0x011e1167","signatureHash32":"0x011e11676e5ffb090ca4ba3c499f68f70d7d596184aa5c641fd07b5eb07e7a0a"},{"signature":"registerEthAddress(address,uint256,bytes)","signatureHash4":"0xbea84187","signatureHash32":"0xbea841873b933e9569ab686194a6b80dafd57c171bd1798d51eee40ef1555b91"},{"signature":"registerSender(uint256,bytes)","signatureHash4":"0x86aeb445","signatureHash32":"0x86aeb445277d84bc5e7039a08c13d26b7f6fc3de43bfe003d5e46dcf1b5e5032"},{"signature":"rootSenderAdapter()","signatureHash4":"0x54f3ea7f","signatureHash32":"0x54f3ea7fbe45197c7964ad86e4498f90089e927af2f566d1bf612185907179e2"},{"signature":"vaultRoot()","signatureHash4":"0xb937f8f7","signatureHash32":"0xb937f8f77d9320a93a76382f9aa2c29fd169c76749e4776db2cca67183fa2d5e"},{"signature":"VCO_ASSET_TYPE()","signatureHash4":"0x34759ca7","signatureHash32":"0x34759ca7eacfbf93c5dc8a3ebafb1bec6fcae537cdb98f68fbc1ecbdc6907048"},{"signature":"VERSION()","signatureHash4":"0xffa1ad74","signatureHash32":"0xffa1ad74ba96b4c159a84d090433911c3991c54f629eb60d0c84aed3be5f067c"},{"signature":"withdraw(uint256,uint256)","signatureHash4":"0x441a3e70","signatureHash32":"0x441a3e70c6f476810f346a8a9bd493b00e9afd2ba1ab35eca9005dfd312435a9"},{"signature":"zkEVMBridge()","signatureHash4":"0x7feaf057","signatureHash32":"0x7feaf057341634da1a89cc60ff704e5aa11c2e9eb4d298950494f79ddb78a183"},{"signature":"zkEVMWithdrawalProcessor()","signatureHash4":"0xe9f5a4a8","signatureHash32":"0xe9f5a4a8f545838c58615489e58613b9423f6ba6525f4f8d0195bd47aaddbd84"}],"event":[{"signature":"ERC20HoldingsMigration(address,uint256,address,address)","signatureHash4":"0xbaffede5","signatureHash32":"0xbaffede578523e7bb616324498f96acc5cd38e6c6168c976d67866fb78ea958d"},{"signature":"ETHHoldingsMigration(uint256,address,address)","signatureHash4":"0x680cdeb1","signatureHash32":"0x680cdeb18e0632eaae1727127d3005efb3ea5dba23e34446c9e94cf2cf5f5577"},{"signature":"Initialized(uint64)","signatureHash4":"0xc7f505b2","signatureHash32":"0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2"},{"signature":"LogUserRegistered(address,uint256,address)","signatureHash4":"0xcab1cf17","signatureHash32":"0xcab1cf17c190e4e2195a7b8f7b362023246fa774390432b4704ab6b29d56b07b"},{"signature":"LogWithdrawalPerformed(uint256,uint256,uint256,uint256,address)","signatureHash4":"0xb7477a7b","signatureHash32":"0xb7477a7b93b2addc5272bbd7ad0986ef1c0d0bd265f26c3dc4bbe42727c2ac0c"}],"error":[{"signature":"AmountExceedsBalance()","signatureHash4":"0x96ab19c8","signatureHash32":"0x96ab19c82ea0e7379608e4dcc906ac9c83a5518c1d33c48d7cbf4d2646ac1a0c"},{"signature":"ExcessBridgeFeeProvided()","signatureHash4":"0x1733f9d7","signatureHash32":"0x1733f9d76569382f906ec4b0fb655e6c5b326874837e628a428f0fb4bb7f1147"},{"signature":"InsufficientBridgeFee()","signatureHash4":"0xdd3bd7d7","signatureHash32":"0xdd3bd7d7f329b48445b028b17c8bf5445f65465f08bae159d5c8b7bd88b3dbe2"},{"signature":"InvalidAddress()","signatureHash4":"0xe6c4247b","signatureHash32":"0xe6c4247b90bd06996a32d386bb770af9c0018dd1b0ebbb2df2c4499f1eda7b16"},{"signature":"InvalidAmount()","signatureHash4":"0x2c5211c6","signatureHash32":"0x2c5211c6cb73b16841677a034781e8336d18ce66df858e54153c86854e11f7b8"},{"signature":"InvalidInitialization()","signatureHash4":"0xf92ee8a9","signatureHash32":"0xf92ee8a957075833165f68c320933b1a1294aafc84ee6e0dd3fb178008f9aaf5"},{"signature":"NoMigrationDetails()","signatureHash4":"0x50917289","signatureHash32":"0x509172893e988e7a306edc025bc55a3de46cdddf4eb6909d36d52680ceb5a558"},{"signature":"NotInitializing()","signatureHash4":"0xd7e6bcf8","signatureHash32":"0xd7e6bcf8597daa127dc9f0048d2f08d5ef140a2cb659feabd700beff1f7a8302"},{"signature":"ReentrancyGuardReentrantCall()","signatureHash4":"0x3ee5aeb5","signatureHash32":"0x3ee5aeb571de7fc460830b4d0017439a1ca56fb0bc39062227ade4fe4a24c1ca"},{"signature":"SafeERC20FailedOperation(address)","signatureHash4":"0x5274afe7","signatureHash32":"0x5274afe73c98b4749fc91ffae6b7b574e7842cb2144a159e9377a5f20b32edf9"},{"signature":"UnauthorizedMigrationInitiator()","signatureHash4":"0xdcfc3752","signatureHash32":"0xdcfc3752d1a789e52d7b1a052550867b0d2d4d5fe5170ce60cb4f356236ff8a2"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"1","address":"0x273b65a7231321D4ee47a4c47408Ef43517455Ec"}