ETH Price: $2,112.92 (+7.74%)

Transaction Decoder

Block:
14899465 at Jun-03-2022 09:36:06 PM +UTC
Transaction Fee:
0.111641333595688962 ETH $235.89
Gas Used:
1,139,933 Gas / 97.936750314 Gwei

Emitted Events:

239 TransparentUpgradeableProxy.0x10e0571aafaf282151fd5b0215b5495521c549509cb0de3a3f8310bd2e344682( 0x10e0571aafaf282151fd5b0215b5495521c549509cb0de3a3f8310bd2e344682, 0x0000000000000000000000000000000000000000000000000000000001af0c33, 0x92af57b945459d93a7053250ea54f27127c27487ea618b5a9d9d48fdddc71ac5, 0000000000000000000000000000000000000000000000000000000001af0d81, 0c65e28a2817a9d986911a7f07b7317a7af5f04dbda8a2ea023ff5fa78990170, 000000000000000000000000000000000000000000000000000000000001274b )
240 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xa4b10ac61e79ea1e150df70b8dda53391928fd14, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1517434, gasPrice=97936750314, amountPaid=112068188368996928 )

Account State Difference:

  Address   Before After State Difference Code
0x284c1875...5a4B9438b 419.32098998808016804 Eth419.208921799711171112 Eth0.112068188368996928
0x4c6f947A...C874F95Ef
(Arbitrum: Old Sequencer Inbox)
0xa4b10ac6...91928fD14
(Arbitrum: Sequencer)
2.004196053651763776 Eth
Nonce: 72490
2.004622908425071742 Eth
Nonce: 72491
0.000426854773307966
(Ethermine)
1,692.270099280856006805 Eth1,692.271239213856006805 Eth0.001139933

Execution Trace

TransparentUpgradeableProxy.8a2df18d( )
  • SequencerInbox.addSequencerL2BatchFromOriginWithGasRefunder( transactions=0x03820C4B07FF08842C68B39683313CE3941111111254FB6C44BAC0BED2854E76F90643097D807C02520000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA10000000000000000000000003CD1833CE959E087D0EF0CB45ED06BFFE60F23BA000000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A0000000000000000000000008A2E722C2F167283E38FFEE0EE5F1A035596915F00000000000000000000000000000000000000000000000270801D946C9400000000000000000000000000000000000000000000000000BC0F9DC153002F75CA0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000001A000000000000000000000000000000000000000000000000000000000000003C0000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007E0800000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006493316212000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA100000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018414284AAB0000000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000004400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F9900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000629AA19DF31882FAC22D7F845EE8053C137A17410000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A4B757FED6000000000000000000000000629AA19DF31882FAC22D7F845EE8053C137A174100000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000003CD1833CE959E087D0EF0CB45ED06BFFE60F23BA0000000000000000002DC6C026271DFDDBD250014F87F0F302C099D5A798BAB1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000024432CE0A7C0000000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000004400000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A4059712240000000000000000000000003CD1833CE959E087D0EF0CB45ED06BFFE60F23BA00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000000000000000000000002ACFADE2909D3F47A200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004470BDB9470000000000000000000000003CD1833CE959E087D0EF0CB45ED06BFFE60F23BA0000000000000000000000000000000000000000000000BDF5EA56ABC2206CA30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018414284AAB000000000000000000000000000000000000000000000000000000000000008080000000000000000000000000000000000000000000000000000000000000440000000000000000000000003CD1833CE959E087D0EF0CB45ED06BFFE60F23BA00000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F990000000000000000000000003CD1833CE959E087D0EF0CB45ED06BFFE60F23BA0000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097D00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E26B997775368E012F3DFDB2197735A33824A22929F25E960463F63FEB6B44B825F2F2AC31E659E6B3863A0F3BEBA010212116928BA70B0E17EDD0D4EA781386474513AE010381C807FF819E842C68B39683094222945808773D6CE80E365EC001982C666FB44A69ABF3804918864F000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000F1F760D6B542916827E89C9EBFBEF9A836FABB8C49AB33FE19DD4DBB65DF7D06F5F2ADCFB050EA9BD662ED231FC53242D87FB626F3DAB6528D2E2E225C9EF86BA4B000382018707FF80842C68B39683128FC5949E6EF7F75AD88D4EDB4C9925C94B769C5B0D6281802E4DBE8F0000000000000000000000000000000000000000000000000000000000000CD9000000000000000000000000B5E89DC549B070CDD51FC18F1072AE9EC6E7A7C200000000000000000000000000000000000000000000000000000000034384900000000000000000000000000000000000000000000000000000000000000CD900000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000004185512C6949ED2549247547FC7BD963C96AB6B2574C5622573DCF495D400DC4EC6AC8575D3224E453AA2E4F7462906CBAAA40E9552971DC996827978F80A297061B0000000000000000000000000000000000000000000000000000000000000031F6C765DCD524F4CB81436401D37322169E94ADB3E8FCCD3C93CC1170C30E5538BC4B2D0B8F6E3996CFF8E111538B7DE762039321DF0374C07746FF316B8430010381E707FF4F842C68B396831AFAF4946999AF008FE1676F31091AB628933CBFCA7BD6F8809EE1A6910000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000005880000000000000000000000000000000000000000000000000000000000001C0E922A317C7C9EFDD95DE2E22C3D04AADC60DF5F624946FA712BA54DB22C4234A07957C369921F3BD80CABB1F96556E0D6DC3ADF92FCA2C25D6A5AF01646DF4E8D00036907FF820688842C68B3968308024E94A0A89DB1C899C49F98E6326B764BAFCF167FC2CE808ED955B9427B818A510CD180F917D0AAAC2AEF928DBF47214BCABD3BD72BF4F11CF80E83774E1C3425411D8B0FEC68ACCEE53B6A7129D54D6F3C5DADCD1B2A734A633E0D010382028807FF0A842C68B396830E06039453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000006BDBA37F6C8EFA793EF306B5B6D88F599D6B5E81000000000000000000000000000000000000000000000000000000000000F2CB000000000000000000000000000000000000000000000000000000000000EDEF000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000146BDBA37F6C8EFA793EF306B5B6D88F599D6B5E8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000146BDBA37F6C8EFA793EF306B5B6D88F599D6B5E8100000000000000000000000000000000000000000000000000000000000000000000000000000000000000002A5A75639BD9CD10DDA0E4B7618E1F9C52593046DB7BABBA6924F981C1DD31725B5FB1154C399EB422DDCC7B59E2018BAAC585DA425C33213A2627A20AF5A87C000382056907FF820642842C68B3968327299694737EAF14061FE68F04FF4CA8205ACF538555FCC88011EE3CF10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003E0000000000000000000000000000000000000000000000000000000000000276700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000002A300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004C000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000400200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000005D000000000000000000000000000000000000000000000000000000000000400300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004990D8D9E0E5D858BB53850CFF97DAD0E0E1828FC4C055A342939C316B0EC95FF66172A7D337BA58CF4167B94D0422E20FCE7E1A91F835BE9D32CA1B50B790DE7400038202E907FF82184E842C68B396832625A094ED9CA5ECD2068C29A0698460DB9B0372C8F87BD280E84423C30000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000181782CD621400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000005000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000002913E812CF0DCCA30FB28E6CAC3D2DCFF4497688000000000000000000000000FEA7A6A0B346362BF88A9E4A88416B77A57D6C2A0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000B6DD51D5425861C808FD60827AB6CFBFFE6049590000000000000000000000000000000000000000000000000000000000000001000000000000000000000000905DFCD5649217C42684F23958568E533C711AA300000000000000000000000000000000000000000000000000000000000000010000000000000000000000009DD329F5411466D9E0C488FF72519CA9FEF0CB400000000000000000000000000000000000000000000000000000000000000007000000000000000000000000BEA9F78090BDB9E662D8CB301A00AD09A5B756E900000000000000000000000000000000000000000000000000000000000000071ED72B5636588916EEE897761EDCE370849D0D77977C75E4A96BBD5FE676BDD730032CFED887E6B6E5F2727C0BF61C72864A17DDD2E8CE4A71AF96F8179C0BBD010382078807FF04842C68B3968336644F947BC8B1B5ABA4DF3BE9F9A32DAE501214DC0E4F3F020FBA84775900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006A0000000000000000000000000F1CBD468136ABB23506259E09FA9EDBCA5F1778100000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071AFD498D000000000000000000000000000000000000000000000000000000000002540BE4005F8C15A43395F86A718E6B34537BA9D7EA21A19663D0AB381F1B5EFE4EACAFD40000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000008EC75BC963181489D7FC1D892F687B8B0987D9EC0000000000000000000000000000000000000000000000000000000000000E230000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000007FBAAA0C67576B8F340E091A5FCC8DB106B8583C8D08FF2AED113EB5DE95C357000000000000000000000000660C8251CA9EE617621CE4D3CA3C95E1A57FF67E00000000000000000000000000000000000000000000000000000000629A7EAAE302DBCBA0FD89AE1BCA89B4F23E94E01ECB31479FB31D9609A2DC17CE7273F300000000000000000000000000000000000000000000000000000000002A419F000000000000000000000000000000000000000000000000000000000000000100000000000000000000000043B7EA3EBCDD8133BE85BEE435B06A3A2DB6CBCC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071AFD498D0000000000000000000000000000000000000000000000000000000000000000C35000000000000000000000000000000000000000000000000000000000000001A0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000002540BE40000000000000000000000000000000000000000000000000000000000000000C000000000000000000000000000000000000000000000000000000000000061A800000000000000000000000000000000000000000000000000000000000061A80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D3CCA77CD6DC2794F431AE435323DBE6F9BD82C3000000000000000000000000846FF49D72F4E3CA7A3D318820C6C2DEBE23C68A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000008EC75BC963181489D7FC1D892F687B8B0987D9EC0000000000000000000000000000000000000000000000000000000000000E230000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041C623A1E36A934FC0A234B07B22C8D54AD15E43C6E80AD3FAE146D6993DA240E91FDC87F0BD7950A930CB8B986F9374100AD14BC596D1229B0A04C8D3F9124F421C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000415D4BA1D6DDC7550DC9779FC53FB879C0ED1923372291C16D7AD9FF33F4806B102DE179D519C97142E18034A3E7BC6B1A84A6B2DB9B58EA9763730661E04AC8141B000000000000000000000000000000000000000000000000000000000000002F2FA14DCF6FC250D4DE7B8C49EE3647670074B6549BF95ED8E14A8D7F1C95F43573F21E4CB11BCAD8BDDC030E613D0167DBECC4641863BE0A7FAD7C09A99A60000382012C07FF81C5842BEADD72830C6064941111111254FB6C44BAC0BED2854E76F90643097D80E449022E000000000000000000000000000000000000000000000000000000012A05F20000000000000000000000000000000000000000000000000C8F94EF03BBD93EBB00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000002800000000000000000000000C31E54C7A869B9FCBECC14363CF510D1C41FA4430000000000000000000000001AEEDD3727A6431B8F070C0AFAA81CC74F273882E26B9977A993360DBD0C08F23CAFE1E12234C4C4F23CFD0D0BBADF7B83E857CACF2C990663EDE1369D2BBEC5FC4E3E6CB50AE4B489A2530CD1A3AC2AF31C05204B37A59001038201C907FF8226F08477359400837A120094CDC9BCE10F34761CCB2D6E3C02F10D377F299BDB8021D318B5000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000056BC75E2D631000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000068B3465833FB72A70ECDF485E0E4C7BD8665FC4700000000000000000000000068B3465833FB72A70ECDF485E0E4C7BD8665FC45000000000000000000000000000000000000000000000000000000000000000300000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1DFD7C136E6F944A15C1A0063DFC5991AEA09557391DD2106F30F7F997CB1EAE65D74754FD8C0822B176C5BC5446FD2667F59265E252C48FBF5531BEE17A1AFF700038201C907FF8211D58477359400837A120094CDC9BCE10F34761CCB2D6E3C02F10D377F299BDB8021D318B5000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000004563918244F40000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000ADEB25CB5920D4F7447AF4A0428072EDC2CEE2200000000000000000000000068B3465833FB72A70ECDF485E0E4C7BD8665FC45000000000000000000000000000000000000000000000000000000000000000300000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FC5A1A6EB076A2C7AD06ED22C90D7E710E35AD0A00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1AB780A93244D591CC70501558A07DF30AA1ED2953708D28EFC60BCEB25AF84401C6F8871931A9C968D1A0C43BF8D8621F0FE429B1498D083D1434A9B6109A76A00038205A907FF8208BD842C68B396831BB38E94737EAF14061FE68F04FF4CA8205ACF538555FCC88011EE3CF10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000002A24000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000705F0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000A200000000000000000000000000000000000000000000000000000000000075F700000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000005B000000000000000000000000000000000000000000000000000000000000765E0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000005C5A00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000005D3B4122CE9C9DEFB392F0EFE6619EC6BED6B2200451B74AE838F1D047DA63B7060756B25CCEC543A1F43A5C7598F702A7EBE4ECDEF214FB9B71BB6CCD0B46C2EE000381A707FF098462AFC7F883096F5F94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A41614000000000000000000000000000000000000000000000000011260469C00E00046EBDF1995718C63E90DE01742DD91DB5E821FD000106BF5581C9AFB08149DE958920F1A13959B3FF661EA9F912BCA19D712415672C1F8B46B61D2839CC36CA9000382010707FF19842C68B396830BAE339409986B4E255B3C548041A30A2EE312FE176731C2806943ACCE0000000000000000000000000AF85A5624D24E2C6E7AF3C0A0B102A28E36CEA3000000000000000000000000000000000000000000000000000000000000416F000000000000000000000000DE208627B38B9795284EFCC14D8B8C313462876A00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000070C1CC73B00C800000A5E740C7B9B6E18BAA66BB5BFD19C9B5721C1D8C1C959A6FC92C7D9C51B8B817C89D75D0E7175D4DB51FDF2A36A361ADE5750A674415202BCBBDB0ABFAF4BF7000382028807FF0A842C68B396830E11E59453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000036A61CB3CBDB46C4097AF03337451691D221793C0000000000000000000000000000000000000000000000000000000000012DAC00000000000000000000000000000000000000000000000000000000000127A3000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001436A61CB3CBDB46C4097AF03337451691D221793C000000000000000000000000000000000000000000000000000000000000000000000000000000000000001436A61CB3CBDB46C4097AF03337451691D221793C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C53CD46649675CCD8FCA812A3A12CCDB78B94FF45667B9624FE2B69681A19DA03D4AEBFA4545922064362C131145D755CB8E82A87AF935781A392D82A0EDCF3F00038201E907FF8201FA842C68B396831BDF71949E35CB5469DAF9D1E4F32EF3F250F5B26B45691B80D0F7D24F000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000057200000000000000000000000000000000000000000000000000000000000005730000000000000000000000000000000000000000000000000000000000000574000000000000000000000000000000000000000000000000000000000000065700000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000299000000000000000000000000000000000000000000000000000000000000029A000000000000000000000000000000000000000000000000000000000000029B000000000000000000000000000000000000000000000000000000000000029C68FBD19BDFD64B952ACC5F7352B7F64C63B6471DEF012CFEA7C9CE762B43740460147640CE77D10147BA1EDFAE7880F89FF45C77B695733B0BE449A828C8AB3D010382026F07FF01842C68B3968312BF549468B3465833FB72A70ECDF485E0E4C7BD8665FC45870203CCFB105517015AE401DC00000000000000000000000000000000000000000000000000000000629A7E1E000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000E45023B4DF00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000286B0D00B1536B7FF2D10ACDF39850B69B255DB7000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000142601CEA352E6000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210E8A0000000000000000000000000000000000000000000000000000000090D1905CA80A4CE4841E58A2F75582A8E3BB36B0565F9A84A30C1FF387C4E62B033FC4FFB9B9B24907F4AF709C32C530CB36CFD80D5B22C47175F9F7DA455640010381A907FF820121842C68B39683094101945E01C1889085B528EEFF5E1BEE64BFE94F45470380A22CB46500000000000000000000000009986B4E255B3C548041A30A2EE312FE176731C200000000000000000000000000000000000000000000000000000000000000012BBE860B6D4EB68081CC7C8D4512CD96D21BB42C4CDC89377924F29DD836265201658BBA5219EDD97C7AF9D799C991E9C9ADF08EB7C32EB71E1F59B4B50D8DDA010381C707FF18842C68B39683099A6D9453BF833A5D6C4DDA888F69C22C88C9F356A4161480C4DE93A500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000002F9F31C0000000000000000000000002A0315017FB58B8F889F790287E357E89FADA68DBF9018FEE797D1F2377D307A836ABC48889D75805FE1237CB55769B6188BCF0E3C890FB81EDBD22CEAD712E9DC5B06953402013F27BD68A3F7BD4240B828CEE2010381A707FF098462AFC7F883096F5F94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A4161400000000000000000000000000000000000000000000000000C3663566A58000D60F71E8DCB9A33146FC3596CA1803ACEBDF5CB3ADC83E7CF4B6D052A79E6DDE4875F1CB11E769A57C694C048D232DFA2F4B42644261F36302B109E84D134A06010381C707FF7B842C68B39683086C8194DA3CAD5E4F40062CECA6C1B979766BC0BAED8E3380AC99CCB60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000051F1EEEC181326EBA0E3EEF807A87896E5F81042459749D6670957FDFF380F3DA4D51F3D1E539FBF9AA11D32E04E524D9B32870230988DE06E6FD5B0F8558481324A000381AB07FF8302076685174876E800831E8480941A0AD27350CCCD6F7F168E052100B4960EFDB7748017835D1C000000000000000000000000000000000000140A00001AC9001AFC3E01C5D62600000000000000000000000000000000000000000000000000000000629A7D953F22F5D54DE47586F8086AA456BDB74E81AAAD2BD9D9259CFF9752A0597EBB2E418B924F99E41609C8FAD31E6B5ECB3BDE4057116649EC77C9E8D25169C7197801038202E907FF821B9B842C68B396830E5F3594737EAF14061FE68F04FF4CA8205ACF538555FCC880821CAB0B000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000621500000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005E000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000126F943F8ECC1740CDBF1425ECD5D3154A4129B8FC40ED2EA188CF89BED6AA029686F158C2094A6AFD7918E661865142DC4C440AA19D6CE99519F027038621B33000381A907FF8206E3842C68B396830CD61894539BDE0D7DBD336B79148AA742883198BBF6034280095EA7B30000000000000000000000007E2CC1AFC129E590D68E3455558DEF152BDCADB0000000000000000000000000000000000000000000000002629F66E0C530000089FFE0009581FBE5981F9DC77D84587A6E50B94EC1AD8C2E20DA2843825D667C43C51DAD0BB4DE58CF4778F89572DC3519981211E7F533FCD25E35813D5BFB58010382010907FF8202D0842C68B3968309821C9409986B4E255B3C548041A30A2EE312FE176731C280DC4BB22D0000000000000000000000005E84C1A06E6AD1A8ED66BC48DBE5EB06BF2FE4AA0000000000000000000000000000000000000000000000000000000000000EE5000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000001043561A88293000000000000000000000000000000000000000000000000000000000000062A3B7E0E1D9EA651E3621FF29B21F88F5A2AD11154D521022920CD7EAC50C2A9C16469A6BAAD1FE3FD7FA1E9938E732F045B0B24E5B578654B32FB481200BBADBCEBD7F0003818707FF14842C68B396830E934D9497E2768E8E73511CA874545DC5FF8067EB19B787802E1A7D4D000000000000000000000000000000000000000000000000109E9B7975C3C14B71D5E13112E5EA1465682D19584DB9177AE0B67DF0F285FEFC8782602CF06E98593E6AA277D7CFA18A5D68D6006C6A4272E19F6AEA04F2354613B688E990AA58010382014807FF80842C68B39683101A0C941B02DA8CB0D097EB8D57A175B88C7D8B47997506010F7FF36AB500000000000000000000000000000000000000000000000000000000001AD2D60000000000000000000000000000000000000000000000000000000000000080000000000000000000000000F990C33EDA5757F5580393A4E866CF25B270803200000000000000000000000000000000000000000000000000000000629A845C000000000000000000000000000000000000000000000000000000000000000200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC88B8E90AEC18730B1FE5DF0A109EA94B94B448BD8BC196667C185BBA1F844B1AA53041A1D936A5EF2FA86008816436C91AA90FE2AA7615842776B7DDA7DB5F8E7000382028807FF0A842C68B396830E06099453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000469A96ED4F7C927B1C3D0728150C3FBD6B1A4CE3000000000000000000000000000000000000000000000000000000000000D6D7000000000000000000000000000000000000000000000000000000000000D28B000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014469A96ED4F7C927B1C3D0728150C3FBD6B1A4CE30000000000000000000000000000000000000000000000000000000000000000000000000000000000000014469A96ED4F7C927B1C3D0728150C3FBD6B1A4CE30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000CF6F8F58DEDC97A43FAB868B52E1AA563662AEC381BC2915C16E2E7706A65EFB01D2AD3002F53244C9B21D4528D6C83775B146EAEA7783C188F79BA12289F926010382076707FF0A842C68B396832C5B1F9416E25CF364CECC305590128335B8F327975D0560801E897AFB0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002A0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003E000000000000000000000000000000000000000000000000000000000000004A000000000000000000000000000000000000000000000000000000000000005E000000000000000000000000000000000000000000000000000000000000000E471E70168000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000016E25CF364CECC305590128335B8F327975D0560000000000000000000000000000000000000000000000000000000000010C8E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000001B8BFFAA99A6BD1E925466DE910EB55D0E0342CABAEAB4C00B527F268029A4F8F969B4B7BD2755330ACA76D188191FD47A88050B782A4C8829C4F5D4360A5A66850000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646D4756D730323036000000000000000000000000000000000000000000000000000000003032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006456E596A8000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000001229C71482E458FA2CD51D13EB157BD2B5D5D1EE000000000000000000000000000000000000000000000000000000000000339900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006456E596A8000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000008C8A448FD8D3E44224D97146B25F4DEC425AF309000000000000000000000000000000000000000000000000000000000010953700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008499D4294000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C8A448FD8D3E44224D97146B25F4DEC425AF30900000000000000000000000000000000000000000000000000000000000033990000000000000000000000000000000000000000000000000000000000003399000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104C6F334120000000000000000000000008C8A448FD8D3E44224D97146B25F4DEC425AF30900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000084B3F1C93D000000000000000000000000DC705FB403DBB93DA1D28388BC1DC84274593C11000000000000000000000000B7310833027E677CC8A1A164437FCF1C0E42DEC000000000000000000000000000000000000000000000000402928FB36252E245000000000000000000000000000000000000000000000004E6B32169782C69E2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4C6F33412000000000000000000000000DC705FB403DBB93DA1D28388BC1DC84274593C11000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000246A627842000000000000000000000000B7310833027E677CC8A1A164437FCF1C0E42DEC000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007234378DE82E977983688DFD466EF2AB5B3C68A9BD44AD00B67714D9A172A5DD6449B49F1994C265BDB1E77FEA90C283A7DBE962C9089122B13304BA515ADD53000382028707FF13842C68B396831185C294BA12222222228D8BA445958A75A0704D566BF2C8808BDB3913B28670B3E7AD27BD41FB5938136BF9E9CBA90D6500020000000000000000001E0000000000000000000000007B7D8D58F8140099281C197DC0082A80BD6B49730000000000000000000000007B7D8D58F8140099281C197DC0082A80BD6B49730000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000A72159FC390F0E3C6D415E658264C7C4051E9B870000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000001503169895333600000000000000000000000000000000000000000000002C6AC9E9295C1526AD000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000082FEA4F7DF06B183917E5B7865F6065E0818D154F5F87BD019263048CC94892092E4800C2997B958B479CA9FCDD7662287DD1AB84C527F2098BE84DC9D0F49B5DD37FA0245DF9C7510003820A8C07FF01842C68B396832A799F941111111254FB6C44BAC0BED2854E76F90643097D090F7C02520000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB1000000000000000000000000897079C59882E01CCC5CFCF4631F5DB4EC43DC0F000000000000000000000000000000000000000000000000001FF973CAFA80000000000000000000000000000000000000000000000000000000000000EFF40900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000062000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000001FF973CAFA800000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004D0E30DB0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F9900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A000000000000000000000000000000000000000000000000001FF973CAFA800000000000000000000000000000000000000000000000000000000000800000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000649331621200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000024432CE0A7C0000000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000004400000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A405971224000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000986ACC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004470BDB947000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB90000000000000000000000000000000000000000000000000000000000F260860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018414284AAB00000000000000000000000000000000000000000000000000000000000000808000000000000000000000000000000000000000000000000000000000000044000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F99000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB90000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097D00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E26B9977C141E23EAFDF18CC233C07551C9630730A40411AC53D3F3814EA7A3B359F0A007A4A97ED86B241197FDE29F4A75C5E3873CDF87F0266B61C5B8ADE6AE9CE2B92000382024907FF82064184354A711A830F6F5794B88690461DDBAB6F04DFAD7DF66B7725942FEB9C80AC9650D8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000014489A153CC00000000000000000000000072FB4F7E277D362AB990BBF5E5299B46BD2E432E00000000000000000000000072FB4F7E277D362AB990BBF5E5299B46BD2E432E00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000470DE4DF82000000000000000000000000000000000000000000000000000000470DE4DF82000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000355C11536F830000000000000000000000000000000000000000000000000007C5E254D16C1B200000000000000000000000000000000000000000000000000000000000004E300000000000000000000000000000000000000000000000000000000C20332DB4D1EDE791674333CC4DB86C1286E8BB33086F8797CF540D19D3B34167CD13D4C4418DECC9206A36ABB8286458C5238C79E3A4688472BAD3EF04AAF43010382040A07FF82C74685E8D4A51000836ACFC09409410414CA067B8763CE62DBECA8160BE9CFD54880C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000A4FC0BC7B4AC5AAF373487E77A76C26900010BEA0206080103040007050209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000739570F700000000000000000000000000000000000000000000000000000000739570F70000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000075B372D90000000000000000000000000000000000000000000000000000000075EB1A2100000000000000000000000000000000000000000000000000000000767605760000000000000000000000000000000000000000000000000000000000000004F12C4D929B3E04576A06F7EFCB6725D51E59CFAFEA1F74F301BDC1302B2ADBD4DE06ABB9B6F35064D34AD275E5B4AF56BF19F324DDFE6E05FEB8B43A2DD0EEEF06EE0056A28C902F6F74491C551757C9304F2BA783E81021BB12607CADCBD716097B3064A3425963CBB953729B8B74A9DE19F8F4DCC2CEEAE1A36598ED4AF089000000000000000000000000000000000000000000000000000000000000000402BE91B5E908BC74B564F9FBF1C5ECE7A8BF294130DDB9B37B3EF0649EAEB0A0485D61AC4064B639DB2E6D71FE9B4722021779CA47B2DC0FB66ADA8D8AE7AAE031478B69290208766C8B850579CF6692DC99AE1B72810105276B97ABFC0ED95934CF9588FD583684417ED6F23F99EF48123CEAD49FD30D99A90CD2DFBFFE57AFCF89DCD6141FD18538118F4652565BAAE31586AF25D8B13021122BDC4B4C7FDF534593F14F9B6180D82F8D21B700BBA64E01132A2DE2846DB27C0FEE865E1954010382018907FF8201E2842C68B3968312D6D394664DBE3929C0E2EB9E4DD168E65D0AB8D32B6F6680B8560B62000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000054900000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001EBBB63B5B93C2952EAFDE9BD46C8F48D0D47B25D65B31C89459CDEE37C35D3B647EEEF49F9DE6C31569CAE94B075879FF964A4576D3E306BC9AA413152A6459301038201AA07FF01842C68B396831BFF55943D6BA331E3D9702C5E8A8D254E5D8A285F223ABA8207D20E332E0382000000000000000000000000000000000000000000000000000000000000010000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000326D2B5AECD2829F06851AEBBC0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000005774B318A95652C0453B2A0000000000000000000000000000000000000000000000000000000000B5E620F480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB18E340E76C4F7AA5F4FD0EB16659B14AE2C0136E74516EC6527D7390AB0914D9246EABBB9EEC96EB4618A8D5F5E22CE9F0189BB7D090E5F2309A2C0D2F04F31DF010381A707FF098462AFC7F883096F6094FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A4161400000000000000000000000000000000000000000000000000E2060D8C9C4000771DF282CC2928A10B2725C87DA22417A82F8A84B62253C2C1EA88267328CEFC3896F4CA2E8567B11C2516C8AC9564220D9E50ADDABA911F298755705015126D000381E707FF50842C68B396831C1340946999AF008FE1676F31091AB628933CBFCA7BD6F88070019C6C000000000000000000000000000000000000000000000000000000000000058800000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001BE4B120CF7E596360F1179F5E8C988CF058926C4034E598937886E769F80CD05D8D1961C27065950FDBC231C48B6DC86384614F1472905AF986532106B7ACF66645DCA3F0128D9E3F05BF8399DF305887C870F95450C7E75EFEBDD88FDE50E5A010381C707FF0D842C68B39683091CFF94DA3CAD5E4F40062CECA6C1B979766BC0BAED8E3380F93309D100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000855C2A22E98EFD4B3B96CD8D7447DCCE5F47A278ACB167E0C9B80ECD2931709820AA63A5948136877AFB8113F4E4D615A8C8F7378D33C7C1B54AC980AC604C16925B010381EA07FF82F90D85174876E800834C4B40941A0AD27350CCCD6F7F168E052100B4960EFDB774801389A3CC000000000000000000000000000000000000140A00001AC9001AFC3401C5CF1400000000000000000000000000000000000000000000000000000000629A7DA5000000000000000000000000000000000000000000000000000000000000985C0000000000000000000000000000000000000000000000000000000000000000F2AF119B4F31C41D772645A4A45CE3315AD4F2B69F520B533C89F6067E743DBD0CC4830ED92D1D9DBD8F11CE50192685874C7CB8B8171C09EF2BE345BEC0B356000381A707FF15842C68B396830A064C948E0B8C8BB9DB49A46697F3A5BB8A308E744821D280095EA7B3000000000000000000000000555766F3DA968ECBEFA690FFD49A2AC02F47AA5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99E38793FEF1659C4649A115B10541FE37898E41A2C240E4BA39654E011F0EE2751F4231C531C8ABE8DF0CB601A774F818C53BA9580206F7929E0A5D4E26591A010382028807FF0A842C68B396830E060B9453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000002019BFB20EE7D03C735BA46367D27B0E9DA77313000000000000000000000000000000000000000000000000000000000000F882000000000000000000000000000000000000000000000000000000000000F389000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000142019BFB20EE7D03C735BA46367D27B0E9DA7731300000000000000000000000000000000000000000000000000000000000000000000000000000000000000142019BFB20EE7D03C735BA46367D27B0E9DA77313000000000000000000000000000000000000000000000000000000000000000000000000000000000000000095C13C62AF0761B01E5C8C74BED39CCF0C8F8887FDE963BA5492CC0345D406BB6B482A96673D51F042A5513115C32D3BA4FC38F4994AADC11ADBE5DF82AB783001036907FF827AA5842C68B396830789849432A538D59CB0485F742E296F1F0B192823FEA671839A37EE0A614B5EF2CCCD8C169E2BA8DF084FF5395B3D6CD9E1DD8C78D25F07163397056E7BC0E61C955404A478FB702F45525CB2AF9EE84B7A1A328B6A97DC9360F957A6000382076707FF0A842C68B396832C53F89416E25CF364CECC305590128335B8F327975D0560801E897AFB0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002A0000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003E000000000000000000000000000000000000000000000000000000000000004A000000000000000000000000000000000000000000000000000000000000005E000000000000000000000000000000000000000000000000000000000000000E471E70168000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000016E25CF364CECC305590128335B8F327975D0560000000000000000000000000000000000000000000000000000000000010C8E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000001CFB01960EA2159A76568AE2B99F0FD823046B6C4A7CCB00845B8D5DD738B9BD8C680A1361B6F87F1932937C1F7148FA04865C1F600A746646326D49902EA3AB520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000646D4756D730323036000000000000000000000000000000000000000000000000000000003032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006456E596A8000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000001229C71482E458FA2CD51D13EB157BD2B5D5D1EE000000000000000000000000000000000000000000000000000000000000339A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006456E596A8000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000008C8A448FD8D3E44224D97146B25F4DEC425AF309000000000000000000000000000000000000000000000000000000000010953600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008499D4294000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C8A448FD8D3E44224D97146B25F4DEC425AF309000000000000000000000000000000000000000000000000000000000000339A000000000000000000000000000000000000000000000000000000000000339A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104C6F334120000000000000000000000008C8A448FD8D3E44224D97146B25F4DEC425AF30900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000084B3F1C93D000000000000000000000000DC705FB403DBB93DA1D28388BC1DC84274593C11000000000000000000000000691C61B6A26CD7FFF6E6C1604ACD31D47804BE860000000000000000000000000000000000000000000000040270596F06CDCF2A000000000000000000000000000000000000000000000004E68950DD0850E0C1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A4C6F33412000000000000000000000000DC705FB403DBB93DA1D28388BC1DC84274593C11000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000246A627842000000000000000000000000691C61B6A26CD7FFF6E6C1604ACD31D47804BE8600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002E4DF11EECB852BB00079641F118CFD2C845611F3396FEA578CBF7554D0CD0A51B2BA357E11436D388316C4234D66E088F4045588C15C558A0448E0858F3DBD5010381A707FF03843B9ACA00830F424094FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880A9059CBB000000000000000000000000F89D7B9C864F589BBF53A82105107622B35EAA40000000000000000000000000000000000000000000000000000000001D532BF43DCFE393E1A4F16EE9174DC91F7F71ECE4EDE88D87B007F5F54B15790FFD2A5A315B4F02257944A480171BF1C45878B2BE2EA6D1D796129B4E40A2C2E2E3F55D010381E707FF79842C68B396830973E494DA3CAD5E4F40062CECA6C1B979766BC0BAED8E3380F93309D1000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000753B390B5EFEF852FE4AA3C28BC8B1CF0496D6C69FB3BFF88CA316349E8735048CA81A65908C69B8090450BF5A0BC98D8397A93EFB167594465A246D154A1BC1F038000382024707FF0E842C68B396831A38CF949E6EF7F75AD88D4EDB4C9925C94B769C5B0D628180331239260000000000000000000000000000000000000000000000000000000000000CD9000000000000000000000000B5E89DC549B070CDD51FC18F1072AE9EC6E7A7C200000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000003440E690000000000000000000000000000000000000000000000000000000003440E6A00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000CD90000000000000000000000000000000000000000000000000000000000000CD900000000000000000000000000000000000000000000000000000000000000414F6D1E40DF8638256DD35D622473EFC8214EBD286EED0A47ECFF159656DE4E7D157473893536D036085496A61416662C85CDB01A966313AF0D11B807989DB4091C000000000000000000000000000000000000000000000000000000000000004F04BCB8775BAAC968F1A9DBC5E516B7EA77AA88B9B3A15008533D76A27D048161D7241D9EB7DFC6D634C79E56471B32A0846BC2DCD82905509EA2DD04BF76B90003818707FF16842C68B39683133FE394555766F3DA968ECBEFA690FFD49A2AC02F47AA5F80B6B55F25000000000000000000000000000000000000000000000000109E9B7975C3C14BECE5C2C797646B621B5BAE1B8E3359019D669AA0F35B423456B0ED6E07D6A9E27851289A00AB9F66BCAD2A0A9A800EB6EB7DFB37A9A97E3C2B5D44EE0EDBEB4D010381A707FF098462AFC7F883096F6694FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A4161400000000000000000000000000000000000000000000000000C449950FD72000B46EC8B3EEA062ED85EAD41362428BD067D7205679049766A4493C4FA49444432A45F32D38C00B70C661A352362E1D3635696BAC4D8216E8024D43C1A06C4B7400036707FF14842C68B396830841C7949769F208239C740CC40E9CB3427C34513213B83F803D18B9121F5AB45E184775C9034262E0B5994A15029FDA6C8234D172ED20AC590B004A253F71C1884076BBEC60FFAFDA29773D42B5D9686EBE300200223AA812C6FB37A8010382012907FF82D660843782E07B83117089943749C4F034022C39ECAFFABA182555D4508CACCC803D12A85A000000000000000000000000C8F4B05286FCB52F1243581A935FFE6604C2C0F30000000000000000000000000000000000000000000000004445FF74FC2059A0772247FE42359A050D3D386EC83F596BB66E983B8B297B0FF4F5CEAD9A6EF1C7000000000000000000000000000000000000000000000000000A53C3A71C43CB00000000000000000000000000000000000000000000000043C91DF26F0193420000000000000000000000000000000000000000000000000000000062A3B7EA7BCA1EFC925B4D21A5C3CE7A8D2C2E1BBC88449C0C02A9537DB8DB6744810DF7271FA06E5F92C2CB826F950CC00F0D87F04CAD036FAECB6090B83780865B2C15000381A807FF818A842C68B39683094EBD949F20DE1FC9B161B34089CBEAE888168B44B0346180095EA7B3000000000000000000000000BF00759D7E329D7A7FA1D4DCDC914C53D1D2DB860000000000000000000000000000000000000000000000000DE0B6B3A76400000A2BA72BC40829BACFD75D2D7B862092059E93D41B65579EBE078FE75A53FD6D3EECF28152442BA514D84FB90B12C72512185B119EF4086A3E2DB381132369E50003818807FF03842C68B3968307A953940000000000000000000000000000000000000064011025E16063000000000000000000000000907C804524E39A87914F70DADBA9BF2FD5BE9491F47F8D36B95AE158DA6B378988A2F0108AF6D9FE17982152D9747212F7CD4DAA7781DDC3830AEB7BA8B3BCA87763E6972225857DE84A4551341566A3A7CB9C1001038202CF07FF02842C68B396831DAC1994C36442B4A4522E871399CD717ABDD847AB11FE8887107E7324B10D2500AC9650D800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001E000000000000000000000000000000000000000000000000000000000000001648831645600000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000000000000000000000000000000000001F4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEC9EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCECB200000000000000000000000000000000000000000000000000107E7324B10D250000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008A7103BA776679DDFD9348548180D9EB7A798E9D00000000000000000000000000000000000000000000000000000000629A7E8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000412210E8A000000000000000000000000000000000000000000000000000000005DBDD247910D9AC3B4D8CF9A1D0422D7832F93EABF9218267A637487D5A526B0115E05715C3FA6A23316AAE448BB588CE4D5A00CC20E4AD93CC50A1C60273188000381E807FF81AA842C68B396830D1699945808773D6CE80E365EC001982C666FB44A69ABF3804918864F0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002DE0000000000000000000000000000000000000000000000000000000000000D3D22F5EE31CA5E75575D61EECD3046C28C8D8CFD0B7E652A9A49B4F419B345C03425D0D19227DD32447D466214CDEC42FF85AC124C4100017830543F627AF2240E010382028807FF0A842C68B396830E06109453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000007CBCB6B03114678560A6215DB10ABAAA8B977B36000000000000000000000000000000000000000000000000000000000000D7D2000000000000000000000000000000000000000000000000000000000000D381000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000147CBCB6B03114678560A6215DB10ABAAA8B977B3600000000000000000000000000000000000000000000000000000000000000000000000000000000000000147CBCB6B03114678560A6215DB10ABAAA8B977B360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000252C6E1B1B15E1F08F8A6DDABE2490744E179A930BEAB97E8195C6CBC5F4BCA24BA61012779AB3FD33AA3071BBAD9FC1F259BE75DA3D8E0F5DC031C6F014D759010382012907FF82013B842C68B39683098A1D94737EAF14061FE68F04FF4CA8205ACF538555FCC8809EFBFD71000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000802C00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000581F1AB882FBE7E3E58E04C482E4DF9314937C5F1B55C41355AC8CA45D7B0E85714203F9585C2AAB6DA5D0AD1CA3573738FC9CFE694A2D275334BECBC288F4770003818807FF818B842C68B396830A6064941922C36F3BC762CA300B4A46BB2102F84B1684AB802E1A7D4D0000000000000000000000000000000000000000000000000000000102674CED61AFE29DC420C794E1336F8456EF6E8352DD6477A5A190422BAD8C91870612C023EEAA056ED8356B8E8443EE505D7E1C4672337270C80BAD860D451501A60034000382018907FF820689842C68B3968310CDDE941B02DA8CB0D097EB8D57A175B88C7D8B479975068038ED17390000000000000000000000000000000000000000000000166271E9470CD09A6A0000000000000000000000000000000000000000000000252F3EBDC6FAF42AB700000000000000000000000000000000000000000000000000000000000000A00000000000000000000000005426F039C05B65DBA6CE6E775F1BC24CD057E51A00000000000000000000000000000000000000000000000000000000629A84AA0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000539BDE0D7DBD336B79148AA742883198BBF6034200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000051318B7D00DB7ACC4026C88C3952B66278B6A67F0727ED004E8746E398AF97484BB126B0F9F24D6FA673AAF342410CDD510091600518848FB2A95DF9715A1706D2A088E5146C9D74B781386757FCFE2D66C5C41F000381E907FF8202D1842C68B3968308E36B945808773D6CE80E365EC001982C666FB44A69ABF3804918864F0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000014FE000000000000000000000000000000000000000000000000000000000000029201BE8C9A2BA06AC8F3F4BD0387E71FC41C086BF9CEE1FA5D2702F84B9694D73857E8866FCD431D83193697C470B52B9898278B40D8E741E194BC0CF7F7CA12160003818907FF827560842C68B3968307C92F94252C07E0356D3B1A8CE273E39885B094053137B9808D6CC56D000000000000000000000000000000000000000000000000000000080EB049A204D585C082E3E6E86B469E951DA00FFAD6AA49F6C1CC4AC26AF6302E9E1EF17E1AFDD5A207C724BB0D4B9AF1C93519929A0425CC35075A92832B3DA0F663D9D500036707FF15842C68B396830841EE94A18413DC5506A91138E0604C283E36B021B8849B803D18B912707BD88634E3C0222257ECEFA5787C68E3DE67E1F0B438770328CB3BEEB405FD47766C887AE3FC18D17E2BEB18FCBA149800A09D4E3A37FDB71CAFE5EF7D01F70103818907FF827561842C68B3968307C34194C0CDD1176AA1624B89B7476142B41C04414AFAA0808D6CC56D00000000000000000000000000000000000000000000000000000000B41A09B195D7EC214FF7A59BF88BBE71BE57EE3A490B365309FAE51248DD453A2EF06DBE32C8ECE61AFCC15A00ABAA26A00D26F65DAC99CF0244652377D2F4797119BF77010381A707FF098462AFC7F883096F6094FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A4161400000000000000000000000000000000000000000000000000EA718E2CBA60006344C5C0219EE02842933A5B524AD54D966B50741A706772D4F6377179BD29204F664EE683651CEC59B2C3013E8B5C85A195F664A50FE321E642D4BD8133C0940003818707FF17842C68B396830DC4289497E2768E8E73511CA874545DC5FF8067EB19B7878084E9BD7E00000000000000000000000027306A984829900E86103CE24965BBC85F906426FE00E1553493111D1CB3DB3F167160BF767868D56636D256E3FD63048A0D3C37729353AFE4921745CE65E530541DCCED51E6FABE2934B81BCCE3FC0BF78E876E010381C707FF7C842C68B39683091D5B94DA3CAD5E4F40062CECA6C1B979766BC0BAED8E3380F93309D10000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000051F1E017FAB334DD227F375376767A8E7D85BB9AFF55EE1E6B3C1D9F00C8B554B16879D1D5CC96C36B011E0CE1C1FCEC3BC9744B40A3460ADAB0F7A4C0F154BE522200036E07FF820191842C68B39683078B7E9480C67432656D59144CEFF962E8FAF8926599BCF88829A47346E146C32F009CBF3A9AA7D7E3292F6DCB5E810F9B02064CE6F231F8EDD6D8AB3D8F2778EF2421BCC51A4A80DC78A36E94C389B45FCFDD95C969B36F6E9AD823260F05BB38220103818707FF16842C68B396830896EF949769F208239C740CC40E9CB3427C34513213B83F802E1A7D4D00000000000000000000000000000000000000000000000000000000D1250416E1B9D9FD8384F02AE946060723266B1A786F5A64E64D5A51571052505013AEFC6EA010E98306234B1948612069DEC8BF8012BAFB0C30D98AE13AA82CF1B9E2C2000382028807FF0A842C68B396830E0BF99453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000DC94DE71D25A26128D63459D08F95D7BB793A1AC00000000000000000000000000000000000000000000000000000000000101C5000000000000000000000000000000000000000000000000000000000000FC9D000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014DC94DE71D25A26128D63459D08F95D7BB793A1AC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000014DC94DE71D25A26128D63459D08F95D7BB793A1AC0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E432080B783B0864FDBAC874DE639F6E7EDB5CBDB2A43B984CA59F8BF19A10094B54484E2E715E956528671C8306745A1DE3EC6E3BA05C47631443BAD7A5BB1F000382012707FF2E842C68B396831078F2941619DE6B6B20ED217A58D00F37B9D47C7663FECA80A5977FBB0000000000000000000000006A5E32EEAD20DDFD7456BFDC7AA507737082F464000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000000000000000000000000000000000000002FAF0800000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000001812B7B0A0B0000000000000000000000000000000000000000000000000000000000005B2E12299D2CE127668E188BEE7352BA3AF8B6EC3B7F68A8868D0AD67737E201D60B3ECCCF0434C3F5E211FCC4419198DB62D8ADBE964C8C79D64D22924688BB7075000381A707FF06842C68B3968309302B94C9B45DA95B0545F3C675950A7D422B33F9D44A2D80A22CB4650000000000000000000000007BC8B1B5ABA4DF3BE9F9A32DAE501214DC0E4F3F0000000000000000000000000000000000000000000000000000000000000001DD6EB6FADD88AECE0F78C9846121A572EA301EF5E601BCBB7A4D4F4A099EB366614207574CF2C7D7130EBC36E61A5388F7BA573D7B28F5A3C4C2790BC1F38DA101038209C907FF1B84354A711A832CF8F894C30141B657F4216252DC59AF2E7CDB9D8792E1B081AB0FA44BBB1500000000000000000000000000000000000000000000000000000000000000200000000000000000000000004B298E988079AB2FBA509810FD712D82305A1E4F0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000025F83981097800000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007287C02520000000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000180000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB1000000000000000000000000C30141B657F4216252DC59AF2E7CDB9D8792E1B0000000000000000000000000000000000000000000000000025F8398109780000000000000000000000000000000000000000000000000000000000011547B4C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000032000000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000000000000000000000000000025F83981097800000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004D0E30DB0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F9900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A000000000000000000000000000000000000000000000000025F83981097800000000000000000000000000000000000000000000000000000000000800000000000000000000000489EE077994B6658EAFA855C308275EAD8097C4A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000649331621200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000026271DFDDBD250014F87F0F302C099D5A798BAB100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000018414284AAB00000000000000000000000000000000000000000000000000000000000000808000000000000000000000000000000000000000000000000000000000000044000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000001000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000064D1660F99000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC80000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097D00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000733D400400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000200000000000000000000000003405A1BD46B85C5C029483FBECF2F3E611026E453FD386923346030F375167C27E33FB640730CE6FB3E1FD88B6F0BE438B5CC54D7CEE7DCE0A3BCD562808D408B3CF4EB5507D7439C0CE9D19B9C669690817A295000382018707FF0E842C68B3968310160394DA3CAD5E4F40062CECA6C1B979766BC0BAED8E3380F68FA578000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000855C0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001B527818C3A10BD1D49EDFC615E50549A70A451D335588A79E25A3271CEE2EF2550404B1DF16FC737288B3E6439DC97F57D93882BA4345DF4541A3A68E1272423000381A707FF01842C68B396830ED5FB94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B3000000000000000000000000F7C86A5E1323E6EFB954B2E65EBBA9C300C40F38FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39A4C828816852C0EF2F212FF71D27985D07DD4EA305D9A753D6867E4DD19C2E33CB21A14BB3A0596793B109F99033F9434C5B25127B91288C50D380326FF21B000381A707FF098462AFC7F88309754C94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A4161400000000000000000000000000000000000000000000000001117CE6F2CF4000C9946164892C34D8D61434F0DFB0D5BAC329666AF21F339CFD0F5D4411A76AD534E117910906A4EE159405C404BD01A33FB13D7ED65C05E3CE7DF55895F2DE9A0103818907FF822727842C68B39683094424948E79C8607A28FE1EC3527991C89F1D9E36D1BAD980EE7524A41EA5D382A4C4312CDF69677455DF1D02CDF82B194A605196835C60D8A3CA05FCA30FFD59D345A4CC64757C83584EA28C8D6D855E9DB5B1E0DB64087B3CE9EAA0410E2EBD6BCEBA58198B07D992AEC00C444AF477F677021EE3652E26F7BE4DB40003818707FF17842C68B3968308971C94A18413DC5506A91138E0604C283E36B021B8849B802E1A7D4D00000000000000000000000000000000000000000000000000000000D1047D563D1FF9845CBF6B12CD55C8C3628A6EE09C3AF6A65E70BE9A414039C9B59FC3704DE338C0F79D93CDD51419031A4ED24F727451B4E5522057F99B512D3BBF2605000381A707FF09842C68B3968309E98C94FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB980095EA7B30000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88439CB8E19E56C5711E279D2ECDC4070E367C1C608877E1E438D59CFF87BE1F711ABD121DA647EB553828F8BC3BE55A78ADE441030BD9BD6595E38FF65C1C2600036607FF8299B8843B9ACA008307A1209489731F4DE587211461046E3929E78FE0F2D4EA06030F6481E0AE494E457528F0B9FDB538428584AD3A158FDFEEDB9717414F748BBA1C2801F083223D4609B8AEA5F027828C98A59B1A740D9A1610AED7BF757E6E39B2010381C707FF3F842C68B396830DAE3694146C57ABB43A5B457CD8E109D35AC27057A672E280A23E1AEE000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000000000000000000000000000000029DB55000000000000000000000000000000000000000000000000000000000629A84CFC51F94F0258D49B25A6A78E76FDA221DF47828A3E957362EEAB6D91140F0B64D39E0F9A1D6074832FE126AE62CE3864B9D3DF319DE4178AC43F58B117A8797CF000382028807FF0A842C68B396830E11DD9453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000006D7DB3F863A61F2364F4D28CA4024BA92AD009DF0000000000000000000000000000000000000000000000000000000000012CAD00000000000000000000000000000000000000000000000000000000000126A9000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000146D7DB3F863A61F2364F4D28CA4024BA92AD009DF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000146D7DB3F863A61F2364F4D28CA4024BA92AD009DF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000007D89897B50EF66B0C8705DC46E2A97A79BB0049205F18A8F934DC69AC5D27CAB1719C0FB4150867500206188687BAFAB460B8E5A4BB058AE803D1CF7D03170B3010382010907FF820542842C68B396830E78BA94F7C86A5E1323E6EFB954B2E65EBBA9C300C40F38808302CE5A0000004C4B400000000000007A647FFA000000000000629A92EA02CA012329012C0CAB71DF61DE6CD217BEBFE3A156CFF538612D4BB4EA13E0EF9D9E64BDC1E020F41C2A3F0B32FDDFB28C0E753A7D11E0020C8F5AC1D45595D578D21CD1B6AA000000000000000000000000000000000000000000000000000000000000001B00000000000000E5E4B22094A214F6E098D0281609E9E776AE6A2F00000000012193312C6EB57FC9E882512796BAB9204DDF821037DFAFF0141452CF1963926C1F5FF73F283EDAE1EE1B039CD50FB5D74E054E2B62A3CD97BD2DE17FB56751E0010381E807FF81B8842C68B3968309857594BED32937D8A5D1421241F52809908F1A17D75BDB80FDE2832F4554482D5553440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000001DCD65320D3FDE4EB42BE65D44BCE06CDC37DA78BDD5BDA68E730CAE5D5FDA20859C81C210A2790E17CC89B09475448074EE184D5D23C79E38B97B4946143476189DB5F0000381A707FF7A842C68B3968309317D94FE8C1AC365BA6780AEC5A985D989B327C27670A180A22CB46500000000000000000000000009986B4E255B3C548041A30A2EE312FE176731C200000000000000000000000000000000000000000000000000000000000000019BFC9546E591A4F74A770C021AF9C00B804F43871D9CFF7C454999EBFE23F9473193169D68140CBFD2AB301995CF4CE631B964595F13555F17E96918C5F2246900038201E907FF8201FB842C68B396831BDFE5949E35CB5469DAF9D1E4F32EF3F250F5B26B45691B80D0F7D24F000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000658000000000000000000000000000000000000000000000000000000000000087B0000000000000000000000000000000000000000000000000000000000000A8A0000000000000000000000000000000000000000000000000000000000000B720000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000029D000000000000000000000000000000000000000000000000000000000000029E000000000000000000000000000000000000000000000000000000000000029F00000000000000000000000000000000000000000000000000000000000002A002ADB0F942434425BF1270B0710467FF69006D5A6DBF75BBA5F355D5B3D6E5CC179587719AADD76B899BBC4D7949869815644B04CBC50020A3B3D834B14E1FFF010381A707FF098462AFC7F88309753E94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A41614000000000000000000000000000000000000000000000000011284A7D5CB600057BC592A1E77ED0BCCEAF17781F421F49071A16525E517E9761A6B19C561231401CBF446969079C95CA07494B5B3A825FC654B348339F2B4C5DACC7E76430FB700038201E907FF82013C842C68B396830D74C494737EAF14061FE68F04FF4CA8205ACF538555FCC880821CAB0B000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000802C00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AF1AFBD4CF0F1FC57D3B1C592896F5AC36CC6CF83BA62036403C9CA279E8628F615109A8FCCECC561C66590CAAF12FE7E2B87EDBB5CE059E3D35382907F4EE02000381A707FF05842C68B3968309E9E594FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B30000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD27C64AC83EA6E82D70BEBE36420BE1E1CCC1F9DFFE1355F65A5E655E7E8856F69BED4980EA4DE9788FE1D6BCE26C4C8E84759AB6CD0C33183A043EF11FDF2DB010382024907FF82E7F2842C68B396830C96AC94E195A15533C01C8CD6B28F09066842486F80F8F280CC064C8C00000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001A0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000087784C12B198C1683DC75482FA5BA00718B652F700000000000000000000000000000000000000000000000000000000000000014554482D555344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000029215CF12D20C86EB1E0432CE4DEF14105F384EDE4340BF071F38ECE9E880EF3256D867F0A493A9167B082FFCF0C50373019538D8D52F4CBAF933C9F4D650C46E09BE913F401036907FF820643842C68B396832DC6C094A094629BAAE6AF0C43F17F434B975337CBDB3C4280D1058E595E8872CE56D4F025E31C7BC93D9A418372E63DF8A84DB6472257F36D94A08EAA61CE21668975133311B44D7D4D5A4AE9B0875D0A42630A0854D232C40F8A3E2C010381A707FF18842C68B3968309D32494047CD47925C2390CE26DDEB302B8B165D246D45080822255DE000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000D12504168D5ED447FE5E71A89CADA00B61C88214F34D9F122EFD14761074BCBDA72EF4AD3D6329EDCB876337003BCBBFF19FDE439F8580FB74BAC32155CF765BD5783BC7000382012E07FF82014D842C68B39683108BC094ABBC5F99639C9B6BCB58544DDF04EFA6802F40648405F2E68D0AABE68EAA0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000059D8C800000000000000000000000037D0371D17E5E587B236504515A4BAABC08DA619000000000000000000000000000000000000000000000000000000000000000200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB10000000000000000000000002F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F692CEF2158093A55B8DE95899AB1813E9DC7AA28322EBA09C63C3A7DEA45BF901EF2D1A730B7AFDD30E5F8ACCB234E517D6406DBAF7F2699C3F5C54F198349FB010382018707FF7D842C68B3968310150094DA3CAD5E4F40062CECA6C1B979766BC0BAED8E3380F68FA578000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000051F100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000012D83DC2C8F1CA6A6558A8C31E207D5506F973BE2D272093491A4E7E87B52228828AD3A4C9904101ED2B6D0131DB86DA1D608A1157E27563BCE6583B2DB3DDCE9000382028807FF0A842C68B396830E11CD9453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000076B17D40589F17F61685871E780C65CD63B68D7C0000000000000000000000000000000000000000000000000000000000012DCD00000000000000000000000000000000000000000000000000000000000127C3000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001476B17D40589F17F61685871E780C65CD63B68D7C000000000000000000000000000000000000000000000000000000000000000000000000000000000000001476B17D40589F17F61685871E780C65CD63B68D7C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000134ED7576564DC40AF9ADEC66D0489381EC600B1EC544BF811B27A459507D9281B0E241BF6D2327076DB0461283B8310545A68E55AD43843DEC4E521786B6FB7000382078807FF0F842C68B39683365C11947BC8B1B5ABA4DF3BE9F9A32DAE501214DC0E4F3F7D0EBA84775900000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000006A0000000000000000000000000E6C4523F256CD57A28981335B67A2125E59CDB2100000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C68AF0BB1400000000000000000000000000000000000000000000000000000000002540BE4000B5F9A692B9451907D43AB5FF086EDE96E453A0236B13D22090A8AF809F037D3000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000642FFAB2752DF3BCE97083709F36080FB1482C8000000000000000000000000000000000000000000000000000000000000075650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000234D51BF959FBC41E518FDB10A473E8B3ECDB1102EAFBEA30B2D56992CC61998000000000000000000000000660C8251CA9EE617621CE4D3CA3C95E1A57FF67E00000000000000000000000000000000000000000000000000000000629A7F0B5AE25822F4F103D422592AD55AD7420E279594BE09CBA1F814C483D73914510800000000000000000000000000000000000000000000000000000000002A37DF0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000C1C62454DAE9A603A52FB73FC7D9655CECED712A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002C68AF0BB14000000000000000000000000000000000000000000000000000000000000000C35000000000000000000000000000000000000000000000000000000000000001A0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000002540BE40000000000000000000000000000000000000000000000000000000000000000C000000000000000000000000000000000000000000000000000000000000061A800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000D3CCA77CD6DC2794F431AE435323DBE6F9BD82C3000000000000000000000000D3CCA77CD6DC2794F431AE435323DBE6F9BD82C3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000642FFAB2752DF3BCE97083709F36080FB1482C8000000000000000000000000000000000000000000000000000000000000075650000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004147E81A8CDF188884D6345DE582842B88A2E8788CAE6CE53DE877E402336617EF3482185AFE3E713ECBE4A06698E33869327AA63AAC7E712CA671CC61667132C31C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041A1FFB94847BCFD4E07E1289362F681C99E7387A1BAFCA6EA3BCC0A74A19B31B0238A0DE8D114E8C51B45D117DF2B72FE8A4A3C6DF402D9624FDCB77A412820271C0000000000000000000000000000000000000000000000000000000000000003BB6E9D234982921EE3CBDBBADDE99B8B2874F22A19C8284DD25FBDE5586F6B564766EE094637E861882742BE42272CA8C295250908E587F4B41FC08455BB6D000382018707FF44842C68B3968311CE2694664DBE3929C0E2EB9E4DD168E65D0AB8D32B6F6680B8560B62000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000075500000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001A78908EE27C514420EFDEEE2841B118619B414ACEBA9816CEDCC3428E08613236BC24B99F73CCDBEE46A6CC6FC687F4D62A923207D6B4915F649F6CFD52EF399000382028C07FF19842C68B396830E36869453BF833A5D6C4DDA888F69C22C88C9F356A4161484386DE9DA039FBF10FC000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000002A0315017FB58B8F889F790287E357E89FADA68D0000000000000000000000000000000000000000000000000000000002FAF9FB0000000000000000000000000000000000000000000000000000000002F7295E000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023985BAC00000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000142A0315017FB58B8F889F790287E357E89FADA68D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000142A0315017FB58B8F889F790287E357E89FADA68D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001FA39EC0520248FEAA9AA9D356F25F4AB66289D6140FD03F0A4641E72E7D9D5775B9AB095CD8D91CCF939D432C350A5127EE6CFFF1E84B1863863ECA9BA8AD6A01036707FF51842C68B3968315E131946999AF008FE1676F31091AB628933CBFCA7BD6F880DE491C23D6F8180625ACE31CF804C75D4A55A9A0C7A8A74001807A60BD126CFCF7B791657D124168D9153A973C35D3FB158E3F464EF72E2C4ED4B9B65FC70502BF169FA300036807FF827AA6842C68B3968307819C94A86D3CA8B52874FDC6938663D6AE5F89246356538223250E22CA262C42F7E78C919ECEB4819E07F29C57CB5E340FAE04EB8CD3290FE2450E7EE3E0CFA08F33D76E565BF4457CCDEBAFDB3864FACB0C379EF588E59188EB27010382012807FF819F842C68B3968309FE60942264300798A17DFA10EA66C4F38BA7BCA4455B80801D8D71F000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000679FC20B910492E3C680A96B62AEE7096F05E8141E8180B847F68A26055036AA6092BAECC29647B8FF81BF22B5A597BC7F961085006C01548754CCE774C0CAA38000382025007FF818C842C68B39683145C969468B3465833FB72A70ECDF485E0E4C7BD8665FC45871273EECEBBD8BD015AE401DC00000000000000000000000000000000000000000000000000000000629A7ECE0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000124B858183F000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000800000000000000000000000008B611A0747F714F657C0A8575F877EC5AD9189D000000000000000000000000000000000000000000000000000B887541356776200000000000000000000000000000000000000000000000000000000DA03524C000000000000000000000000000000000000000000000000000000000000004282AF49447D8A07E3BD95BD0D56F35241523FBAB1002710A72159FC390F0E3C6D415E658264C7C4051E9B870027101622BF67E6E5747B81866FE0B85178A93C7F86E300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A6C9CCC510C50322777D29A1DFEDCD4CFD68F2A18BCFD7E155FD20AFB2FDECDC76AF8B00953B24192273F200B78AA08FA909CE0A25BE2E9FF6FD9807C6399EC5000382010707FF7B842C68B396830A43419409986B4E255B3C548041A30A2EE312FE176731C280764D63C7000000000000000000000000FE8C1AC365BA6780AEC5A985D989B327C27670A10000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000001190673B5FDA900000000000000000000000000000000000000000000000000000000000006313C7BF4DB8AD5121AB7EB99AAFC0EF795965353593020534EFB5B6ABB7F4EEB17CDC0A5EF632EF4D42EF178F5F6A813371F0680AE7C4093E3662A9719DD0F6A0C78753010381A707FF098462AFC7F883096F7194FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A416140000000000000000000000000000000000000000000000000137807ED5E8000004202A02E468EBEB61CC20488414D43630ED0CE324B98E06DCF0BF1708E93C53372D4B266854754C2B83153E6D2CA84763D82C24275DD89032FFAFF4092D4C4B01038202A807FF81B5842C68B396831284C994E592427A0AECE92DE3EDEE1F18E0157C0586156480AC9650D800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000104414BF389000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000629A7ECE00000000000000000000000000000000000000000000000000000000487AB000000000000000000000000000000000000000000000000000092CD771B6F1B00A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404B7C000000000000000000000000000000000000000000000000092CD771B6F1B00A00000000000000000000000060C92305CE125B440EF97439F26396F2F3BEFF480000000000000000000000000000000000000000000000000000000014D239CE376B8E057C2E34E71A428A3EEDC18A1FFB543A9FF11DD82185FAABDC2C4E8BF700FF12E3CD7D18A8CD47AF8DEB0BE15C9FF09474151BD853A792AD3C0103818807FF81EC842C68B396830B99449458B1422B21D58AE6073BA7B28FEE62F704FC25398050F70AF9000000000000000000000000000000000000000000000000000000000000057A5666D75306A908346F4C5E385EB34C26F71EA065C2484BFCC74B48B332B646D30DA5255BBF08E30C4222DB7C900C17CC5CB694BE1781E992B28DBA9655E84FA4000382016807FF47842C68B396830E5A749433CEB27B39D2BB7D2E61F7564D3DF293440204171710EEA0D7B20000000000000000000000000000000000000000000000000000000000000001000000000000000000000000D694B5DB4D1BFF216E2FE3B3B72CF2F5CE95C56B00000000000000000000000000000000000000000000000003311FC80A570000000000000000000000000000000000000000000000000000002E77D6CC3BA26300000000000000000000000000000000000000000000000002FF3267A9BBEB3E0000000000000000000000000000000000000000000000000000000062A3B86800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C0D544C6072C84E6F96195DBFB42D0D830C4481AAE08102C2675F520417B47E276D25B9EAFFA8E561C03E15FC2F0A75D27E59B74423E91E1C26BF8DF77464DC701038202A707FF02842C68B39683126BD49468B3465833FB72A70ECDF485E0E4C7BD8665FC45805AE401DC00000000000000000000000000000000000000000000000000000000629A7ECE000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000E404E45AAF000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB100000000000000000000000000000000000000000000000000000000000001F40000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000001505992300000000000000000000000000000000000000000000000002C44A7B2472D0EF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004449404B7C00000000000000000000000000000000000000000000000002C44A7B2472D0EF000000000000000000000000585E318D505764C2590B1C576D5F36CD12438EDB00000000000000000000000000000000000000000000000000000000D31710C35BCB6E9D06B5E7F913B9F4E962E35C4FDCD46D0B21CFE592751EA9384FCEAE7BD44430C7A4BD8A3A3F8AD545B07E9D42F423FCE14C8F7D2917ECBEA1010381A707FF0B8423C34600830A09AA94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000032C85E56A82D66FA3C13E7DF900682D63FCBAF89FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC86DFB2C96CF2A46CF8D4D8B43BC02B485945E9F84D72ABC928226D32535C4FA036D06227978CC151C3F4DC832B04027B8FA06DE2B04945EDFD37FA0A853DFB001038201A907FF820DF8842C68B396830F291B94F315A5CC91338A3886D3C3A11E7B494F3302B3FA80C6AE83FF00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000002316D703BF8C0ACB00000000000000000000000000000000000000000000000000000000000000E038E52E2443FDF23C9EEE853679862B89386A8F4DB42929E6D8B6ADABCF00A14000EFAA1C68A5A2D0B52FA82F2A66F4006EBFFF24FF29F0929FE900015FF7DF00002F0A2B509DAB931CC6A163BD0863E4B27D30018BEF60039BBD4041637E0A40FEF4DA57FBFF800C76B0BEC4E01386E1261B2ABFFF8030DAB0D2C39C7BFC3280DF79B112B21433BFFE6105AC8C7EAFD36D9BCB8503FD1162F328C060A327B28000A9500F8AAC05101A73CE2422425A1E3F4D9013C5FB73D2EB00401EBB450000FFED700ACD2EEB0C8EB2A4B20B374D9F388F5694E2AB8BA3FF00259038000000D90F8871AFB3F8445B73E97D26D2C8D00B8F993C626F0A0879BAB1BC65A4E8940FED2849F249C29378F89D2444F83A38A3D4EB77842E150EF4D227BEF5F86CC2000382026707FF41842C68B396832646A494A6B71E26C5E0845F74C812102CA7114B6A896AB2801688F0B90000000000000000000000003E5C63644E683549055B9BE8653DE26E0B4CD36E0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000001812B7BF21C0000000000000000000000000000000000000000000000000000000000000164B63E800D0000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000F48F2B2D2A534E402487B3EE7C18C33AEC0FE5E40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000F36BB95548AE036B8ADD44F94CD0D01316825A20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E9433C9E2759643D535C82876854B7E9B4EE1609FC9C84BC0BF978A2ABB013EE2D7F6B8CD2BB0B896511B0BAA2F112D5B13F92249F9DB8445EAC4D6FDFDE7F06010382028807FF0A842C68B396830E11F69453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000004A17BFC446CE61D2B450701AB9D7C6347E046B9E000000000000000000000000000000000000000000000000000000000001567F0000000000000000000000000000000000000000000000000000000000014FA5000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000144A17BFC446CE61D2B450701AB9D7C6347E046B9E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000144A17BFC446CE61D2B450701AB9D7C6347E046B9E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001BE6FAAEDCA029FAE5CB04786AACECF494B2EBBDD1C93FFD9B1A353FEEAD44C34BFE23A9FE8B376167035A8A6352CEB8674407A627BC0EA6203079CDD8C30E92000382010707FF7C842C68B396830A49329409986B4E255B3C548041A30A2EE312FE176731C280764D63C7000000000000000000000000FE8C1AC365BA6780AEC5A985D989B327C27670A1000000000000000000000000000000000000000000000000000000000000753B00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000119E47F21381F40000000000000000000000000000000000000000000000000000000000006313C7BFF71CAD257DBB1F971AC73A83EA5048800B7B6FD56A1202B73BC1FA87C09824546D9981B32819D78A91C3B64C50B1CC4942A1C8E82A4DBF5F7764F9292DF40E9A010382012807FF81AB842C68B396830BB07D942264300798A17DFA10EA66C4F38BA7BCA4455B80801D8D71F0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002C9E8A580D5668FA512EED54476385E3CC92C9231F3EF6158DF543174B4A7B0786546A3A026E801E7CDC42A14F30B705373CC49B660CD4B9D7FCEEDB985A16FB0000381A707FF098462AFC7F883096F7794FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A4161400000000000000000000000000000000000000000000000000DF9B98B629C0004684416BA31F16F8C39635E8E4D42300419F69C2EC4859DA973413CF549E17E666787F5FAE43B157AF3CAFA33ABF7CD450AFD3129A0CB6DF1CEA53BA46C45256010382014707FF52842C68B3968321C511946999AF008FE1676F31091AB628933CBFCA7BD6F880B80639470000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001C0E0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000048856BB95694DEBBE8F8168403CAB912D31A079B9B05700B8514D88460697839105DAE876E59AF2A0D129C454AA5E4AA80942B5A0283746A7AE71A32E5D4CF77E00036907FF8201C6842C68B396830CF9239420DF4953BA19C74B2A46B6873803F28BF640C1B5804641257D399B7CBB5EEF98D2539BB7F6F8B913F9C8239734D45EC042A0871BC7E8D1B70F0FC90A1BF06F548B5923214A30DEAA4AF1CF29529C6511810FAA7CC19E613949000381A707FF02842C68B3968309E99D94FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB980095EA7B30000000000000000000000001111111254FB6C44BAC0BED2854E76F90643097DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EB0FE3CC1FCF5E0343C51B3468A89261085A6FCE39EBB4950AB6D81514EB62B6C600C3B1BB58AC4F1436BABCDED2C18B3C53D40246C1673D2E4E21ACAFE0E990003818707FF02842C68B396830D594094283CC5C26E53D66ED2EA252D986F094B37E6E89580F3701DA20000000000000000000000001DFF847E2F92DE32F5ACF3E44241FEECAA93B039DBFD3DA4A797107B5A52095A190129010D8136D042C8895C3E62EC32CFB687E16EBBC5563E4676C1BCDAC5A22DEC7663AC667861FB34B04F8879D4FA417B073500038202E707FF0C8423C3460083136DAB9432C85E56A82D66FA3C13E7DF900682D63FCBAF89801E9A2E9200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFAABCE766C86D9C5D70D2CB9D10BAB6729197E50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000691C61B6A26CD7FFF6E6C1604ACD31D47804BE86000000000000000000000000691C61B6A26CD7FFF6E6C1604ACD31D47804BE86000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000000000000000000000000000000000000068E778000000000000000000000000000000000000000000000000000000000068E778000000000000000000000000000000000000000000000000000000000068FA524000000000000000000000000000000000000000000000000000000000000044C00000000000000000000000000000000000000000000000000000000629A7E10000000000000000000000000000000000000000000000000000001812B7BF9E40067616E64616C6674686562726F776E67786D786E690011CD1511E4DBB9000000000000000000000000000000000000000000000000000000000000000001E00000000000000000000000000000000000000000000000000000000000000041963596AA0327781A7EBB101F5FE701AB6B35FE474CD9263BC239FF797302DEAE322CA4B01B71ECAB2C61E741A3B28671A01FD8AA40B2A2205C6853A78308004F1C000000000000000000000000000000000000000000000000000000000000006B266691FAF19EA7B93E74BA8882F89B3AC7E443E04275E551B683CF9C0FE13061024A4D918F066EFE9AA1237AA1330F7896B6CC36F1974B221F44CAC20752D1010382028807FF0A842C68B396830E06299453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000C33C53FCF2A783DF018EF0A1E57B8F833D32A50B000000000000000000000000000000000000000000000000000000000000F5D9000000000000000000000000000000000000000000000000000000000000F0EE000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014C33C53FCF2A783DF018EF0A1E57B8F833D32A50B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000014C33C53FCF2A783DF018EF0A1E57B8F833D32A50B0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E7D8BD41FBFA3D7289B7EE747E1D5FD44613540C4E422880E2E0CA1AC7618D26594D11A10264ED714C4EB25610E5EC7A8FF800D06B882C1E200284576F8F9276000381AA07FF820A1A85028FA6AE00830C350094539BDE0D7DBD336B79148AA742883198BBF6034280A9059CBB000000000000000000000000A7D4699CAEA39C1F78974C9B5CF173B6F8A2242400000000000000000000000000000000000000000000000263AD6879B01E00001CE70C2F2DC9154B25B40968A41F5AB830E00078D29125CC79B37B220AAACF6D7EE097B6F4FBFBF86C3B5A01CCEBAC242E33F91FE15E36DE4993C7DE7A8B2FE6000381A707FF19842C68B3968309D33694047CD47925C2390CE26DDEB302B8B165D246D45080822255DE000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000D1047D563B6233C2D24BC30259940E275E20A1B8737B21E876E216DBE2903D32E390471B5FA10B5DC65AB84CB44781A256DA7005CAFC8A4E02F9D102916504546DBB0B12010382010707FF0D842C68B396830BB3299409986B4E255B3C548041A30A2EE312FE176731C2806943ACCE0000000000000000000000000AF85A5624D24E2C6E7AF3C0A0B102A28E36CEA30000000000000000000000000000000000000000000000000000000000003B46000000000000000000000000149DBD2A2BDBAC79C22ECB5378FA974D9A6A5711000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000821AB0D4414980000C3613E4C6BF26C6409B619E65124300657B68EF94F49810CA0500110DE3EA9556DFC9C1039B4B7FF1738376ED7AF56BCCC2E6A34285BCA2CCDDAE92234C1E39E000381A707FF0A842C68B396830AE4B19464541216BAFFFEEC8EA535BB71FBC927831D059580095EA7B3000000000000000000000000104F1459A2FFEA528121759B238BB609034C2F01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF308A0D630AFEAEE90181AD6C876AB0C32AAC3F276B6D1DA95BB036F6D7ADB986053F3D58B315039F199EFDF0C185CB66629EE31B6DAC88AE9BD696A9857BC0DB000382010907FF820644842C68B3968309FE1F9409986B4E255B3C548041A30A2EE312FE176731C2806943ACCE000000000000000000000000F3D00A2559D84DE7AC093443BCAADA5F4EE4165C0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000B78EE0010AED2F411161C4E4415215073EC12C070000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000001236EFCBCBB340000705D8F0145CF1142A304D9078DD7F033A2E17B06CFE9EDE8D5A6C91014FFA1FA02ABD7435BEC19FB7CBE75C86CBBDE5061814E56173BEF478ED4EF90462A7165010382014707FF1D842C68B396830A23E2945E01C1889085B528EEFF5E1BEE64BFE94F45470380F242432A000000000000000000000000DBE3ACF6BA61C1726258F6F2E3561BF0D8BAE192000000000000000000000000D0D472BBE7AFD16CDE245F5F600B857C2CC645760000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000007EFDD5E67BBF1185726FDFDFC97899D916527339364C1E790A5FE2A37186417C7C3412331191381D3821AB44B3A3A4C6C5C245B84521E886AE7D8872391DD482000381A707FF098462AFC7F88309754C94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A416140000000000000000000000000000000000000000000000000107936973E2E0003BC9EAFADAAD08F441419546C6AB1E44D39B93DEB6570770D529AC6EB3CFAF1F63FB75E3009259ED16A4D2E4D2C556BA6FA5056B31852D41CF88EA45F32FDEE7000382016907FF8201FC842C68B396831086F2949E35CB5469DAF9D1E4F32EF3F250F5B26B45691B80D0F7D24F000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000012C900000000000000000000000000000000000000000000000000000000000012C9000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000002A100000000000000000000000000000000000000000000000000000000000007C1B0A11B5BFF73959F9F92319E771CD327504CBB54AE800BCECEDE4B3D61E98DAA46CB07A575788E1DF3E0E1E1A5ECA6BD56ADC25D2C8ED27CE40EA44DA7B37D62000381A707FF38842C68B3968308DA5C94284F8503A71EBA80F466DA7878E476C71BA9DCDA803A61785A0000000000000000000000000000000000000000000000000000000000001F470000000000000000000000000000000000000000000000000000000000000000F86B7151BD645B98B8DDB49B93DBC27EF19F5D509BF3069888A19B167B331B2D40C7F8BE1306B8CFB483EFA593D24EEF8A9C7EE8A3081BE531DBB684E273FA6E010381A707FF6A842C68B39683093118945E01C1889085B528EEFF5E1BEE64BFE94F45470380A22CB46500000000000000000000000009986B4E255B3C548041A30A2EE312FE176731C20000000000000000000000000000000000000000000000000000000000000001C03EC1DACEC00596E88693525CAC210673C54E1CB1F4675A49E9F0FFBF94D1AA11D63BFD5795E6A27918CA1B0E8ECBDAD600509378FFD19ECE72FEEEF782F5830003818807FF818D842C68B3968307D005942ADABD6E8CE3E82F52D9998A7F64A90D294A92A480A694FC3A00000000000000000000000000000000000000000000000000000000EFD07421E81E37C7F8A3600FC6FEEDF624203D439C9E19EF61F14CF3251349D4BFE1BC966DA4F542F4CC2116E5E70327D4240FED593CF8CE5EF5D7D121E434D4E7788B60010381A707FF0B8423C34600830A099494FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000032C85E56A82D66FA3C13E7DF900682D63FCBAF89FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53C6E2E1FC148A2799D6574258B5BA1A1F996F97EC40F3C549422577D17FF56614F61BB51C2E07D7171EC9659CD4F3000F5A055EB9136526AA016AFCDDF5ED9B010382012907FF820543842C68B396830DB54094F7C86A5E1323E6EFB954B2E65EBBA9C300C40F38804D11B0F10000004C4B400000000000007A647FFA000000000000629A92EA02CA01232901D0FB8F39845634C36B805B0491F28C4B9976FA34EF922157F2333E2349FAB3241D4453A77967D4FDEDC4AF15EF90FAA36B88CC4951A486E4033A6F705B2E8211000000000000000000000000000000000000000000000000000000000000001B000000000000000000000000E5E4B22094A214F6E098D0281609E9E776AE6A2F00000000000000000000000000000000000000000000000000000000000000013F7DE7B1BF50F875D5D927FB1686638FF32FE615EBACD82FF2F0CD14FA87605D64EDA445BBD3F214BC383DDEE543068C0C4DB0A2C673C3ECE8C6D7C4D879929E000382028807FF0A842C68B396830E11E49453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000C7C852483FDB17A1923A41357BA202975F7A85D900000000000000000000000000000000000000000000000000000000000121C80000000000000000000000000000000000000000000000000000000000011BFC000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014C7C852483FDB17A1923A41357BA202975F7A85D90000000000000000000000000000000000000000000000000000000000000000000000000000000000000014C7C852483FDB17A1923A41357BA202975F7A85D90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AD70F34BBA70144944430028278284DCE5DC47906BBCBBD42852513508F4F75E208BD67908C5FC822C825CB880003ED8B48C2BB29630B962B573BD4FE4DF4BFB000382040A07FF82C74785E8D4A51000836ACFC09409410414CA067B8763CE62DBECA8160BE9CFD54880C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000A4FC0BC7B4AC5AAF373487E77A76C26900010BEA0606010304000507080209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000007391EAA40000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000073EE58400000000000000000000000000000000000000000000000000000000074A8EE600000000000000000000000000000000000000000000000000000000074AA7F710000000000000000000000000000000000000000000000000000000074BA7C280000000000000000000000000000000000000000000000000000000075EB1A210000000000000000000000000000000000000000000000000000000075F0C3390000000000000000000000000000000000000000000000000000000000000004B0EE057BEB89A7C6D183EA7E7F5201896095B331DA78B417A92312F0B3112A336E3BF7AC9E53D5C1A433EE87CC0215DE8CE89D58CDCF44145BE1FA35146956EC4D26BFAA6E79D3F741E945A780197149304DB80FC71327CD7679E591047C2730C1E0D0F2817AF3B46EAF4EE9FAB1D29300170B96EC947FB69D61F6B0B26B6ABF00000000000000000000000000000000000000000000000000000000000000045304A1445838E95657EA0C66AC8493F6091E33066A9B9D1AE8B9EFB17F4C8E103575BC5F4DE158099963BC70E752940968276B25E65DD3C3326A269A90589B772ECFEC9D05F67DF6D5EBEDD92DF49DE78722157253AA784E2B9ED302753904EE78F0DB38192081F53C759A14BFDD7F9B1874EF62A2FB319D7F5FF415A8662B060D9A06C443920CDB53A40A89733B6A79073FF14ED4F233F8ECF26EC26D1C16E74E1A28BB1F32A403E54BEBE514EEF5863BDD32186DECFE03E136258C5B024B0901036907FF8201C7842C68B39683095BB49423B87748B615096D1A0F48870DAEE203A720723D804641257D95F3A8D302576A84CE1CCFC7648EDE8638907C94991820FF421BADCE203AB4647C9F7E39EDAA6642E9DBC9FC937B3011D9BE95B1F392747AB55C6EB18D91D30100038201A807FF8180843782E07C830DB3049432C85E56A82D66FA3C13E7DF900682D63FCBAF8980138F57190000000000000000000000000000000000000000000000000000000000000020000000000000000000000000BFAABCE766C86D9C5D70D2CB9D10BAB6729197E5000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC800000000000000000000000000000000000000000000000000000000004C4B40000000000000000000000000000000000000000000000000000001812B7C7C9000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000000000000419491B72D5ADD3D85AAF53B4FBCADFC1793561B44B1149619FA346E9B085A5468609B595504986CB8A8C3E773F7296D15CA8CF8511BDC6BE00CEC2084489D2B971B000000000000000000000000000000000000000000000000000000000000007954308DEE6307538AD084AF8CE9FDAF4A053E95D5C88FBDF0673561CBE42FC260D53F982A243A01AEF39AE328E99709DE71082468AC0DA0AE8462809C277615000381A707FF098462AFC7F883096F5F94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A4161400000000000000000000000000000000000000000000000001000B487CF66000C087B7B6463BF891800EC1111A84DDB266D1DFFB5C576B778B4612DAFAAD5D355AB435988107030D6CFCBE4171B4C6307105F482CF90DEF0735B144C5E57825601036407FF0D842C68B396830761FC9418153E3A3BD43A96625E908DD743EFD67B1D48B0020FD3D4CF4DBB187F79EAB4ECCB59272DBB5386EBDF03615DD98002035E2323AD155D13014F3CC4EC06A356D71586818C428F3C8F634BCADBA715E8D05F19AAE58201036C07FF0B842C68B39683077BAE9480C67432656D59144CEFF962E8FAF8926599BCF888059B25A9262D832B00052F50579BBA8924C185978AF340CB55B46CA55C4EC44CBD7A1E57069008BF711625DF51FCBD5CBA92DCB8ABA28160A5141887CAAE5855B603BF90A95620AE2701036907FF8207B3842C68B396837A12009488A0B00BBE918EE00E3482F71962070DC052984B80FDB5A03E15D81D32F64F9773F2C3124442E052CCED639C3B6CB54E41E6EC7D0B8F1D04BC2CC9A15A6F3424C1537A71767A6E9ED65BA73C76AC604190F38F4B7CA4443C75000381A807FF82703785174876E800832DC6C0943648F6E38E8641BF847B3A776DAF6A21AE9A42DD80000000000000000000000000000000000000000000000000002F7ED6069CBA2A0000010000044F011E00000A00000100048284001E01000A0000010001ADC5011E017F08B92A415A11A480D9FFCB5B9CC8BF0174146FDAD0BD003DABFDA2DBBA0A3310136EE880AB95CEB59931D384015EDCCB6C9AF811D790C22B47B789753FE0831B038201A907FF8236DC842C68B396832DC6C0941B02DA8CB0D097EB8D57A175B88C7D8B479975068038ED1739000000000000000000000000000000000000000000000000002FEFCAF499A63A000000000000000000000000000000000000000000000000002FEFCAF499A63A00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000DEDDEC1B0F028F6831765E9212A68F5990BA09E600000000000000000000000000000000000000000000000000000000629A7E5C000000000000000000000000000000000000000000000000000000000000000400000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000D4D42F0B6DEF4CE0383636770EF773390D85C61A000000000000000000000000539BDE0D7DBD336B79148AA742883198BBF6034200000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1BDB98DC04EE3D1295416FC08C022085928C1AE6E5E7025823DA71D6C6D25EDE5558EC4EB14D9C84A7D49AAD70CF8641E9585CD739FCA4989D2CA207BE97338EC010382034807FF1E8429B92700831FCF5194362FA9D0BCA5D19F743DB50738345CE2B40EC99F1010327A564D00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180C571F5B2ABFCD092C6F468FE7E70807E4564D4966EFC193B4DF14E49DBF179E10000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BC55C9FB0374688B358993F8691F8818EB08EA93000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000002386F26FC100000000000000000000000000000000000000000000000000000000000000000000E7472616E73666572746F2E78797A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000BC55C9FB0374688B358993F8691F8818EB08EA93000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000002386F26FC10000000000000000000000000000000000000000000000000000000024FE2BD99DD4C00000000000000000000000000000000000000000000000002254E5EC46382AC00000000000000000000000000000000000000000000000000000000629BCF9C00000000000000000000000000000000000000000000000002254E5EC46382AC00000000000000000000000000000000000000000000000000000000629BCF9C00000000000000000000000000000000000000000000000000000000000000034554480000000000000000000000000000000000000000000000000000000000696BE4C97E9120A2958B273B606B41B67A7A52ADE9C2FB4BB064DD579951A37208D4A2143F0B0689AA110FBC6383415375073E24B25EDFC69D0EDBE9E082CD0801038202E707FF0C8423C34600831373AE9432C85E56A82D66FA3C13E7DF900682D63FCBAF89801E9A2E9200000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BFAABCE766C86D9C5D70D2CB9D10BAB6729197E50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B7310833027E677CC8A1A164437FCF1C0E42DEC0000000000000000000000000B7310833027E677CC8A1A164437FCF1C0E42DEC0000000000000000000000000FF970A61A04B1CA14834A43F5DE4533EBDDB5CC8000000000000000000000000FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB900000000000000000000000000000000000000000000000000000000068E778000000000000000000000000000000000000000000000000000000000068E778000000000000000000000000000000000000000000000000000000000068FA524000000000000000000000000000000000000000000000000000000000000044C00000000000000000000000000000000000000000000000000000000629A7E2D000000000000000000000000000000000000000000000000000001812B7C6BC30067616E64616C6674686562726F776E67786D786E690011CD1583C3DBB9000000000000000000000000000000000000000000000000000000000000000001E000000000000000000000000000000000000000000000000000000000000000419DF416EC186C4EF77B94B965E5479BF9C02D74A6BB308F267235F0090A99FCB04C1DA390FA942BBD09CA6C3081772213D4DDF70EEF10093ABD99C2C569BDA4EB1B00000000000000000000000000000000000000000000000000000000000000E56195E15B8C3844D31F49F23EECCD445BC18C439459755E6CBC4614BCC242EE0EC4C9F8608465B835FB9CC65478BC90AAAA17289A3900047E1992F9495261DC00038202E907FF820A3B842C68B3968310A7E694737EAF14061FE68F04FF4CA8205ACF538555FCC8809EFBFD710000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000005BF20000000000000000000000000000000000000000000000000000000000005BF30000000000000000000000000000000000000000000000000000000000006A5C0000000000000000000000000000000000000000000000000000000000007150000000000000000000000000000000000000000000000000000000000000762B00000000000000000000000000000000000000000000000000000000000007A700000000000000000000000000000000000000000000000000000000000082BC00000000000000000000000000000000000000000000000000000000000083160000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004D4A779E4B16BA52404C8C4C7F14F117BD7E6DC8790F417E0808061D1BADCE452551BE33ADAE9FD4017419B9EA2D645F9CB98B88FBA197CB6D372F8AE8665149010382010907FF82014E842C68B3968312B32194B5FE3BC2EF4C34CC233922DFF2FCB1B1BF89A38E80677956F10000000000000000000000000000000000000000000000000000000062A2FA00000000000000000000000000000000000000000000006D60000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000009B40387A20EF7644A23AFDC9B4306755FD609B6BE1BEDCFAFF94C981E72A32BC0711244227B0289AD00388D5F52B482E957D05FB19CE3966751C2496BD8843CA2CA38000382028807FF0A842C68B396830E11E59453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000005ADC9BFE9A73BB40BE3551F31A32580A138DBBD4000000000000000000000000000000000000000000000000000000000001197E00000000000000000000000000000000000000000000000000000000000113DC000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000145ADC9BFE9A73BB40BE3551F31A32580A138DBBD400000000000000000000000000000000000000000000000000000000000000000000000000000000000000145ADC9BFE9A73BB40BE3551F31A32580A138DBBD40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028678F5C87A75F898A3225393CF8457411B6760C837C7D23DEADF1B8BA4E1D97B5C550A874F970ED00CAE5844FDB618FC890920AC74557445F86F6C2708ED20010381A707FF10842C68B3968309301B94642FFAB2752DF3BCE97083709F36080FB1482C8080A22CB4650000000000000000000000007BC8B1B5ABA4DF3BE9F9A32DAE501214DC0E4F3F0000000000000000000000000000000000000000000000000000000000000001948549DDF0AB8EF43122E867D7413C3E790F2F43AC05D0D0D8B28D5FE795891A12357F9ABC192098F476AE065F473E107903F3E4241069D01A1AC40A87CE73130103818807FF818E842C68B3968308B022941922C36F3BC762CA300B4A46BB2102F84B1684AB80B6B55F2500000000000000000000000000000000000000000000000000000002001E5B343FF7304DBD2152DAAC586AF12D6847FAF444F424B7670D0F0A1FFAFD0565B0F7602129A60D6C148A0F3C424DA361DCE2EFA918384BCF851FC0C48E1F0E6F403F000381A907FF8201C8842C68B3968307F52E945593473E318F0314EB2518239C474E183C4CBED580E2BBB158000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005A07B6F1FA1497833B2C8BAE350128327FDCAA4BE4E6D2F4AA1ECEFBD609287262C8FF274D6D2C941DECAB1EA3582C6993A863297E3BCE03264E52F6D2C71C31010382010707FF12842C68B396830A49149409986B4E255B3C548041A30A2EE312FE176731C280764D63C70000000000000000000000000AF85A5624D24E2C6E7AF3C0A0B102A28E36CEA30000000000000000000000000000000000000000000000000000000000004DF9000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000AD78EBC5AC6200000000000000000000000000000000000000000000000000000000000006313C7731C06636E220F2EC310DD3B272ED5F5E5FF69F7E75FC10BC2EF5872444E98C315789AD0DC2A0273DCA20EF69F31836BC7EC39609A9245AF101F8FE43FF592A0BF010381A707FF098462AFC7F88309755E94FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000053BF833A5D6C4DDA888F69C22C88C9F356A416140000000000000000000000000000000000000000000000000110EB620BA54000EF330B36DCD17EFDD5A55FCC41A91AEDE882A132518BFC7FF0B68C989FB75C697815268C3E8AB5C70DB13A854D893588792B1F5C440CC4EB9FFE033C348ACFF8010382014707FF39842C68B396830FAD9894A906F338CB21815CBC4BC87ACE9E68C87EF8D8F18030B700020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001F3FEEE9B7829FECD3E9E3406E75C91967404139F0D0A37DAB0DBD7EA780990DF6027FB26E5E956FC04E6917289E37E1B81428E44B3AEB88BB813C7542373672F000382040A07FF82FE6085E8D4A51000836ACFC094C38D4423EFAD7D673B0CD47656ED33F8C15C6A5780C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C0000000000000000000000080C927515B8926160D06C37F8EA824670000459B0301020908030004050607000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A00000000000000000000000000000000000000000000000128CF1C9861C355C800000000000000000000000000000000000000000000000128CF1C9861C355C800000000000000000000000000000000000000000000000128CF1C9861C355C800000000000000000000000000000000000000000000000128D731F425044C4000000000000000000000000000000000000000000000000128E8D36127928740000000000000000000000000000000000000000000000001290C002A0D7C4800000000000000000000000000000000000000000000000001290C002A0D7C4800000000000000000000000000000000000000000000000001290C002A0D7C4800000000000000000000000000000000000000000000000001290C002A0D7C4800000000000000000000000000000000000000000000000001294F50BF79C9A2E0000000000000000000000000000000000000000000000000000000000000000402EAE0779820A00889F31C18A9619EC09B1FC6C3E8C25CAD43F9B542E19CA749B6765CB71B7484F1D1A7CE0BE7C4378F3BDF426051904957E45FA56F2DB8BB544DAB1D59E91FBF948FBB8B653A82982D6475D43C17D4E61155B6CA07E12B84AC832B15CE806D34FC7A06856936F726E54A9BB10314E76F2B35E5D1429C15B4EB000000000000000000000000000000000000000000000000000000000000000416CCCC06C1E85AB190BD6C376B598971B4D58DD8649ABDBFF1DAF72FAE9FEF654FD957A0386921931A252E43263C62D9EC5DBD4FCC6AF6A7976896BF4CB68B6202EB41D08321C31E2A60375CEDF0C9BD35096BCBED33C6FEA2FD409A9BA456A72D237FA7322C3426BCA8DB738D070FB3555F25A98BF78EBA7E45332ED5607E1B55F752A7B14EC619EA8BE2B192FFA8F8E1F8A77AC38C641F2D2CD770E37959A47C828A06F29F5607F0712654C7BCA8177BB816AA3074D9301ED8112C3FE1885D00036707FF64842C68B396830CE9199420DF4953BA19C74B2A46B6873803F28BF640C1B5804641257DE2DB60FCD5AA3B97B81D758581430475270F7F6F4508E13E5DC2A9018984EC55095AB7389EA16767F9D8A9FE018006F775515ADF1C49AF3DA11A32920695EB03000382010907FF824AB68432638526830EC34094960EA3E3C7FB317332D990873D354E18D764559080394747C500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000013BE79500000000000000000000000000000000000000000000000000298922D3E558073B00000000000000000000000000000000000000000000000000000000000000017C48F028801687C1F5B4ED70F57BC155AFD8AFEDC1DC89117A0F57DE0A2F5C09195BC154C71A85D575043BB62CC43DC5DFCA2D477E1561D31E88C6DFF3177687000382010707FF6B842C68B396830A43149409986B4E255B3C548041A30A2EE312FE176731C280764D63C70000000000000000000000005E01C1889085B528EEFF5E1BEE64BFE94F45470300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000002A69FB2EAAC9A00000000000000000000000000000000000000000000000000000000000062A3B81B502B507FE9125DF7720B666E9796958C0897B69B0932EEA56AFC66ABE98ABD2C64B7AD3F9091246493848D16EE7055284F0FC30634ACDB02803543F7DD32BD5A010381A907FF82308F842C68B396831E848094FD086BC7CD5C481DCC9C85EBE478A1C0B69FCBB980A9059CBB000000000000000000000000EC2089396011EF9CBEBBAC4EBEA754913616D4D90000000000000000000000000000000000000000000000000000000016C4DB80C9A9750B632A3CF2EC657B3D867578DB0BA797E5412592C6E1431635F69A7EC81A17B3095777EC594E6F6245B25B4B0740539AE3D7832DBE819687F1EA48BFE8000382010907FF820122842C68B396830A52FC9409986B4E255B3C548041A30A2EE312FE176731C280764D63C70000000000000000000000005E01C1889085B528EEFF5E1BEE64BFE94F454703000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000052663CCAB1E1C0000000000000000000000000000000000000000000000000000000000006313C82C790DFFC8D49FD751A2AE9A065AF0A640DB713017487EFF0933C5D438A886B66E7EF6593DAEE5FA43EE63FB91823FB53EFE672194F2C21EB53CEB8AD9A56ED42D010382028807FF0A842C68B396830E11FE9453BF833A5D6C4DDA888F69C22C88C9F356A41614010C9FBF10FC000000000000000000000000000000000000000000000000000000000000000B00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000940DAFCA7BBA0E3FFC0668EC5A7141913C0B1B930000000000000000000000000000000000000000000000000000000000012C130000000000000000000000000000000000000000000000000000000000012612000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001C000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000014940DAFCA7BBA0E3FFC0668EC5A7141913C0B1B930000000000000000000000000000000000000000000000000000000000000000000000000000000000000014940DAFCA7BBA0E3FFC0668EC5A7141913C0B1B9300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000B3857026520F60B511E5F0D6E451E35DB1E987E1A3B19EB7CC97306396AB2EE7450C347F5F34AA0B514EBD4B3D45211CE3FEDDD9DE26D5CA3C62D72ACD7140B000382010907FF82014F842C68B396830B15D694B5FE3BC2EF4C34CC233922DFF2FCB1B1BF89A38E80677956F10000000000000000000000000000000000000000000000000000000062A2FA00000000000000000000000000000000000000000000006D60000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000009B4033F5CD4E09DBF23AC9106B0EBC322251C3ACB8F3DAB44DEDC6452FDA59EA360977D3E79B4332DA8FB10A59A01C66B81F3742AA9995632ED0BBB048E6B2413C040010381A707FF06842C68B396830BE58294FF970A61A04B1CA14834A43F5DE4533EBDDB5CC880095EA7B300000000000000000000000068B3465833FB72A70ECDF485E0E4C7BD8665FC45FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6BC1586ED310E02F9D70F50E9298DC9A22DEE62AE0875FE918C8A540D6953DFE166FC4F2FA79476C58CECAFAB7A84FACBA274CFC8626CF1837E936C1F284AD5E01038201A907FF820645842C68B396830AE52A94737EAF14061FE68F04FF4CA8205ACF538555FCC88011EE3CF1000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000571900000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005E4577545A196DB9B46DB2DF6C8975B0E81E635FAB93B6F54E5811007E529E21BD526DE4FB885EA809539565A580D8B7F587A9148E65087812510FFDE4E0F210BA0103824AA907FF820770842C68B39683DEBEA794737EAF14061FE68F04FF4CA8205ACF538555FCC880821CAB0B0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000004A0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000C200000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000000FE000000000000000000000000000000000000000000000000000000000000011C000000000000000000000000000000000000000000000000000000000000013A00000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000176000000000000000000000000000000000000000000000000000000000000019400000000000000000000000000000000000000000000000000000000000001B200000000000000000000000000000000000000000000000000000000000001D000000000000000000000000000000000000000000000000000000000000001EE000000000000000000000000000000000000000000000000000000000000020C000000000000000000000000000000000000000000000000000000000000022A00000000000000000000000000000000000000000000000000000000000002480000000000000000000000000000000000000000000000000000000000000266000000000000000000000000000000000000000000000000000000000000028400000000000000000000000000000000000000000000000000000000000002A200000000000000000000000000000000000000000000000000000000000002C000000000000000000000000000000000000000000000000000000000000002DE00000000000000000000000000000000000000000000000000000000000002FC000000000000000000000000000000000000000000000000000000000000031A000000000000000000000000000000000000000000000000000000000000033800000000000000000000000000000000000000000000000000000000000003560000000000000000000000000000000000000000000000000000000000000374000000000000000000000000000000000000000000000000000000000000039200000000000000000000000000000000000000000000000000000000000003B000000000000000000000000000000000000000000000000000000000000003CE00000000000000000000000000000000000000000000000000000000000003EC000000000000000000000000000000000000000000000000000000000000040A0000000000000000000000000000000000000000000000000000000000000428000000000000000000000000000000000000000000000000000000000000044600000000000000000000000000000000000000000000000000000000000004640000000000000000000000000000000000000000000000000000000000000482000000000000000000000000000000000000000000000000000000000000001D600000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000141000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000002E000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000265900000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000141000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000002F00000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000029E500000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000141000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000002F0000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002B4C00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002B4D00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002B6500000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002B6600000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002B7D00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002BB000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000490000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000004D000000000000000000000000000000000000000000000000000000000000005B000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000040D600000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000413A00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000141000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000044F000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000581600000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004C00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000581900000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000142000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004C000000000000000000000000000000000000000000000000000000000000004D00000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000582000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000142000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004F000000000000000000000000000000000000000000000000000000000000005D0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000058BE00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000142000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005C000000000000000000000000000000000000000000000000000000000000005E0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000058C400000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000142000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004D000000000000000000000000000000000000000000000000000000000000005E000000000000000000000000000000000000000000000000000000000000008D0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000591A00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004F000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BCD00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000142000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005C000000000000000000000000000000000000000000000000000000000000005E00000000000000000000000000000000000000000000000000000000000000A100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BD000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000A200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BD100000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000A200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BD200000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000A200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BD400000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005C000000000000000000000000000000000000000000000000000000000000005E000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BD500000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BD600000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BD700000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BDA00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BDC00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BDE00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BDF00000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BE000000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000A400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BE100000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000008500000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BE300000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BE400000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000014300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000006BE500000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000143000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000074B900000000000000000000000000000000000000000000000000000000000000A0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000E000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001D9FFFFAA4767E826E8776F50DB1CA14C9B78F0439BABAC21E612E9147034A10337711CD34988C989A87047D33693FEAAD31B40629AA896FA06CD1EE699A6E366000382040A07FF82EB7685E8D4A51000836ACFC094EFC5061B7A8AEF31F789F1BA5B3B8256674F2B7180C9807539000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000300010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001C00000000000000000000000E193445CE0BAE19053668642A3CB19770000E1050200080705090401030206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000A000000000000000000000000000000000000000000000000000000001E838888000000000000000000000000000000000000000000000000000000001E8606A0000000000000000000000000000000000000000000000000000000001E878D40000000000000000000000000000000000000000000000000000000001E8C88F0000000000000000000000000000000000000000000000000000000001E8E128A000000000000000000000000000000000000000000000000000000001E933F5A000000000000000000000000000000000000000000000000000000001E933F5A000000000000000000000000000000000000000000000000000000001E933F5A000000000000000000000000000000000000000000000000000000001E93417D000000000000000000000000000000000000000000000000000000001E93C24000000000000000000000000000000000000000000000000000000000000000042798B011213095F3DAEC422C22F6D603C23F67BDD6B07E78EC772F149CEA36828D953886F567919FB05C1F3B867D5DA4ED100C038D181521D93E2A489D465931BBD1C184BBD6F3A899F5C6CD68D1E9B80784778EB2932027CE924DBC7E54A6196EB3961D3BF02B4D7E3DCB62FA0CBD3089250C4076CB2508987DDFD4A4036C730000000000000000000000000000000000000000000000000000000000000004277915D846AC7D58049D626B6BAFC4165648CD0A56CB086E5B350F6B451D4AC67297C40F27D729AAF2B2536135A5AB92FC86E09C6445347B4F462E33363DF76C7705BFF9576196E2AEBAC1D3ACBCC416ECC0D65BD7CE161A2954C5542DDA2EF25EDD395660E1665F790A70D47C064FF80581F4BA16D852F5456CD2365C76423F4C6EABAD89955977B4A4B6A86E31D419221DED78CB4AE7FD313F9FBABA4EC4F55AFA3F4C303C77107515864109261F9511A8E5A7E5FD6051D8B1C0D928299913000381EA07FF82030785174876E800831AB3F094960EA3E3C7FB317332D990873D354E18D7645590805B41B908000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E4E1C00000000000000000000000000000000000000000000000000000000108A57AD6262E6367BF5B11A4398452205C86B5EB80203FE5CF8000B5F83864F1AC5C929D1E23F6586C3435F8E4CA4EDF3A005F848F02EB909A6279E26834ED0F9558257F01038202AA07FF821FFD85E8D4A51000836ACFC094C4B2C51F969E0713E799DE73B7F130FB7BB604CF80B2228CB20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001A00000000000000000000000000000000000000000000000000000000000000004000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA1000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA1000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA1000000000000000000000000DA10009CBD5D07DD0CECC66161FC93D7C9000DA100000000000000000000000000000000000000000000000000000000000000040000000000000000000000002F2A2543B76A4166549F7AAB2E75BEF0AEFC5B0F00000000000000000000000082AF49447D8A07E3BD95BD0D56F35241523FBAB1000000000000000000000000F97F4DF75117A78C1A5A0DBB814AF92458539FB400000000000000000000000082E3A8F066A6989666B031D916C43672085B15820000000000000000000000000000000000000000000000000000000000000004000911A6E45250001D09AAD4F000030BA1DB998000308CF0273FFFE5681FA2CD000B273B26998000118C6FF8C20001D62753067FFF6F3770C6D7FFCC5EB24F23000DCC6054E8C0000BED4930460001F846007D800272BF02FCF0000733DA9A39000EA20855B8A0001E382B9DDA00033B364C5E400138F8599D97FFFF9956086F7F8E02215C0A180E1810C3B576229DEB77F266AA98DA874B81E6CF8F046FD6BA701AE5E0B6F555FC1CCF3EEEF9EB815428CFE13621F495F62659A2E322D7B1C100, lengths=[3151, 0, 203, 0, 395, 0, 234, 0, 107, 0, 652, 0, 1389, 0, 749, 0, 1932, 0, 304, 0, 461, 0, 461, 0, 1453, 0, 170, 0, 267, 0, 652, 0, 493, 0, 627, 0, 172, 0, 202, 0, 170, 0, 202, 0, 174, 0, 749, 0, 172, 0, 269, 0, 138, 0, 332, 0, 652, 0, 1899, 0, 651, 0, 2704, 0, 589, 0, 1038, 0, 397, 0, 430, 0, 170, 0, 234, 0, 202, 0, 237, 0, 170, 0, 652, 0, 107, 0, 1899, 0, 170, 0, 234, 0, 587, 0, 138, 0, 170, 0, 105, 0, 301, 0, 171, 0, 139, 0, 723, 0, 235, 0, 652, 0, 301, 0, 139, 0, 397, 0, 236, 0, 140, 0, 105, 0, 140, 0, 170, 0, 138, 0, 202, 0, 112, 0, 138, 0, 652, 0, 299, 0, 170, 0, 2509, 0, 395, 0, 170, 0, 170, 0, 140, 0, 138, 0, 170, 0, 104, 0, 202, 0, 652, 0, 269, 0, 235, 0, 170, 0, 493, 0, 170, 0, 493, 0, 170, 0, 589, 0, 107, 0, 170, 306, 395, 0, 652, 0, 1932, 0, 395, 0, 656, 0, 105, 0, 106, 0, 300, 0, 596, 0, 267, 0, 170, 0, 684, 0, 139, 0, 364, 0, 683, 0, 170, 0, 429, 0, 619, 0, 652, 0, 267, 0, 300, 0, 170, 0, 331, 0, 107, 0, 170, 0, 138, 0, 747, 0, 652, 0, 173, 0, 170, 0, 267, 0, 170, 0, 269, 0, 331, 0, 170, 0, 365, 0, 170, 0, 170, 0, 139, 0, 170, 0, 301, 0, 652, 0, 1038, 0, 107, 0, 428, 0, 170, 0, 102, 0, 110, 0, 107, 0, 171, 0, 429, 0, 844, 0, 747, 0, 749, 0, 269, 0, 652, 0, 170, 0, 139, 0, 172, 0, 267, 0, 170, 0, 331, 0, 1038, 0, 105, 0, 269, 0, 267, 0, 172, 0, 269, 0, 652, 0, 269, 0, 170, 0, 429, 0, 19117, 0, 1038, 0, 237, 0, 686, 0], sectionsMetadata=[64, 14899438, 1654291796, 503195, 0, 26, 14899442, 1654291863, 503195, 0, 94, 14899446, 1654291874, 503195, 0, 56, 14899450, 1654291910, 503195, 0, 94, 14899454, 1654291974, 503195, 0], afterAcc=0C65E28A2817A9D986911A7F07B7317A7AF5F04DBDA8A2EA023FF5FA78990170, gasRefunder=0x284c1875694058b213866F5F2aD015b5a4B9438b )
    • GasRefunder.onGasSpent( refundee=0xa4b10ac61E79Ea1e150DF70B8dda53391928fD14, gasUsed=268849, calldataSize=102468 ) => ( success=True )
      • ETH 0.112068188368996928 Arbitrum: Sequencer.CALL( )
        addSequencerL2BatchFromOriginWithGasRefunder[SequencerInbox (ln:160)]
        File 1 of 3: TransparentUpgradeableProxy
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        /**
         * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
         * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
         * be specified by overriding the virtual {_implementation} function.
         *
         * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
         * different contract through the {_delegate} function.
         *
         * The success and return data of the delegated call will be returned back to the caller of the proxy.
         */
        abstract contract Proxy {
            /**
             * @dev Delegates the current call to `implementation`.
             *
             * This function does not return to its internall call site, it will return directly to the external caller.
             */
            function _delegate(address implementation) internal virtual {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    // Copy msg.data. We take full control of memory in this inline assembly
                    // block because it will not return to Solidity code. We overwrite the
                    // Solidity scratch pad at memory position 0.
                    calldatacopy(0, 0, calldatasize())
                    // Call the implementation.
                    // out and outsize are 0 because we don't know the size yet.
                    let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                    // Copy the returned data.
                    returndatacopy(0, 0, returndatasize())
                    switch result
                    // delegatecall returns 0 on error.
                    case 0 { revert(0, returndatasize()) }
                    default { return(0, returndatasize()) }
                }
            }
            /**
             * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
             * and {_fallback} should delegate.
             */
            function _implementation() internal view virtual returns (address);
            /**
             * @dev Delegates the current call to the address returned by `_implementation()`.
             *
             * This function does not return to its internall call site, it will return directly to the external caller.
             */
            function _fallback() internal virtual {
                _beforeFallback();
                _delegate(_implementation());
            }
            /**
             * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
             * function in the contract matches the call data.
             */
            fallback () external payable virtual {
                _fallback();
            }
            /**
             * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
             * is empty.
             */
            receive () external payable virtual {
                _fallback();
            }
            /**
             * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
             * call, or as part of the Solidity `fallback` or `receive` functions.
             *
             * If overriden should call `super._beforeFallback()`.
             */
            function _beforeFallback() internal virtual {
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        import "./UpgradeableProxy.sol";
        /**
         * @dev This contract implements a proxy that is upgradeable by an admin.
         *
         * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
         * clashing], which can potentially be used in an attack, this contract uses the
         * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
         * things that go hand in hand:
         *
         * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
         * that call matches one of the admin functions exposed by the proxy itself.
         * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
         * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
         * "admin cannot fallback to proxy target".
         *
         * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
         * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
         * to sudden errors when trying to call a function from the proxy implementation.
         *
         * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
         * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
         */
        contract TransparentUpgradeableProxy is UpgradeableProxy {
            /**
             * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
             * optionally initialized with `_data` as explained in {UpgradeableProxy-constructor}.
             */
            constructor(address _logic, address admin_, bytes memory _data) public payable UpgradeableProxy(_logic, _data) {
                assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                _setAdmin(admin_);
            }
            /**
             * @dev Emitted when the admin account has changed.
             */
            event AdminChanged(address previousAdmin, address newAdmin);
            /**
             * @dev Storage slot with the admin of the contract.
             * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
             * validated in the constructor.
             */
            bytes32 private constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
            /**
             * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
             */
            modifier ifAdmin() {
                if (msg.sender == _admin()) {
                    _;
                } else {
                    _fallback();
                }
            }
            /**
             * @dev Returns the current admin.
             *
             * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.
             *
             * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
             * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
             * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`
             */
            function admin() external ifAdmin returns (address admin_) {
                admin_ = _admin();
            }
            /**
             * @dev Returns the current implementation.
             *
             * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.
             *
             * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the
             * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.
             * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
             */
            function implementation() external ifAdmin returns (address implementation_) {
                implementation_ = _implementation();
            }
            /**
             * @dev Changes the admin of the proxy.
             *
             * Emits an {AdminChanged} event.
             *
             * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.
             */
            function changeAdmin(address newAdmin) external virtual ifAdmin {
                require(newAdmin != address(0), "TransparentUpgradeableProxy: new admin is the zero address");
                emit AdminChanged(_admin(), newAdmin);
                _setAdmin(newAdmin);
            }
            /**
             * @dev Upgrade the implementation of the proxy.
             *
             * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
             */
            function upgradeTo(address newImplementation) external virtual ifAdmin {
                _upgradeTo(newImplementation);
            }
            /**
             * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
             * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
             * proxied contract.
             *
             * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.
             */
            function upgradeToAndCall(address newImplementation, bytes calldata data) external payable virtual ifAdmin {
                _upgradeTo(newImplementation);
                Address.functionDelegateCall(newImplementation, data);
            }
            /**
             * @dev Returns the current admin.
             */
            function _admin() internal view virtual returns (address adm) {
                bytes32 slot = _ADMIN_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    adm := sload(slot)
                }
            }
            /**
             * @dev Stores a new address in the EIP1967 admin slot.
             */
            function _setAdmin(address newAdmin) private {
                bytes32 slot = _ADMIN_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    sstore(slot, newAdmin)
                }
            }
            /**
             * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
             */
            function _beforeFallback() internal virtual override {
                require(msg.sender != _admin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                super._beforeFallback();
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        import "./Proxy.sol";
        import "../utils/Address.sol";
        /**
         * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
         * implementation address that can be changed. This address is stored in storage in the location specified by
         * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
         * implementation behind the proxy.
         *
         * Upgradeability is only provided internally through {_upgradeTo}. For an externally upgradeable proxy see
         * {TransparentUpgradeableProxy}.
         */
        contract UpgradeableProxy is Proxy {
            /**
             * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
             *
             * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
             * function call, and allows initializating the storage of the proxy like a Solidity constructor.
             */
            constructor(address _logic, bytes memory _data) public payable {
                assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                _setImplementation(_logic);
                if(_data.length > 0) {
                    Address.functionDelegateCall(_logic, _data);
                }
            }
            /**
             * @dev Emitted when the implementation is upgraded.
             */
            event Upgraded(address indexed implementation);
            /**
             * @dev Storage slot with the address of the current implementation.
             * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
             * validated in the constructor.
             */
            bytes32 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
            /**
             * @dev Returns the current implementation address.
             */
            function _implementation() internal view virtual override returns (address impl) {
                bytes32 slot = _IMPLEMENTATION_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    impl := sload(slot)
                }
            }
            /**
             * @dev Upgrades the proxy to a new implementation.
             *
             * Emits an {Upgraded} event.
             */
            function _upgradeTo(address newImplementation) internal virtual {
                _setImplementation(newImplementation);
                emit Upgraded(newImplementation);
            }
            /**
             * @dev Stores a new address in the EIP1967 implementation slot.
             */
            function _setImplementation(address newImplementation) private {
                require(Address.isContract(newImplementation), "UpgradeableProxy: new implementation is not a contract");
                bytes32 slot = _IMPLEMENTATION_SLOT;
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    sstore(slot, newImplementation)
                }
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.2 <0.8.0;
        /**
         * @dev Collection of functions related to the address type
         */
        library Address {
            /**
             * @dev Returns true if `account` is a contract.
             *
             * [IMPORTANT]
             * ====
             * It is unsafe to assume that an address for which this function returns
             * false is an externally-owned account (EOA) and not a contract.
             *
             * Among others, `isContract` will return false for the following
             * types of addresses:
             *
             *  - an externally-owned account
             *  - a contract in construction
             *  - an address where a contract will be created
             *  - an address where a contract lived, but was destroyed
             * ====
             */
            function isContract(address account) internal view returns (bool) {
                // This method relies on extcodesize, which returns 0 for contracts in
                // construction, since the code is only stored at the end of the
                // constructor execution.
                uint256 size;
                // solhint-disable-next-line no-inline-assembly
                assembly { size := extcodesize(account) }
                return size > 0;
            }
            /**
             * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
             * `recipient`, forwarding all available gas and reverting on errors.
             *
             * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
             * of certain opcodes, possibly making contracts go over the 2300 gas limit
             * imposed by `transfer`, making them unable to receive funds via
             * `transfer`. {sendValue} removes this limitation.
             *
             * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
             *
             * IMPORTANT: because control is transferred to `recipient`, care must be
             * taken to not create reentrancy vulnerabilities. Consider using
             * {ReentrancyGuard} or the
             * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
             */
            function sendValue(address payable recipient, uint256 amount) internal {
                require(address(this).balance >= amount, "Address: insufficient balance");
                // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
                (bool success, ) = recipient.call{ value: amount }("");
                require(success, "Address: unable to send value, recipient may have reverted");
            }
            /**
             * @dev Performs a Solidity function call using a low level `call`. A
             * plain`call` is an unsafe replacement for a function call: use this
             * function instead.
             *
             * If `target` reverts with a revert reason, it is bubbled up by this
             * function (like regular Solidity function calls).
             *
             * Returns the raw returned data. To convert to the expected return value,
             * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
             *
             * Requirements:
             *
             * - `target` must be a contract.
             * - calling `target` with `data` must not revert.
             *
             * _Available since v3.1._
             */
            function functionCall(address target, bytes memory data) internal returns (bytes memory) {
              return functionCall(target, data, "Address: low-level call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
             * `errorMessage` as a fallback revert reason when `target` reverts.
             *
             * _Available since v3.1._
             */
            function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
                return functionCallWithValue(target, data, 0, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but also transferring `value` wei to `target`.
             *
             * Requirements:
             *
             * - the calling contract must have an ETH balance of at least `value`.
             * - the called Solidity function must be `payable`.
             *
             * _Available since v3.1._
             */
            function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
                return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
            }
            /**
             * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
             * with `errorMessage` as a fallback revert reason when `target` reverts.
             *
             * _Available since v3.1._
             */
            function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
                require(address(this).balance >= value, "Address: insufficient balance for call");
                require(isContract(target), "Address: call to non-contract");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.call{ value: value }(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but performing a static call.
             *
             * _Available since v3.3._
             */
            function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                return functionStaticCall(target, data, "Address: low-level static call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
             * but performing a static call.
             *
             * _Available since v3.3._
             */
            function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
                require(isContract(target), "Address: static call to non-contract");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.staticcall(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but performing a delegate call.
             *
             * _Available since v3.4._
             */
            function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                return functionDelegateCall(target, data, "Address: low-level delegate call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
             * but performing a delegate call.
             *
             * _Available since v3.4._
             */
            function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
                require(isContract(target), "Address: delegate call to non-contract");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.delegatecall(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
                if (success) {
                    return returndata;
                } else {
                    // Look for revert reason and bubble it up if present
                    if (returndata.length > 0) {
                        // The easiest way to bubble the revert reason is using memory via assembly
                        // solhint-disable-next-line no-inline-assembly
                        assembly {
                            let returndata_size := mload(returndata)
                            revert(add(32, returndata), returndata_size)
                        }
                    } else {
                        revert(errorMessage);
                    }
                }
            }
        }
        

        File 2 of 3: GasRefunder
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.8.7;
        import "./IGasRefunder.sol";
        import "@openzeppelin/contracts-0.8/access/Ownable.sol";
        contract GasRefunder is IGasRefunder, Ownable {
            mapping(address => bool) public allowedContracts;
            mapping(address => bool) public allowedRefundees;
            mapping(address => uint256) public lastContractRefund;
            address public disallower;
            struct CommonParameters {
                uint128 maxRefundeeBalance;
                uint32 extraGasMargin;
                uint8 calldataCost;
                uint64 maxGasTip;
                uint64 maxGasCost;
                uint32 maxSingleGasUsage;
            }
            CommonParameters public commonParams;
            enum CommonParameterKey {
                MAX_REFUNDEE_BALANCE,
                EXTRA_GAS_MARGIN,
                CALLDATA_COST,
                MAX_GAS_TIP,
                MAX_GAS_COST,
                MAX_SINGLE_GAS_USAGE
            }
            enum RefundDenyReason {
                CONTRACT_NOT_ALLOWED,
                REFUNDEE_NOT_ALLOWED,
                ALREADY_REFUNDED_THIS_BLOCK,
                REFUNDEE_ABOVE_MAX_BALANCE,
                OUT_OF_FUNDS
            }
            event RefundedGasCosts(
                address indexed refundee,
                address indexed contractAddress,
                bool indexed success,
                uint256 gas,
                uint256 gasPrice,
                uint256 amountPaid
            );
            event RefundGasCostsDenied(
                address indexed refundee,
                address indexed contractAddress,
                RefundDenyReason indexed reason,
                uint256 gas
            );
            event Deposited(address sender, uint256 amount);
            event Withdrawn(address initiator, address destination, uint256 amount);
            event ContractAllowedSet(address indexed addr, bool indexed allowed);
            event RefundeeAllowedSet(address indexed addr, bool indexed allowed);
            event DisallowerSet(address indexed addr);
            event CommonParameterSet(CommonParameterKey indexed parameter, uint256 value);
            constructor() Ownable() {
                commonParams = CommonParameters({
                    maxRefundeeBalance: 0, // no limit
                    extraGasMargin: 4000, // 4k gas
                    calldataCost: 12, // Between 4 for zero bytes and 16 for non-zero bytes
                    maxGasTip: 2 gwei,
                    maxGasCost: 120 gwei,
                    maxSingleGasUsage: 2e6 // 2 million gas
                });
            }
            function setDisallower(address addr) external onlyOwner {
                disallower = addr;
                emit DisallowerSet(addr);
            }
            function allowContracts(address[] calldata addresses) external onlyOwner {
                setContractsAllowedImpl(addresses, true);
            }
            function disallowContracts(address[] calldata addresses) external {
                require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                setContractsAllowedImpl(addresses, false);
            }
            function setContractsAllowedImpl(address[] calldata addresses, bool allow) internal {
                for (uint256 i = 0; i < addresses.length; i++) {
                    address addr = addresses[i];
                    allowedContracts[addr] = allow;
                    emit ContractAllowedSet(addr, allow);
                }
            }
            function allowRefundees(address[] calldata addresses) external onlyOwner {
                setRefundeesAllowedImpl(addresses, true);
            }
            function disallowRefundees(address[] calldata addresses) external {
                require(msg.sender == owner() || msg.sender == disallower, "NOT_AUTHORIZED");
                setRefundeesAllowedImpl(addresses, false);
            }
            function setRefundeesAllowedImpl(address[] calldata addresses, bool allow) internal {
                for (uint256 i = 0; i < addresses.length; i++) {
                    address addr = addresses[i];
                    allowedRefundees[addr] = allow;
                    emit RefundeeAllowedSet(addr, allow);
                }
            }
            function setMaxRefundeeBalance(uint128 newValue) external onlyOwner {
                commonParams.maxRefundeeBalance = newValue;
                emit CommonParameterSet(CommonParameterKey.MAX_REFUNDEE_BALANCE, newValue);
            }
            function setExtraGasMargin(uint32 newValue) external onlyOwner {
                commonParams.extraGasMargin = newValue;
                emit CommonParameterSet(CommonParameterKey.EXTRA_GAS_MARGIN, newValue);
            }
            function setCalldataCost(uint8 newValue) external onlyOwner {
                commonParams.calldataCost = newValue;
                emit CommonParameterSet(CommonParameterKey.CALLDATA_COST, newValue);
            }
            function setMaxGasTip(uint64 newValue) external onlyOwner {
                commonParams.maxGasTip = newValue;
                emit CommonParameterSet(CommonParameterKey.MAX_GAS_TIP, newValue);
            }
            function setMaxGasCost(uint64 newValue) external onlyOwner {
                commonParams.maxGasCost = newValue;
                emit CommonParameterSet(CommonParameterKey.MAX_GAS_COST, newValue);
            }
            function setMaxSingleGasUsage(uint32 newValue) external onlyOwner {
                commonParams.maxSingleGasUsage = newValue;
                emit CommonParameterSet(CommonParameterKey.MAX_SINGLE_GAS_USAGE, newValue);
            }
            receive() external payable {
                emit Deposited(msg.sender, msg.value);
            }
            function withdraw(address payable destination, uint256 amount) external onlyOwner {
                // It's expected that destination is an EOA
                (bool success, ) = destination.call{ value: amount }("");
                require(success, "WITHDRAW_FAILED");
                emit Withdrawn(msg.sender, destination, amount);
            }
            function onGasSpent(
                address payable refundee,
                uint256 gasUsed,
                uint256 calldataSize
            ) external override returns (bool success) {
                uint256 startGasLeft = gasleft();
                uint256 ownBalance = address(this).balance;
                if (ownBalance == 0) {
                    emit RefundGasCostsDenied(refundee, msg.sender, RefundDenyReason.OUT_OF_FUNDS, gasUsed);
                    return false;
                }
                if (!allowedContracts[msg.sender]) {
                    emit RefundGasCostsDenied(
                        refundee,
                        msg.sender,
                        RefundDenyReason.CONTRACT_NOT_ALLOWED,
                        gasUsed
                    );
                    return false;
                }
                if (!allowedRefundees[refundee]) {
                    emit RefundGasCostsDenied(
                        refundee,
                        msg.sender,
                        RefundDenyReason.REFUNDEE_NOT_ALLOWED,
                        gasUsed
                    );
                    return false;
                }
                if (lastContractRefund[msg.sender] == block.number) {
                    // There was already a refund this block, don't refund further
                    emit RefundGasCostsDenied(
                        refundee,
                        msg.sender,
                        RefundDenyReason.ALREADY_REFUNDED_THIS_BLOCK,
                        gasUsed
                    );
                    return false;
                }
                lastContractRefund[msg.sender] = block.number;
                uint256 estGasPrice = block.basefee + commonParams.maxGasTip;
                if (tx.gasprice < estGasPrice) {
                    estGasPrice = tx.gasprice;
                }
                if (commonParams.maxGasCost != 0 && estGasPrice > commonParams.maxGasCost) {
                    estGasPrice = commonParams.maxGasCost;
                }
                // Retrieve these variables before measuring gasleft()
                uint256 refundeeBalance = refundee.balance;
                uint256 maxRefundeeBalance = commonParams.maxRefundeeBalance;
                uint256 maxSingleGasUsage = commonParams.maxSingleGasUsage;
                // Add in a bit of a buffer for the tx costs not measured with gasleft
                gasUsed +=
                    startGasLeft +
                    commonParams.extraGasMargin +
                    (calldataSize * commonParams.calldataCost);
                // Split this up into two statements so that gasleft() comes after the storage loads
                gasUsed -= gasleft();
                if (maxSingleGasUsage != 0 && gasUsed > maxSingleGasUsage) {
                    gasUsed = maxSingleGasUsage;
                }
                uint256 refundAmount = estGasPrice * gasUsed;
                if (maxRefundeeBalance != 0 && refundeeBalance + refundAmount > maxRefundeeBalance) {
                    if (refundeeBalance > maxRefundeeBalance) {
                        // The refundee is already above their max balance
                        emit RefundGasCostsDenied(
                            refundee,
                            msg.sender,
                            RefundDenyReason.REFUNDEE_ABOVE_MAX_BALANCE,
                            gasUsed
                        );
                        return false;
                    } else {
                        refundAmount = maxRefundeeBalance - refundeeBalance;
                    }
                }
                if (refundAmount > ownBalance) {
                    refundAmount = ownBalance;
                }
                // It's expected that refundee is an EOA
                (success, ) = refundee.call{ value: refundAmount }("");
                emit RefundedGasCosts(refundee, msg.sender, success, gasUsed, estGasPrice, refundAmount);
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity >=0.6.11 <0.7.0||>=0.8.7 <0.9.0;
        interface IGasRefunder {
            function onGasSpent(
                address payable spender,
                uint256 gasUsed,
                uint256 calldataSize
            ) external returns (bool success);
        }
        // SPDX-License-Identifier: MIT
        pragma solidity ^0.8.0;
        import "../utils/Context.sol";
        /**
         * @dev Contract module which provides a basic access control mechanism, where
         * there is an account (an owner) that can be granted exclusive access to
         * specific functions.
         *
         * By default, the owner account will be the one that deploys the contract. This
         * can later be changed with {transferOwnership}.
         *
         * This module is used through inheritance. It will make available the modifier
         * `onlyOwner`, which can be applied to your functions to restrict their use to
         * the owner.
         */
        abstract contract Ownable is Context {
            address private _owner;
            event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
            /**
             * @dev Initializes the contract setting the deployer as the initial owner.
             */
            constructor() {
                _setOwner(_msgSender());
            }
            /**
             * @dev Returns the address of the current owner.
             */
            function owner() public view virtual returns (address) {
                return _owner;
            }
            /**
             * @dev Throws if called by any account other than the owner.
             */
            modifier onlyOwner() {
                require(owner() == _msgSender(), "Ownable: caller is not the owner");
                _;
            }
            /**
             * @dev Leaves the contract without owner. It will not be possible to call
             * `onlyOwner` functions anymore. Can only be called by the current owner.
             *
             * NOTE: Renouncing ownership will leave the contract without an owner,
             * thereby removing any functionality that is only available to the owner.
             */
            function renounceOwnership() public virtual onlyOwner {
                _setOwner(address(0));
            }
            /**
             * @dev Transfers ownership of the contract to a new account (`newOwner`).
             * Can only be called by the current owner.
             */
            function transferOwnership(address newOwner) public virtual onlyOwner {
                require(newOwner != address(0), "Ownable: new owner is the zero address");
                _setOwner(newOwner);
            }
            function _setOwner(address newOwner) private {
                address oldOwner = _owner;
                _owner = newOwner;
                emit OwnershipTransferred(oldOwner, newOwner);
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity ^0.8.0;
        /**
         * @dev Provides information about the current execution context, including the
         * sender of the transaction and its data. While these are generally available
         * via msg.sender and msg.data, they should not be accessed in such a direct
         * manner, since when dealing with meta-transactions the account sending and
         * paying for execution may not be the actual sender (as far as an application
         * is concerned).
         *
         * This contract is only required for intermediate, library-like contracts.
         */
        abstract contract Context {
            function _msgSender() internal view virtual returns (address) {
                return msg.sender;
            }
            function _msgData() internal view virtual returns (bytes calldata) {
                return msg.data;
            }
        }
        

        File 3 of 3: SequencerInbox
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "./interfaces/ISequencerInbox.sol";
        import "./interfaces/IBridge.sol";
        import "../arch/Marshaling.sol";
        import "../libraries/Cloneable.sol";
        import "../rollup/Rollup.sol";
        import "../validator/IGasRefunder.sol";
        import "./Messages.sol";
        interface OldRollup {
            function sequencerInboxMaxDelayBlocks() external view returns (uint256);
            function sequencerInboxMaxDelaySeconds() external view returns (uint256);
        }
        contract SequencerInbox is ISequencerInbox, Cloneable {
            // Sequencer-Inbox state accumulator
            bytes32[] public override inboxAccs;
            // Number of messages included in the sequencer-inbox; tracked seperately from inboxAccs since multiple messages can be included in a single inboxAcc update (i.e., many messages in a batch, many batches in a single inboxAccs update, etc)
            uint256 public override messageCount;
            // count of messages read from the delayedInbox
            uint256 public totalDelayedMessagesRead;
            IBridge public delayedInbox;
            address private deprecatedSequencer;
            address public rollup;
            mapping(address => bool) public override isSequencer;
            // Window in which only the Sequencer can update the Inbox; this delay is what allows the Sequencer to give receipts with sub-blocktime latency.
            uint256 public override maxDelayBlocks;
            uint256 public override maxDelaySeconds;
            function initialize(
                IBridge _delayedInbox,
                address _sequencer,
                address _rollup
            ) external {
                require(address(delayedInbox) == address(0), "ALREADY_INIT");
                delayedInbox = _delayedInbox;
                isSequencer[_sequencer] = true;
                rollup = _rollup;
                // it is assumed that maxDelayBlocks and maxDelaySeconds are set by the rollup
            }
            function postUpgradeInit() external view {
                // it is assumed the sequencer inbox contract is behind a Proxy controlled by a
                // proxy admin. this function can only be called by the proxy admin contract
                address proxyAdmin = ProxyUtil.getProxyAdmin();
                require(msg.sender == proxyAdmin, "NOT_FROM_ADMIN");
            }
            /// @notice DEPRECATED - use isSequencer instead
            function sequencer() external view override returns (address) {
                return deprecatedSequencer;
            }
            function setIsSequencer(address addr, bool newIsSequencer) external override {
                require(msg.sender == rollup, "ONLY_ROLLUP");
                isSequencer[addr] = newIsSequencer;
                emit IsSequencerUpdated(addr, newIsSequencer);
            }
            function setMaxDelay(uint256 newMaxDelayBlocks, uint256 newMaxDelaySeconds) external override {
                require(msg.sender == rollup, "ONLY_ROLLUP");
                maxDelayBlocks = newMaxDelayBlocks;
                maxDelaySeconds = newMaxDelaySeconds;
                emit MaxDelayUpdated(newMaxDelayBlocks, newMaxDelaySeconds);
            }
            /**
             * @notice Move messages from the delayed inbox into the Sequencer inbox. Callable by any address. Necessary iff Sequencer hasn't included them before delay period expired.
             */
            function forceInclusion(
                uint256 _totalDelayedMessagesRead,
                uint8 kind,
                uint256[2] calldata l1BlockAndTimestamp,
                uint256 inboxSeqNum,
                uint256 gasPriceL1,
                address sender,
                bytes32 messageDataHash,
                bytes32 delayedAcc
            ) external {
                require(_totalDelayedMessagesRead > totalDelayedMessagesRead, "DELAYED_BACKWARDS");
                {
                    bytes32 messageHash = Messages.messageHash(
                        kind,
                        sender,
                        l1BlockAndTimestamp[0],
                        l1BlockAndTimestamp[1],
                        inboxSeqNum,
                        gasPriceL1,
                        messageDataHash
                    );
                    // Can only force-include after the Sequencer-only window has expired.
                    require(l1BlockAndTimestamp[0] + maxDelayBlocks < block.number, "MAX_DELAY_BLOCKS");
                    require(l1BlockAndTimestamp[1] + maxDelaySeconds < block.timestamp, "MAX_DELAY_TIME");
                    // Verify that message hash represents the last message sequence of delayed message to be included
                    bytes32 prevDelayedAcc = 0;
                    if (_totalDelayedMessagesRead > 1) {
                        prevDelayedAcc = delayedInbox.inboxAccs(_totalDelayedMessagesRead - 2);
                    }
                    require(
                        delayedInbox.inboxAccs(_totalDelayedMessagesRead - 1) ==
                            Messages.addMessageToInbox(prevDelayedAcc, messageHash),
                        "DELAYED_ACCUMULATOR"
                    );
                }
                uint256 startNum = messageCount;
                bytes32 beforeAcc = 0;
                if (inboxAccs.length > 0) {
                    beforeAcc = inboxAccs[inboxAccs.length - 1];
                }
                (bytes32 acc, uint256 count) = includeDelayedMessages(
                    beforeAcc,
                    startNum,
                    _totalDelayedMessagesRead,
                    block.number,
                    block.timestamp,
                    delayedAcc
                );
                inboxAccs.push(acc);
                messageCount = count;
                emit DelayedInboxForced(
                    startNum,
                    beforeAcc,
                    count,
                    _totalDelayedMessagesRead,
                    [acc, delayedAcc],
                    inboxAccs.length - 1
                );
            }
            function addSequencerL2BatchFromOrigin(
                bytes calldata transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc
            ) external {
                // solhint-disable-next-line avoid-tx-origin
                require(msg.sender == tx.origin, "origin only");
                uint256 startNum = messageCount;
                bytes32 beforeAcc = addSequencerL2BatchImpl(
                    transactions,
                    lengths,
                    sectionsMetadata,
                    afterAcc
                );
                emit SequencerBatchDeliveredFromOrigin(
                    startNum,
                    beforeAcc,
                    messageCount,
                    afterAcc,
                    inboxAccs.length - 1
                );
            }
            function addSequencerL2BatchFromOriginWithGasRefunder(
                bytes calldata transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc,
                IGasRefunder gasRefunder
            ) external {
                // solhint-disable-next-line avoid-tx-origin
                require(msg.sender == tx.origin, "origin only");
                uint256 startGasLeft = gasleft();
                uint256 calldataSize;
                assembly {
                    calldataSize := calldatasize()
                }
                uint256 startNum = messageCount;
                bytes32 beforeAcc = addSequencerL2BatchImpl(
                    transactions,
                    lengths,
                    sectionsMetadata,
                    afterAcc
                );
                emit SequencerBatchDeliveredFromOrigin(
                    startNum,
                    beforeAcc,
                    messageCount,
                    afterAcc,
                    inboxAccs.length - 1
                );
                if (gasRefunder != IGasRefunder(0)) {
                    gasRefunder.onGasSpent(msg.sender, startGasLeft - gasleft(), calldataSize);
                }
            }
            /**
             * @notice Sequencer adds a batch to inbox.
             * @param transactions concatenated bytes of L2 messages
             * @param lengths length of each txn in transctions (for parsing)
             * @param sectionsMetadata Each consists of [numItems, l1BlockNumber, l1Timestamp, newTotalDelayedMessagesRead, newDelayedAcc]
             * @param afterAcc Expected inbox hash after batch is added
             * @dev sectionsMetadata lets the sequencer delineate new l1Block numbers and l1Timestamps within a given batch; this lets the sequencer minimize the number of batches created (and thus amortizing cost) while still giving timely receipts
             */
            function addSequencerL2Batch(
                bytes calldata transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc
            ) external {
                uint256 startNum = messageCount;
                bytes32 beforeAcc = addSequencerL2BatchImpl(
                    transactions,
                    lengths,
                    sectionsMetadata,
                    afterAcc
                );
                emit SequencerBatchDelivered(
                    startNum,
                    beforeAcc,
                    messageCount,
                    afterAcc,
                    transactions,
                    lengths,
                    sectionsMetadata,
                    inboxAccs.length - 1,
                    msg.sender
                );
            }
            function addSequencerL2BatchImpl(
                bytes memory transactions,
                uint256[] calldata lengths,
                uint256[] calldata sectionsMetadata,
                bytes32 afterAcc
            ) private returns (bytes32 beforeAcc) {
                require(isSequencer[msg.sender], "ONLY_SEQUENCER");
                if (inboxAccs.length > 0) {
                    beforeAcc = inboxAccs[inboxAccs.length - 1];
                }
                uint256 runningCount = messageCount;
                bytes32 runningAcc = beforeAcc;
                uint256 processedItems = 0;
                uint256 dataOffset;
                assembly {
                    dataOffset := add(transactions, 32)
                }
                for (uint256 i = 0; i + 5 <= sectionsMetadata.length; i += 5) {
                    // Each metadata section consists of:
                    // [numItems, l1BlockNumber, l1Timestamp, newTotalDelayedMessagesRead, newDelayedAcc]
                    {
                        uint256 l1BlockNumber = sectionsMetadata[i + 1];
                        require(l1BlockNumber + maxDelayBlocks >= block.number, "BLOCK_TOO_OLD");
                        require(l1BlockNumber <= block.number, "BLOCK_TOO_NEW");
                    }
                    {
                        uint256 l1Timestamp = sectionsMetadata[i + 2];
                        require(l1Timestamp + maxDelaySeconds >= block.timestamp, "TIME_TOO_OLD");
                        require(l1Timestamp <= block.timestamp, "TIME_TOO_NEW");
                    }
                    {
                        bytes32 prefixHash = keccak256(
                            abi.encodePacked(msg.sender, sectionsMetadata[i + 1], sectionsMetadata[i + 2])
                        );
                        uint256 numItems = sectionsMetadata[i];
                        (runningAcc, runningCount, dataOffset) = calcL2Batch(
                            dataOffset,
                            lengths,
                            processedItems,
                            numItems,
                            prefixHash,
                            runningCount,
                            runningAcc
                        );
                        processedItems += numItems;
                    }
                    uint256 newTotalDelayedMessagesRead = sectionsMetadata[i + 3];
                    require(newTotalDelayedMessagesRead >= totalDelayedMessagesRead, "DELAYED_BACKWARDS");
                    require(newTotalDelayedMessagesRead >= 1, "MUST_DELAYED_INIT");
                    require(
                        totalDelayedMessagesRead >= 1 || sectionsMetadata[i] == 0,
                        "MUST_DELAYED_INIT_START"
                    );
                    // Sequencer decides how many messages (if any) to include from the delayed inbox
                    if (newTotalDelayedMessagesRead > totalDelayedMessagesRead) {
                        (runningAcc, runningCount) = includeDelayedMessages(
                            runningAcc,
                            runningCount,
                            newTotalDelayedMessagesRead,
                            sectionsMetadata[i + 1], // block number
                            sectionsMetadata[i + 2], // timestamp
                            bytes32(sectionsMetadata[i + 4]) // delayed accumulator
                        );
                    }
                }
                uint256 startOffset;
                assembly {
                    startOffset := add(transactions, 32)
                }
                require(dataOffset >= startOffset, "OFFSET_OVERFLOW");
                require(dataOffset <= startOffset + transactions.length, "TRANSACTIONS_OVERRUN");
                require(runningCount > messageCount, "EMPTY_BATCH");
                inboxAccs.push(runningAcc);
                messageCount = runningCount;
                require(runningAcc == afterAcc, "AFTER_ACC");
            }
            function calcL2Batch(
                uint256 beforeOffset,
                uint256[] calldata lengths,
                uint256 lengthsOffset,
                uint256 itemCount,
                bytes32 prefixHash,
                uint256 beforeCount,
                bytes32 beforeAcc
            )
                private
                pure
                returns (
                    bytes32 acc,
                    uint256 count,
                    uint256 offset
                )
            {
                offset = beforeOffset;
                count = beforeCount;
                acc = beforeAcc;
                itemCount += lengthsOffset;
                for (uint256 i = lengthsOffset; i < itemCount; i++) {
                    uint256 length = lengths[i];
                    bytes32 messageDataHash;
                    assembly {
                        messageDataHash := keccak256(offset, length)
                    }
                    acc = keccak256(abi.encodePacked(acc, count, prefixHash, messageDataHash));
                    offset += length;
                    count++;
                }
                return (acc, count, offset);
            }
            // Precondition: _totalDelayedMessagesRead > totalDelayedMessagesRead
            function includeDelayedMessages(
                bytes32 acc,
                uint256 count,
                uint256 _totalDelayedMessagesRead,
                uint256 l1BlockNumber,
                uint256 timestamp,
                bytes32 delayedAcc
            ) private returns (bytes32, uint256) {
                require(_totalDelayedMessagesRead <= delayedInbox.messageCount(), "DELAYED_TOO_FAR");
                require(delayedAcc == delayedInbox.inboxAccs(_totalDelayedMessagesRead - 1), "DELAYED_ACC");
                acc = keccak256(
                    abi.encodePacked(
                        "Delayed messages:",
                        acc,
                        count,
                        totalDelayedMessagesRead,
                        _totalDelayedMessagesRead,
                        delayedAcc
                    )
                );
                count += _totalDelayedMessagesRead - totalDelayedMessagesRead;
                bytes memory emptyBytes;
                acc = keccak256(
                    abi.encodePacked(
                        acc,
                        count,
                        keccak256(abi.encodePacked(address(0), l1BlockNumber, timestamp)),
                        keccak256(emptyBytes)
                    )
                );
                count++;
                totalDelayedMessagesRead = _totalDelayedMessagesRead;
                return (acc, count);
            }
            /**
             * @notice Prove message count as of provided inbox state hash
             * @param proof proof data
             * @param offset offset for parsing proof data
             * @param inboxAcc target inbox state hash
             */
            function proveSeqBatchMsgCount(
                bytes calldata proof,
                uint256 offset,
                bytes32 inboxAcc
            ) internal pure returns (uint256, uint256) {
                uint256 endMessageCount;
                bytes32 buildingAcc;
                uint256 seqNum;
                bytes32 messageHeaderHash;
                bytes32 messageDataHash;
                (offset, buildingAcc) = Marshaling.deserializeBytes32(proof, offset);
                (offset, seqNum) = Marshaling.deserializeInt(proof, offset);
                (offset, messageHeaderHash) = Marshaling.deserializeBytes32(proof, offset);
                (offset, messageDataHash) = Marshaling.deserializeBytes32(proof, offset);
                buildingAcc = keccak256(
                    abi.encodePacked(buildingAcc, seqNum, messageHeaderHash, messageDataHash)
                );
                endMessageCount = seqNum + 1;
                require(buildingAcc == inboxAcc, "BATCH_ACC");
                return (offset, endMessageCount);
            }
            /**
             * @notice Show that given messageCount falls inside of some batch and prove/return inboxAcc state. This is used to ensure that the creation of new nodes are replay protected to the state of the inbox, thereby ensuring their validity/invalidy can't be modified upon reorging the inbox contents.
             * @dev (wrapper in leiu of proveBatchContainsSequenceNumber for sementics)
             * @return (message count at end of target batch, inbox hash as of target batch)
             */
            function proveInboxContainsMessage(bytes calldata proof, uint256 _messageCount)
                external
                view
                override
                returns (uint256, bytes32)
            {
                return proveInboxContainsMessageImp(proof, _messageCount);
            }
            // deprecated in favor of proveInboxContainsMessage
            function proveBatchContainsSequenceNumber(bytes calldata proof, uint256 _messageCount)
                external
                view
                returns (uint256, bytes32)
            {
                return proveInboxContainsMessageImp(proof, _messageCount);
            }
            function proveInboxContainsMessageImp(bytes calldata proof, uint256 _messageCount)
                internal
                view
                returns (uint256, bytes32)
            {
                if (_messageCount == 0) {
                    return (0, 0);
                }
                (uint256 offset, uint256 targetInboxStateIndex) = Marshaling.deserializeInt(proof, 0);
                uint256 messageCountAsOfPreviousInboxState = 0;
                if (targetInboxStateIndex > 0) {
                    (offset, messageCountAsOfPreviousInboxState) = proveSeqBatchMsgCount(
                        proof,
                        offset,
                        inboxAccs[targetInboxStateIndex - 1]
                    );
                }
                bytes32 targetInboxState = inboxAccs[targetInboxStateIndex];
                uint256 messageCountAsOfTargetInboxState;
                (offset, messageCountAsOfTargetInboxState) = proveSeqBatchMsgCount(
                    proof,
                    offset,
                    targetInboxState
                );
                require(_messageCount > messageCountAsOfPreviousInboxState, "BATCH_START");
                require(_messageCount <= messageCountAsOfTargetInboxState, "BATCH_END");
                return (messageCountAsOfTargetInboxState, targetInboxState);
            }
            function getInboxAccsLength() external view override returns (uint256) {
                return inboxAccs.length;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        interface ISequencerInbox {
            event SequencerBatchDelivered(
                uint256 indexed firstMessageNum,
                bytes32 indexed beforeAcc,
                uint256 newMessageCount,
                bytes32 afterAcc,
                bytes transactions,
                uint256[] lengths,
                uint256[] sectionsMetadata,
                uint256 seqBatchIndex,
                address sequencer
            );
            event SequencerBatchDeliveredFromOrigin(
                uint256 indexed firstMessageNum,
                bytes32 indexed beforeAcc,
                uint256 newMessageCount,
                bytes32 afterAcc,
                uint256 seqBatchIndex
            );
            event DelayedInboxForced(
                uint256 indexed firstMessageNum,
                bytes32 indexed beforeAcc,
                uint256 newMessageCount,
                uint256 totalDelayedMessagesRead,
                bytes32[2] afterAccAndDelayed,
                uint256 seqBatchIndex
            );
            /// @notice DEPRECATED - look at IsSequencerUpdated for new updates
            // event SequencerAddressUpdated(address newAddress);
            event IsSequencerUpdated(address addr, bool isSequencer);
            event MaxDelayUpdated(uint256 newMaxDelayBlocks, uint256 newMaxDelaySeconds);
            /// @notice DEPRECATED - look at MaxDelayUpdated for new updates
            // event MaxDelayBlocksUpdated(uint256 newValue);
            /// @notice DEPRECATED - look at MaxDelayUpdated for new updates
            // event MaxDelaySecondsUpdated(uint256 newValue);
            function setMaxDelay(uint256 newMaxDelayBlocks, uint256 newMaxDelaySeconds) external;
            function setIsSequencer(address addr, bool isSequencer) external;
            function messageCount() external view returns (uint256);
            function maxDelayBlocks() external view returns (uint256);
            function maxDelaySeconds() external view returns (uint256);
            function inboxAccs(uint256 index) external view returns (bytes32);
            function getInboxAccsLength() external view returns (uint256);
            function proveInboxContainsMessage(bytes calldata proof, uint256 inboxCount)
                external
                view
                returns (uint256, bytes32);
            /// @notice DEPRECATED - use isSequencer instead
            function sequencer() external view returns (address);
            function isSequencer(address seq) external view returns (bool);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        interface IBridge {
            event MessageDelivered(
                uint256 indexed messageIndex,
                bytes32 indexed beforeInboxAcc,
                address inbox,
                uint8 kind,
                address sender,
                bytes32 messageDataHash
            );
            event BridgeCallTriggered(
                address indexed outbox,
                address indexed destAddr,
                uint256 amount,
                bytes data
            );
            event InboxToggle(address indexed inbox, bool enabled);
            event OutboxToggle(address indexed outbox, bool enabled);
            function deliverMessageToInbox(
                uint8 kind,
                address sender,
                bytes32 messageDataHash
            ) external payable returns (uint256);
            function executeCall(
                address destAddr,
                uint256 amount,
                bytes calldata data
            ) external returns (bool success, bytes memory returnData);
            // These are only callable by the admin
            function setInbox(address inbox, bool enabled) external;
            function setOutbox(address inbox, bool enabled) external;
            // View functions
            function activeOutbox() external view returns (address);
            function allowedInboxes(address inbox) external view returns (bool);
            function allowedOutboxes(address outbox) external view returns (bool);
            function inboxAccs(uint256 index) external view returns (bytes32);
            function messageCount() external view returns (uint256);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "./Value.sol";
        import "./Hashing.sol";
        import "../libraries/BytesLib.sol";
        library Marshaling {
            using BytesLib for bytes;
            using Value for Value.Data;
            function deserializeHashPreImage(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (uint256 offset, Value.Data memory value)
            {
                require(data.length >= startOffset && data.length - startOffset >= 64, "too short");
                bytes32 hashData;
                uint256 size;
                (offset, hashData) = extractBytes32(data, startOffset);
                (offset, size) = deserializeInt(data, offset);
                return (offset, Value.newTuplePreImage(hashData, size));
            }
            function deserializeInt(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    uint256 // val
                )
            {
                require(data.length >= startOffset && data.length - startOffset >= 32, "too short");
                return (startOffset + 32, data.toUint(startOffset));
            }
            function deserializeBytes32(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    bytes32 // val
                )
            {
                require(data.length >= startOffset && data.length - startOffset >= 32, "too short");
                return (startOffset + 32, data.toBytes32(startOffset));
            }
            function deserializeCodePoint(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    Value.Data memory // val
                )
            {
                uint256 offset = startOffset;
                uint8 immediateType;
                uint8 opCode;
                Value.Data memory immediate;
                bytes32 nextHash;
                (offset, immediateType) = extractUint8(data, offset);
                (offset, opCode) = extractUint8(data, offset);
                if (immediateType == 1) {
                    (offset, immediate) = deserialize(data, offset);
                }
                (offset, nextHash) = extractBytes32(data, offset);
                if (immediateType == 1) {
                    return (offset, Value.newCodePoint(opCode, nextHash, immediate));
                }
                return (offset, Value.newCodePoint(opCode, nextHash));
            }
            function deserializeTuple(
                uint8 memberCount,
                bytes memory data,
                uint256 startOffset
            )
                internal
                pure
                returns (
                    uint256, // offset
                    Value.Data[] memory // val
                )
            {
                uint256 offset = startOffset;
                Value.Data[] memory members = new Value.Data[](memberCount);
                for (uint8 i = 0; i < memberCount; i++) {
                    (offset, members[i]) = deserialize(data, offset);
                }
                return (offset, members);
            }
            function deserialize(bytes memory data, uint256 startOffset)
                internal
                pure
                returns (
                    uint256, // offset
                    Value.Data memory // val
                )
            {
                require(startOffset < data.length, "invalid offset");
                (uint256 offset, uint8 valType) = extractUint8(data, startOffset);
                if (valType == Value.intTypeCode()) {
                    uint256 intVal;
                    (offset, intVal) = deserializeInt(data, offset);
                    return (offset, Value.newInt(intVal));
                } else if (valType == Value.codePointTypeCode()) {
                    return deserializeCodePoint(data, offset);
                } else if (valType == Value.bufferTypeCode()) {
                    bytes32 hashVal;
                    (offset, hashVal) = deserializeBytes32(data, offset);
                    return (offset, Value.newBuffer(hashVal));
                } else if (valType == Value.tuplePreImageTypeCode()) {
                    return deserializeHashPreImage(data, offset);
                } else if (valType >= Value.tupleTypeCode() && valType < Value.valueTypeCode()) {
                    uint8 tupLength = uint8(valType - Value.tupleTypeCode());
                    Value.Data[] memory tupleVal;
                    (offset, tupleVal) = deserializeTuple(tupLength, data, offset);
                    return (offset, Value.newTuple(tupleVal));
                }
                require(false, "invalid typecode");
            }
            function extractUint8(bytes memory data, uint256 startOffset)
                private
                pure
                returns (
                    uint256, // offset
                    uint8 // val
                )
            {
                return (startOffset + 1, uint8(data[startOffset]));
            }
            function extractBytes32(bytes memory data, uint256 startOffset)
                private
                pure
                returns (
                    uint256, // offset
                    bytes32 // val
                )
            {
                return (startOffset + 32, data.toBytes32(startOffset));
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2020, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "./ICloneable.sol";
        contract Cloneable is ICloneable {
            string private constant NOT_CLONE = "NOT_CLONE";
            bool private isMasterCopy;
            constructor() public {
                isMasterCopy = true;
            }
            function isMaster() external view override returns (bool) {
                return isMasterCopy;
            }
            function safeSelfDestruct(address payable dest) internal {
                require(!isMasterCopy, NOT_CLONE);
                selfdestruct(dest);
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "@openzeppelin/contracts/utils/Pausable.sol";
        import "@openzeppelin/contracts/proxy/Proxy.sol";
        import "@openzeppelin/contracts/utils/Address.sol";
        import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
        import "./RollupEventBridge.sol";
        import "./RollupCore.sol";
        import "./RollupLib.sol";
        import "./INode.sol";
        import "./INodeFactory.sol";
        import "../challenge/IChallenge.sol";
        import "../challenge/IChallengeFactory.sol";
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/IOutbox.sol";
        import "../bridge/Messages.sol";
        import "../libraries/ProxyUtil.sol";
        import "../libraries/Cloneable.sol";
        import "./facets/IRollupFacets.sol";
        abstract contract RollupBase is Cloneable, RollupCore, Pausable {
            // Rollup Config
            uint256 public confirmPeriodBlocks;
            uint256 public extraChallengeTimeBlocks;
            uint256 public avmGasSpeedLimitPerBlock;
            uint256 public baseStake;
            // Bridge is an IInbox and IOutbox
            IBridge public delayedBridge;
            ISequencerInbox public sequencerBridge;
            IOutbox public outbox;
            RollupEventBridge public rollupEventBridge;
            IChallengeFactory public challengeFactory;
            INodeFactory public nodeFactory;
            address public owner;
            address public stakeToken;
            uint256 public minimumAssertionPeriod;
            uint256 public STORAGE_GAP_1;
            uint256 public STORAGE_GAP_2;
            uint256 public challengeExecutionBisectionDegree;
            address[] internal facets;
            mapping(address => bool) isValidator;
            /// @notice DEPRECATED -- this method is deprecated but still mantained for backward compatibility
            /// @dev this actually returns the avmGasSpeedLimitPerBlock
            /// @return this actually returns the avmGasSpeedLimitPerBlock
            function arbGasSpeedLimitPerBlock() external view returns (uint256) {
                return avmGasSpeedLimitPerBlock;
            }
        }
        contract Rollup is Proxy, RollupBase {
            using Address for address;
            constructor(uint256 _confirmPeriodBlocks) public Cloneable() Pausable() {
                // constructor is used so logic contract can't be init'ed
                confirmPeriodBlocks = _confirmPeriodBlocks;
                require(isInit(), "CONSTRUCTOR_NOT_INIT");
            }
            function isInit() internal view returns (bool) {
                return confirmPeriodBlocks != 0;
            }
            // _rollupParams = [ confirmPeriodBlocks, extraChallengeTimeBlocks, avmGasSpeedLimitPerBlock, baseStake ]
            // connectedContracts = [delayedBridge, sequencerInbox, outbox, rollupEventBridge, challengeFactory, nodeFactory]
            function initialize(
                bytes32 _machineHash,
                uint256[4] calldata _rollupParams,
                address _stakeToken,
                address _owner,
                bytes calldata _extraConfig,
                address[6] calldata connectedContracts,
                address[2] calldata _facets,
                uint256[2] calldata sequencerInboxParams
            ) public {
                require(!isInit(), "ALREADY_INIT");
                // calls initialize method in user facet
                require(_facets[0].isContract(), "FACET_0_NOT_CONTRACT");
                require(_facets[1].isContract(), "FACET_1_NOT_CONTRACT");
                (bool success, ) = _facets[1].delegatecall(
                    abi.encodeWithSelector(IRollupUser.initialize.selector, _stakeToken)
                );
                require(success, "FAIL_INIT_FACET");
                delayedBridge = IBridge(connectedContracts[0]);
                sequencerBridge = ISequencerInbox(connectedContracts[1]);
                outbox = IOutbox(connectedContracts[2]);
                delayedBridge.setOutbox(connectedContracts[2], true);
                rollupEventBridge = RollupEventBridge(connectedContracts[3]);
                delayedBridge.setInbox(connectedContracts[3], true);
                rollupEventBridge.rollupInitialized(
                    _rollupParams[0],
                    _rollupParams[2],
                    _owner,
                    _extraConfig
                );
                challengeFactory = IChallengeFactory(connectedContracts[4]);
                nodeFactory = INodeFactory(connectedContracts[5]);
                INode node = createInitialNode(_machineHash);
                initializeCore(node);
                confirmPeriodBlocks = _rollupParams[0];
                extraChallengeTimeBlocks = _rollupParams[1];
                avmGasSpeedLimitPerBlock = _rollupParams[2];
                baseStake = _rollupParams[3];
                owner = _owner;
                // A little over 15 minutes
                minimumAssertionPeriod = 75;
                challengeExecutionBisectionDegree = 400;
                sequencerBridge.setMaxDelay(sequencerInboxParams[0], sequencerInboxParams[1]);
                // facets[0] == admin, facets[1] == user
                facets = _facets;
                emit RollupCreated(_machineHash);
                require(isInit(), "INITIALIZE_NOT_INIT");
            }
            function postUpgradeInit() external {
                // it is assumed the rollup contract is behind a Proxy controlled by a proxy admin
                // this function can only be called by the proxy admin contract
                address proxyAdmin = ProxyUtil.getProxyAdmin();
                require(msg.sender == proxyAdmin, "NOT_FROM_ADMIN");
                // this upgrade moves the delay blocks and seconds tracking to the sequencer inbox
                // because of that we need to update the admin facet logic to allow the owner to set
                // these values in the sequencer inbox
                STORAGE_GAP_1 = 0;
                STORAGE_GAP_2 = 0;
            }
            function createInitialNode(bytes32 _machineHash) private returns (INode) {
                bytes32 state = RollupLib.stateHash(
                    RollupLib.ExecutionState(
                        0, // total gas used
                        _machineHash,
                        0, // inbox count
                        0, // send count
                        0, // log count
                        0, // send acc
                        0, // log acc
                        block.number, // block proposed
                        1 // Initialization message already in inbox
                    )
                );
                return
                    INode(
                        nodeFactory.createNode(
                            state,
                            0, // challenge hash (not challengeable)
                            0, // confirm data
                            0, // prev node
                            block.number // deadline block (not challengeable)
                        )
                    );
            }
            /**
             * This contract uses a dispatch pattern from EIP-2535: Diamonds
             * together with Open Zeppelin's proxy
             */
            function getFacets() external view returns (address, address) {
                return (getAdminFacet(), getUserFacet());
            }
            function getAdminFacet() public view returns (address) {
                return facets[0];
            }
            function getUserFacet() public view returns (address) {
                return facets[1];
            }
            /**
             * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
             * and {_fallback} should delegate.
             */
            function _implementation() internal view virtual override returns (address) {
                require(msg.data.length >= 4, "NO_FUNC_SIG");
                address rollupOwner = owner;
                // if there is an owner and it is the sender, delegate to admin facet
                address target = rollupOwner != address(0) && rollupOwner == msg.sender
                    ? getAdminFacet()
                    : getUserFacet();
                require(target.isContract(), "TARGET_NOT_CONTRACT");
                return target;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity >=0.6.11 <0.7.0||>=0.8.7 <0.9.0;
        interface IGasRefunder {
            function onGasSpent(
                address payable spender,
                uint256 gasUsed,
                uint256 calldataSize
            ) external returns (bool success);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        library Messages {
            function messageHash(
                uint8 kind,
                address sender,
                uint256 blockNumber,
                uint256 timestamp,
                uint256 inboxSeqNum,
                uint256 gasPriceL1,
                bytes32 messageDataHash
            ) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            kind,
                            sender,
                            blockNumber,
                            timestamp,
                            inboxSeqNum,
                            gasPriceL1,
                            messageDataHash
                        )
                    );
            }
            function addMessageToInbox(bytes32 inbox, bytes32 message) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(inbox, message));
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        library Value {
            uint8 internal constant INT_TYPECODE = 0;
            uint8 internal constant CODE_POINT_TYPECODE = 1;
            uint8 internal constant HASH_PRE_IMAGE_TYPECODE = 2;
            uint8 internal constant TUPLE_TYPECODE = 3;
            uint8 internal constant BUFFER_TYPECODE = TUPLE_TYPECODE + 9;
            // All values received from clients will have type codes less than the VALUE_TYPE_COUNT
            uint8 internal constant VALUE_TYPE_COUNT = TUPLE_TYPECODE + 10;
            // The following types do not show up in the marshalled format and is
            // only used for internal tracking purposes
            uint8 internal constant HASH_ONLY = 100;
            struct CodePoint {
                uint8 opcode;
                bytes32 nextCodePoint;
                Data[] immediate;
            }
            struct Data {
                uint256 intVal;
                CodePoint cpVal;
                Data[] tupleVal;
                bytes32 bufferHash;
                uint8 typeCode;
                uint256 size;
            }
            function tupleTypeCode() internal pure returns (uint8) {
                return TUPLE_TYPECODE;
            }
            function tuplePreImageTypeCode() internal pure returns (uint8) {
                return HASH_PRE_IMAGE_TYPECODE;
            }
            function intTypeCode() internal pure returns (uint8) {
                return INT_TYPECODE;
            }
            function bufferTypeCode() internal pure returns (uint8) {
                return BUFFER_TYPECODE;
            }
            function codePointTypeCode() internal pure returns (uint8) {
                return CODE_POINT_TYPECODE;
            }
            function valueTypeCode() internal pure returns (uint8) {
                return VALUE_TYPE_COUNT;
            }
            function hashOnlyTypeCode() internal pure returns (uint8) {
                return HASH_ONLY;
            }
            function isValidTupleSize(uint256 size) internal pure returns (bool) {
                return size <= 8;
            }
            function typeCodeVal(Data memory val) internal pure returns (Data memory) {
                if (val.typeCode == 2) {
                    // Map HashPreImage to Tuple
                    return newInt(TUPLE_TYPECODE);
                }
                return newInt(val.typeCode);
            }
            function valLength(Data memory val) internal pure returns (uint8) {
                if (val.typeCode == TUPLE_TYPECODE) {
                    return uint8(val.tupleVal.length);
                } else {
                    return 1;
                }
            }
            function isInt(Data memory val) internal pure returns (bool) {
                return val.typeCode == INT_TYPECODE;
            }
            function isInt64(Data memory val) internal pure returns (bool) {
                return val.typeCode == INT_TYPECODE && val.intVal < (1 << 64);
            }
            function isCodePoint(Data memory val) internal pure returns (bool) {
                return val.typeCode == CODE_POINT_TYPECODE;
            }
            function isTuple(Data memory val) internal pure returns (bool) {
                return val.typeCode == TUPLE_TYPECODE;
            }
            function isBuffer(Data memory val) internal pure returns (bool) {
                return val.typeCode == BUFFER_TYPECODE;
            }
            function newEmptyTuple() internal pure returns (Data memory) {
                return newTuple(new Data[](0));
            }
            function newBoolean(bool val) internal pure returns (Data memory) {
                if (val) {
                    return newInt(1);
                } else {
                    return newInt(0);
                }
            }
            function newInt(uint256 _val) internal pure returns (Data memory) {
                return
                    Data(_val, CodePoint(0, 0, new Data[](0)), new Data[](0), 0, INT_TYPECODE, uint256(1));
            }
            function newHashedValue(bytes32 valueHash, uint256 valueSize)
                internal
                pure
                returns (Data memory)
            {
                return
                    Data(
                        uint256(valueHash),
                        CodePoint(0, 0, new Data[](0)),
                        new Data[](0),
                        0,
                        HASH_ONLY,
                        valueSize
                    );
            }
            function newTuple(Data[] memory _val) internal pure returns (Data memory) {
                require(isValidTupleSize(_val.length), "Tuple must have valid size");
                uint256 size = 1;
                for (uint256 i = 0; i < _val.length; i++) {
                    size += _val[i].size;
                }
                return Data(0, CodePoint(0, 0, new Data[](0)), _val, 0, TUPLE_TYPECODE, size);
            }
            function newTuplePreImage(bytes32 preImageHash, uint256 size)
                internal
                pure
                returns (Data memory)
            {
                return
                    Data(
                        uint256(preImageHash),
                        CodePoint(0, 0, new Data[](0)),
                        new Data[](0),
                        0,
                        HASH_PRE_IMAGE_TYPECODE,
                        size
                    );
            }
            function newCodePoint(uint8 opCode, bytes32 nextHash) internal pure returns (Data memory) {
                return newCodePoint(CodePoint(opCode, nextHash, new Data[](0)));
            }
            function newCodePoint(
                uint8 opCode,
                bytes32 nextHash,
                Data memory immediate
            ) internal pure returns (Data memory) {
                Data[] memory imm = new Data[](1);
                imm[0] = immediate;
                return newCodePoint(CodePoint(opCode, nextHash, imm));
            }
            function newCodePoint(CodePoint memory _val) private pure returns (Data memory) {
                return Data(0, _val, new Data[](0), 0, CODE_POINT_TYPECODE, uint256(1));
            }
            function newBuffer(bytes32 bufHash) internal pure returns (Data memory) {
                return
                    Data(
                        uint256(0),
                        CodePoint(0, 0, new Data[](0)),
                        new Data[](0),
                        bufHash,
                        BUFFER_TYPECODE,
                        uint256(1)
                    );
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2020, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "./Value.sol";
        library Hashing {
            using Hashing for Value.Data;
            using Value for Value.CodePoint;
            function keccak1(bytes32 b) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(b));
            }
            function keccak2(bytes32 a, bytes32 b) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(a, b));
            }
            function bytes32FromArray(
                bytes memory arr,
                uint256 offset,
                uint256 arrLength
            ) internal pure returns (uint256) {
                uint256 res = 0;
                for (uint256 i = 0; i < 32; i++) {
                    res = res << 8;
                    bytes1 b = arrLength > offset + i ? arr[offset + i] : bytes1(0);
                    res = res | uint256(uint8(b));
                }
                return res;
            }
            /*
             * !! Note that dataLength must be a power of two !!
             *
             * If you have an arbitrary data length, you can round it up with roundUpToPow2.
             * The boolean return value tells if the data segment data[startOffset..startOffset+dataLength] only included zeroes.
             * If pack is true, the returned value is the merkle hash where trailing zeroes are ignored, that is,
             *   if h is the smallest height for which all data[startOffset+2**h..] are zero, merkle hash of data[startOffset..startOffset+2**h] is returned.
             * If all elements in the data segment are zero (and pack is true), keccak1(bytes32(0)) is returned.
             */
            function merkleRoot(
                bytes memory data,
                uint256 rawDataLength,
                uint256 startOffset,
                uint256 dataLength,
                bool pack
            ) internal pure returns (bytes32, bool) {
                if (dataLength <= 32) {
                    if (startOffset >= rawDataLength) {
                        return (keccak1(bytes32(0)), true);
                    }
                    bytes32 res = keccak1(bytes32(bytes32FromArray(data, startOffset, rawDataLength)));
                    return (res, res == keccak1(bytes32(0)));
                }
                (bytes32 h2, bool zero2) =
                    merkleRoot(data, rawDataLength, startOffset + dataLength / 2, dataLength / 2, false);
                if (zero2 && pack) {
                    return merkleRoot(data, rawDataLength, startOffset, dataLength / 2, pack);
                }
                (bytes32 h1, bool zero1) =
                    merkleRoot(data, rawDataLength, startOffset, dataLength / 2, false);
                return (keccak2(h1, h2), zero1 && zero2);
            }
            function roundUpToPow2(uint256 len) internal pure returns (uint256) {
                if (len <= 1) return 1;
                else return 2 * roundUpToPow2((len + 1) / 2);
            }
            function bytesToBufferHash(
                bytes memory buf,
                uint256 startOffset,
                uint256 length
            ) internal pure returns (bytes32) {
                (bytes32 mhash, ) =
                    merkleRoot(buf, startOffset + length, startOffset, roundUpToPow2(length), true);
                return keccak2(bytes32(uint256(123)), mhash);
            }
            function hashInt(uint256 val) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(val));
            }
            function hashCodePoint(Value.CodePoint memory cp) internal pure returns (bytes32) {
                assert(cp.immediate.length < 2);
                if (cp.immediate.length == 0) {
                    return
                        keccak256(abi.encodePacked(Value.codePointTypeCode(), cp.opcode, cp.nextCodePoint));
                }
                return
                    keccak256(
                        abi.encodePacked(
                            Value.codePointTypeCode(),
                            cp.opcode,
                            cp.immediate[0].hash(),
                            cp.nextCodePoint
                        )
                    );
            }
            function hashTuplePreImage(bytes32 innerHash, uint256 valueSize)
                internal
                pure
                returns (bytes32)
            {
                return keccak256(abi.encodePacked(uint8(Value.tupleTypeCode()), innerHash, valueSize));
            }
            function hash(Value.Data memory val) internal pure returns (bytes32) {
                if (val.typeCode == Value.intTypeCode()) {
                    return hashInt(val.intVal);
                } else if (val.typeCode == Value.codePointTypeCode()) {
                    return hashCodePoint(val.cpVal);
                } else if (val.typeCode == Value.tuplePreImageTypeCode()) {
                    return hashTuplePreImage(bytes32(val.intVal), val.size);
                } else if (val.typeCode == Value.tupleTypeCode()) {
                    Value.Data memory preImage = getTuplePreImage(val.tupleVal);
                    return preImage.hash();
                } else if (val.typeCode == Value.hashOnlyTypeCode()) {
                    return bytes32(val.intVal);
                } else if (val.typeCode == Value.bufferTypeCode()) {
                    return keccak256(abi.encodePacked(uint256(123), val.bufferHash));
                } else {
                    require(false, "Invalid type code");
                }
            }
            function getTuplePreImage(Value.Data[] memory vals) internal pure returns (Value.Data memory) {
                require(vals.length <= 8, "Invalid tuple length");
                bytes32[] memory hashes = new bytes32[](vals.length);
                uint256 hashCount = hashes.length;
                uint256 size = 1;
                for (uint256 i = 0; i < hashCount; i++) {
                    hashes[i] = vals[i].hash();
                    size += vals[i].size;
                }
                bytes32 firstHash = keccak256(abi.encodePacked(uint8(hashes.length), hashes));
                return Value.newTuplePreImage(firstHash, size);
            }
        }
        // SPDX-License-Identifier: MIT
        /*
         * @title Solidity Bytes Arrays Utils
         * @author Gonçalo Sá <goncalo.sa@consensys.net>
         *
         * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
         *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
         */
        pragma solidity ^0.6.11;
        /* solhint-disable no-inline-assembly */
        library BytesLib {
            function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
                require(_bytes.length >= (_start + 20), "Read out of bounds");
                address tempAddress;
                assembly {
                    tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
                }
                return tempAddress;
            }
            function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {
                require(_bytes.length >= (_start + 1), "Read out of bounds");
                uint8 tempUint;
                assembly {
                    tempUint := mload(add(add(_bytes, 0x1), _start))
                }
                return tempUint;
            }
            function toUint(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
                require(_bytes.length >= (_start + 32), "Read out of bounds");
                uint256 tempUint;
                assembly {
                    tempUint := mload(add(add(_bytes, 0x20), _start))
                }
                return tempUint;
            }
            function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {
                require(_bytes.length >= (_start + 32), "Read out of bounds");
                bytes32 tempBytes32;
                assembly {
                    tempBytes32 := mload(add(add(_bytes, 0x20), _start))
                }
                return tempBytes32;
            }
        }
        /* solhint-enable no-inline-assembly */
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        interface ICloneable {
            function isMaster() external view returns (bool);
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        import "./Context.sol";
        /**
         * @dev Contract module which allows children to implement an emergency stop
         * mechanism that can be triggered by an authorized account.
         *
         * This module is used through inheritance. It will make available the
         * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
         * the functions of your contract. Note that they will not be pausable by
         * simply including this module, only once the modifiers are put in place.
         */
        abstract contract Pausable is Context {
            /**
             * @dev Emitted when the pause is triggered by `account`.
             */
            event Paused(address account);
            /**
             * @dev Emitted when the pause is lifted by `account`.
             */
            event Unpaused(address account);
            bool private _paused;
            /**
             * @dev Initializes the contract in unpaused state.
             */
            constructor () internal {
                _paused = false;
            }
            /**
             * @dev Returns true if the contract is paused, and false otherwise.
             */
            function paused() public view virtual returns (bool) {
                return _paused;
            }
            /**
             * @dev Modifier to make a function callable only when the contract is not paused.
             *
             * Requirements:
             *
             * - The contract must not be paused.
             */
            modifier whenNotPaused() {
                require(!paused(), "Pausable: paused");
                _;
            }
            /**
             * @dev Modifier to make a function callable only when the contract is paused.
             *
             * Requirements:
             *
             * - The contract must be paused.
             */
            modifier whenPaused() {
                require(paused(), "Pausable: not paused");
                _;
            }
            /**
             * @dev Triggers stopped state.
             *
             * Requirements:
             *
             * - The contract must not be paused.
             */
            function _pause() internal virtual whenNotPaused {
                _paused = true;
                emit Paused(_msgSender());
            }
            /**
             * @dev Returns to normal state.
             *
             * Requirements:
             *
             * - The contract must be paused.
             */
            function _unpause() internal virtual whenPaused {
                _paused = false;
                emit Unpaused(_msgSender());
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        /**
         * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
         * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
         * be specified by overriding the virtual {_implementation} function.
         *
         * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
         * different contract through the {_delegate} function.
         *
         * The success and return data of the delegated call will be returned back to the caller of the proxy.
         */
        abstract contract Proxy {
            /**
             * @dev Delegates the current call to `implementation`.
             *
             * This function does not return to its internall call site, it will return directly to the external caller.
             */
            function _delegate(address implementation) internal virtual {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    // Copy msg.data. We take full control of memory in this inline assembly
                    // block because it will not return to Solidity code. We overwrite the
                    // Solidity scratch pad at memory position 0.
                    calldatacopy(0, 0, calldatasize())
                    // Call the implementation.
                    // out and outsize are 0 because we don't know the size yet.
                    let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
                    // Copy the returned data.
                    returndatacopy(0, 0, returndatasize())
                    switch result
                    // delegatecall returns 0 on error.
                    case 0 { revert(0, returndatasize()) }
                    default { return(0, returndatasize()) }
                }
            }
            /**
             * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function
             * and {_fallback} should delegate.
             */
            function _implementation() internal view virtual returns (address);
            /**
             * @dev Delegates the current call to the address returned by `_implementation()`.
             *
             * This function does not return to its internall call site, it will return directly to the external caller.
             */
            function _fallback() internal virtual {
                _beforeFallback();
                _delegate(_implementation());
            }
            /**
             * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
             * function in the contract matches the call data.
             */
            fallback () external payable virtual {
                _fallback();
            }
            /**
             * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
             * is empty.
             */
            receive () external payable virtual {
                _fallback();
            }
            /**
             * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
             * call, or as part of the Solidity `fallback` or `receive` functions.
             *
             * If overriden should call `super._beforeFallback()`.
             */
            function _beforeFallback() internal virtual {
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.2 <0.8.0;
        /**
         * @dev Collection of functions related to the address type
         */
        library Address {
            /**
             * @dev Returns true if `account` is a contract.
             *
             * [IMPORTANT]
             * ====
             * It is unsafe to assume that an address for which this function returns
             * false is an externally-owned account (EOA) and not a contract.
             *
             * Among others, `isContract` will return false for the following
             * types of addresses:
             *
             *  - an externally-owned account
             *  - a contract in construction
             *  - an address where a contract will be created
             *  - an address where a contract lived, but was destroyed
             * ====
             */
            function isContract(address account) internal view returns (bool) {
                // This method relies on extcodesize, which returns 0 for contracts in
                // construction, since the code is only stored at the end of the
                // constructor execution.
                uint256 size;
                // solhint-disable-next-line no-inline-assembly
                assembly { size := extcodesize(account) }
                return size > 0;
            }
            /**
             * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
             * `recipient`, forwarding all available gas and reverting on errors.
             *
             * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
             * of certain opcodes, possibly making contracts go over the 2300 gas limit
             * imposed by `transfer`, making them unable to receive funds via
             * `transfer`. {sendValue} removes this limitation.
             *
             * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
             *
             * IMPORTANT: because control is transferred to `recipient`, care must be
             * taken to not create reentrancy vulnerabilities. Consider using
             * {ReentrancyGuard} or the
             * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
             */
            function sendValue(address payable recipient, uint256 amount) internal {
                require(address(this).balance >= amount, "Address: insufficient balance");
                // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
                (bool success, ) = recipient.call{ value: amount }("");
                require(success, "Address: unable to send value, recipient may have reverted");
            }
            /**
             * @dev Performs a Solidity function call using a low level `call`. A
             * plain`call` is an unsafe replacement for a function call: use this
             * function instead.
             *
             * If `target` reverts with a revert reason, it is bubbled up by this
             * function (like regular Solidity function calls).
             *
             * Returns the raw returned data. To convert to the expected return value,
             * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
             *
             * Requirements:
             *
             * - `target` must be a contract.
             * - calling `target` with `data` must not revert.
             *
             * _Available since v3.1._
             */
            function functionCall(address target, bytes memory data) internal returns (bytes memory) {
              return functionCall(target, data, "Address: low-level call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
             * `errorMessage` as a fallback revert reason when `target` reverts.
             *
             * _Available since v3.1._
             */
            function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
                return functionCallWithValue(target, data, 0, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but also transferring `value` wei to `target`.
             *
             * Requirements:
             *
             * - the calling contract must have an ETH balance of at least `value`.
             * - the called Solidity function must be `payable`.
             *
             * _Available since v3.1._
             */
            function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
                return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
            }
            /**
             * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
             * with `errorMessage` as a fallback revert reason when `target` reverts.
             *
             * _Available since v3.1._
             */
            function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
                require(address(this).balance >= value, "Address: insufficient balance for call");
                require(isContract(target), "Address: call to non-contract");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.call{ value: value }(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but performing a static call.
             *
             * _Available since v3.3._
             */
            function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
                return functionStaticCall(target, data, "Address: low-level static call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
             * but performing a static call.
             *
             * _Available since v3.3._
             */
            function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
                require(isContract(target), "Address: static call to non-contract");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.staticcall(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
             * but performing a delegate call.
             *
             * _Available since v3.4._
             */
            function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
                return functionDelegateCall(target, data, "Address: low-level delegate call failed");
            }
            /**
             * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
             * but performing a delegate call.
             *
             * _Available since v3.4._
             */
            function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
                require(isContract(target), "Address: delegate call to non-contract");
                // solhint-disable-next-line avoid-low-level-calls
                (bool success, bytes memory returndata) = target.delegatecall(data);
                return _verifyCallResult(success, returndata, errorMessage);
            }
            function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
                if (success) {
                    return returndata;
                } else {
                    // Look for revert reason and bubble it up if present
                    if (returndata.length > 0) {
                        // The easiest way to bubble the revert reason is using memory via assembly
                        // solhint-disable-next-line no-inline-assembly
                        assembly {
                            let returndata_size := mload(returndata)
                            revert(add(32, returndata), returndata_size)
                        }
                    } else {
                        revert(errorMessage);
                    }
                }
            }
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        /**
         * @dev Interface of the ERC20 standard as defined in the EIP.
         */
        interface IERC20 {
            /**
             * @dev Returns the amount of tokens in existence.
             */
            function totalSupply() external view returns (uint256);
            /**
             * @dev Returns the amount of tokens owned by `account`.
             */
            function balanceOf(address account) external view returns (uint256);
            /**
             * @dev Moves `amount` tokens from the caller's account to `recipient`.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transfer(address recipient, uint256 amount) external returns (bool);
            /**
             * @dev Returns the remaining number of tokens that `spender` will be
             * allowed to spend on behalf of `owner` through {transferFrom}. This is
             * zero by default.
             *
             * This value changes when {approve} or {transferFrom} are called.
             */
            function allowance(address owner, address spender) external view returns (uint256);
            /**
             * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * IMPORTANT: Beware that changing an allowance with this method brings the risk
             * that someone may use both the old and the new allowance by unfortunate
             * transaction ordering. One possible solution to mitigate this race
             * condition is to first reduce the spender's allowance to 0 and set the
             * desired value afterwards:
             * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
             *
             * Emits an {Approval} event.
             */
            function approve(address spender, uint256 amount) external returns (bool);
            /**
             * @dev Moves `amount` tokens from `sender` to `recipient` using the
             * allowance mechanism. `amount` is then deducted from the caller's
             * allowance.
             *
             * Returns a boolean value indicating whether the operation succeeded.
             *
             * Emits a {Transfer} event.
             */
            function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
            /**
             * @dev Emitted when `value` tokens are moved from one account (`from`) to
             * another (`to`).
             *
             * Note that `value` may be zero.
             */
            event Transfer(address indexed from, address indexed to, uint256 value);
            /**
             * @dev Emitted when the allowance of a `spender` for an `owner` is set by
             * a call to {approve}. `value` is the new allowance.
             */
            event Approval(address indexed owner, address indexed spender, uint256 value);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "./Rollup.sol";
        import "./facets/IRollupFacets.sol";
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/IMessageProvider.sol";
        import "./INode.sol";
        import "../libraries/Cloneable.sol";
        contract RollupEventBridge is IMessageProvider, Cloneable {
            uint8 internal constant INITIALIZATION_MSG_TYPE = 11;
            uint8 internal constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
            uint8 internal constant CREATE_NODE_EVENT = 0;
            uint8 internal constant CONFIRM_NODE_EVENT = 1;
            uint8 internal constant REJECT_NODE_EVENT = 2;
            uint8 internal constant STAKE_CREATED_EVENT = 3;
            IBridge bridge;
            address rollup;
            modifier onlyRollup() {
                require(msg.sender == rollup, "ONLY_ROLLUP");
                _;
            }
            function initialize(address _bridge, address _rollup) external {
                require(rollup == address(0), "ALREADY_INIT");
                bridge = IBridge(_bridge);
                rollup = _rollup;
            }
            function rollupInitialized(
                uint256 confirmPeriodBlocks,
                uint256 avmGasSpeedLimitPerBlock,
                address owner,
                bytes calldata extraConfig
            ) external onlyRollup {
                bytes memory initMsg = abi.encodePacked(
                    keccak256("ChallengePeriodEthBlocks"),
                    confirmPeriodBlocks,
                    keccak256("SpeedLimitPerSecond"),
                    avmGasSpeedLimitPerBlock / 100, // convert avm gas to arbgas
                    keccak256("ChainOwner"),
                    uint256(uint160(bytes20(owner))),
                    extraConfig
                );
                uint256 num = bridge.deliverMessageToInbox(
                    INITIALIZATION_MSG_TYPE,
                    address(0),
                    keccak256(initMsg)
                );
                emit InboxMessageDelivered(num, initMsg);
            }
            function nodeCreated(
                uint256 nodeNum,
                uint256 prev,
                uint256 deadline,
                address asserter
            ) external onlyRollup {
                deliverToBridge(
                    abi.encodePacked(
                        CREATE_NODE_EVENT,
                        nodeNum,
                        prev,
                        block.number,
                        deadline,
                        uint256(uint160(bytes20(asserter)))
                    )
                );
            }
            function nodeConfirmed(uint256 nodeNum) external onlyRollup {
                deliverToBridge(abi.encodePacked(CONFIRM_NODE_EVENT, nodeNum));
            }
            function nodeRejected(uint256 nodeNum) external onlyRollup {
                deliverToBridge(abi.encodePacked(REJECT_NODE_EVENT, nodeNum));
            }
            function stakeCreated(address staker, uint256 nodeNum) external onlyRollup {
                deliverToBridge(
                    abi.encodePacked(
                        STAKE_CREATED_EVENT,
                        uint256(uint160(bytes20(staker))),
                        nodeNum,
                        block.number
                    )
                );
            }
            function deliverToBridge(bytes memory message) private {
                emit InboxMessageDelivered(
                    bridge.deliverMessageToInbox(
                        ROLLUP_PROTOCOL_EVENT_TYPE,
                        msg.sender,
                        keccak256(message)
                    ),
                    message
                );
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "./INode.sol";
        import "./IRollupCore.sol";
        import "./RollupLib.sol";
        import "./INodeFactory.sol";
        import "./RollupEventBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        import "@openzeppelin/contracts/math/SafeMath.sol";
        contract RollupCore is IRollupCore {
            using SafeMath for uint256;
            // Stakers become Zombies after losing a challenge
            struct Zombie {
                address stakerAddress;
                uint256 latestStakedNode;
            }
            struct Staker {
                uint256 index;
                uint256 latestStakedNode;
                uint256 amountStaked;
                // currentChallenge is 0 if staker is not in a challenge
                address currentChallenge;
                bool isStaked;
            }
            uint256 private _latestConfirmed;
            uint256 private _firstUnresolvedNode;
            uint256 private _latestNodeCreated;
            uint256 private _lastStakeBlock;
            mapping(uint256 => INode) private _nodes;
            mapping(uint256 => bytes32) private _nodeHashes;
            address payable[] private _stakerList;
            mapping(address => Staker) public override _stakerMap;
            Zombie[] private _zombies;
            mapping(address => uint256) private _withdrawableFunds;
            /**
             * @notice Get the address of the Node contract for the given node
             * @param nodeNum Index of the node
             * @return Address of the Node contract
             */
            function getNode(uint256 nodeNum) public view override returns (INode) {
                return _nodes[nodeNum];
            }
            /**
             * @notice Get the address of the staker at the given index
             * @param stakerNum Index of the staker
             * @return Address of the staker
             */
            function getStakerAddress(uint256 stakerNum) external view override returns (address) {
                return _stakerList[stakerNum];
            }
            /**
             * @notice Check whether the given staker is staked
             * @param staker Staker address to check
             * @return True or False for whether the staker was staked
             */
            function isStaked(address staker) public view override returns (bool) {
                return _stakerMap[staker].isStaked;
            }
            /**
             * @notice Get the latest staked node of the given staker
             * @param staker Staker address to lookup
             * @return Latest node staked of the staker
             */
            function latestStakedNode(address staker) public view override returns (uint256) {
                return _stakerMap[staker].latestStakedNode;
            }
            /**
             * @notice Get the current challenge of the given staker
             * @param staker Staker address to lookup
             * @return Current challenge of the staker
             */
            function currentChallenge(address staker) public view override returns (address) {
                return _stakerMap[staker].currentChallenge;
            }
            /**
             * @notice Get the amount staked of the given staker
             * @param staker Staker address to lookup
             * @return Amount staked of the staker
             */
            function amountStaked(address staker) public view override returns (uint256) {
                return _stakerMap[staker].amountStaked;
            }
            /**
             * @notice Get the original staker address of the zombie at the given index
             * @param zombieNum Index of the zombie to lookup
             * @return Original staker address of the zombie
             */
            function zombieAddress(uint256 zombieNum) public view override returns (address) {
                return _zombies[zombieNum].stakerAddress;
            }
            /**
             * @notice Get Latest node that the given zombie at the given index is staked on
             * @param zombieNum Index of the zombie to lookup
             * @return Latest node that the given zombie is staked on
             */
            function zombieLatestStakedNode(uint256 zombieNum) public view override returns (uint256) {
                return _zombies[zombieNum].latestStakedNode;
            }
            /// @return Current number of un-removed zombies
            function zombieCount() public view override returns (uint256) {
                return _zombies.length;
            }
            function isZombie(address staker) public view override returns (bool) {
                for (uint256 i = 0; i < _zombies.length; i++) {
                    if (staker == _zombies[i].stakerAddress) {
                        return true;
                    }
                }
                return false;
            }
            /**
             * @notice Get the amount of funds withdrawable by the given address
             * @param owner Address to check the funds of
             * @return Amount of funds withdrawable by owner
             */
            function withdrawableFunds(address owner) external view override returns (uint256) {
                return _withdrawableFunds[owner];
            }
            /**
             * @return Index of the first unresolved node
             * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
             */
            function firstUnresolvedNode() public view override returns (uint256) {
                return _firstUnresolvedNode;
            }
            /// @return Index of the latest confirmed node
            function latestConfirmed() public view override returns (uint256) {
                return _latestConfirmed;
            }
            /// @return Index of the latest rollup node created
            function latestNodeCreated() public view override returns (uint256) {
                return _latestNodeCreated;
            }
            /// @return Ethereum block that the most recent stake was created
            function lastStakeBlock() external view override returns (uint256) {
                return _lastStakeBlock;
            }
            /// @return Number of active stakers currently staked
            function stakerCount() public view override returns (uint256) {
                return _stakerList.length;
            }
            /**
             * @notice Initialize the core with an initial node
             * @param initialNode Initial node to start the chain with
             */
            function initializeCore(INode initialNode) internal {
                _nodes[0] = initialNode;
                _firstUnresolvedNode = 1;
            }
            /**
             * @notice React to a new node being created by storing it an incrementing the latest node counter
             * @param node Node that was newly created
             * @param nodeHash The hash of said node
             */
            function nodeCreated(INode node, bytes32 nodeHash) internal {
                _latestNodeCreated++;
                _nodes[_latestNodeCreated] = node;
                _nodeHashes[_latestNodeCreated] = nodeHash;
            }
            /// @return Node hash as of this node number
            function getNodeHash(uint256 index) public view override returns (bytes32) {
                return _nodeHashes[index];
            }
            /// @notice Reject the next unresolved node
            function _rejectNextNode() internal {
                destroyNode(_firstUnresolvedNode);
                _firstUnresolvedNode++;
            }
            /// @notice Confirm the next unresolved node
            function confirmNextNode(
                bytes32 beforeSendAcc,
                bytes calldata sendsData,
                uint256[] calldata sendLengths,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount,
                IOutbox outbox,
                RollupEventBridge rollupEventBridge
            ) internal {
                confirmNode(
                    _firstUnresolvedNode,
                    beforeSendAcc,
                    sendsData,
                    sendLengths,
                    afterSendCount,
                    afterLogAcc,
                    afterLogCount,
                    outbox,
                    rollupEventBridge
                );
            }
            function confirmNode(
                uint256 nodeNum,
                bytes32 beforeSendAcc,
                bytes calldata sendsData,
                uint256[] calldata sendLengths,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount,
                IOutbox outbox,
                RollupEventBridge rollupEventBridge
            ) internal {
                bytes32 afterSendAcc = RollupLib.feedAccumulator(sendsData, sendLengths, beforeSendAcc);
                INode node = getNode(nodeNum);
                // Authenticate data against node's confirm data pre-image
                require(
                    node.confirmData() ==
                        RollupLib.confirmHash(
                            beforeSendAcc,
                            afterSendAcc,
                            afterLogAcc,
                            afterSendCount,
                            afterLogCount
                        ),
                    "CONFIRM_DATA"
                );
                // trusted external call to outbox
                outbox.processOutgoingMessages(sendsData, sendLengths);
                destroyNode(_latestConfirmed);
                _latestConfirmed = nodeNum;
                _firstUnresolvedNode = nodeNum + 1;
                rollupEventBridge.nodeConfirmed(nodeNum);
                emit NodeConfirmed(nodeNum, afterSendAcc, afterSendCount, afterLogAcc, afterLogCount);
            }
            /**
             * @notice Create a new stake at latest confirmed node
             * @param stakerAddress Address of the new staker
             * @param depositAmount Stake amount of the new staker
             */
            function createNewStake(address payable stakerAddress, uint256 depositAmount) internal {
                uint256 stakerIndex = _stakerList.length;
                _stakerList.push(stakerAddress);
                _stakerMap[stakerAddress] = Staker(
                    stakerIndex,
                    _latestConfirmed,
                    depositAmount,
                    address(0), // new staker is not in challenge
                    true
                );
                _lastStakeBlock = block.number;
                emit UserStakeUpdated(stakerAddress, 0, depositAmount);
            }
            /**
             * @notice Check to see whether the two stakers are in the same challenge
             * @param stakerAddress1 Address of the first staker
             * @param stakerAddress2 Address of the second staker
             * @return Address of the challenge that the two stakers are in
             */
            function inChallenge(address stakerAddress1, address stakerAddress2)
                internal
                view
                returns (address)
            {
                Staker storage staker1 = _stakerMap[stakerAddress1];
                Staker storage staker2 = _stakerMap[stakerAddress2];
                address challenge = staker1.currentChallenge;
                require(challenge != address(0), "NO_CHAL");
                require(challenge == staker2.currentChallenge, "DIFF_IN_CHAL");
                return challenge;
            }
            /**
             * @notice Make the given staker as not being in a challenge
             * @param stakerAddress Address of the staker to remove from a challenge
             */
            function clearChallenge(address stakerAddress) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                staker.currentChallenge = address(0);
            }
            /**
             * @notice Mark both the given stakers as engaged in the challenge
             * @param staker1 Address of the first staker
             * @param staker2 Address of the second staker
             * @param challenge Address of the challenge both stakers are now in
             */
            function challengeStarted(
                address staker1,
                address staker2,
                address challenge
            ) internal {
                _stakerMap[staker1].currentChallenge = challenge;
                _stakerMap[staker2].currentChallenge = challenge;
            }
            /**
             * @notice Add to the stake of the given staker by the given amount
             * @param stakerAddress Address of the staker to increase the stake of
             * @param amountAdded Amount of stake to add to the staker
             */
            function increaseStakeBy(address stakerAddress, uint256 amountAdded) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 initialStaked = staker.amountStaked;
                uint256 finalStaked = initialStaked.add(amountAdded);
                staker.amountStaked = finalStaked;
                emit UserStakeUpdated(stakerAddress, initialStaked, finalStaked);
            }
            /**
             * @notice Reduce the stake of the given staker to the given target
             * @param stakerAddress Address of the staker to reduce the stake of
             * @param target Amount of stake to leave with the staker
             * @return Amount of value released from the stake
             */
            function reduceStakeTo(address stakerAddress, uint256 target) internal returns (uint256) {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 current = staker.amountStaked;
                require(target <= current, "TOO_LITTLE_STAKE");
                uint256 amountWithdrawn = current.sub(target);
                staker.amountStaked = target;
                increaseWithdrawableFunds(stakerAddress, amountWithdrawn);
                emit UserStakeUpdated(stakerAddress, current, target);
                return amountWithdrawn;
            }
            /**
             * @notice Remove the given staker and turn them into a zombie
             * @param stakerAddress Address of the staker to remove
             */
            function turnIntoZombie(address stakerAddress) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                _zombies.push(Zombie(stakerAddress, staker.latestStakedNode));
                deleteStaker(stakerAddress);
            }
            /**
             * @notice Update the latest staked node of the zombie at the given index
             * @param zombieNum Index of the zombie to move
             * @param latest New latest node the zombie is staked on
             */
            function zombieUpdateLatestStakedNode(uint256 zombieNum, uint256 latest) internal {
                _zombies[zombieNum].latestStakedNode = latest;
            }
            /**
             * @notice Remove the zombie at the given index
             * @param zombieNum Index of the zombie to remove
             */
            function removeZombie(uint256 zombieNum) internal {
                _zombies[zombieNum] = _zombies[_zombies.length - 1];
                _zombies.pop();
            }
            /**
             * @notice Remove the given staker and return their stake
             * @param stakerAddress Address of the staker withdrawing their stake
             */
            function withdrawStaker(address stakerAddress) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 initialStaked = staker.amountStaked;
                increaseWithdrawableFunds(stakerAddress, initialStaked);
                deleteStaker(stakerAddress);
                emit UserStakeUpdated(stakerAddress, initialStaked, 0);
            }
            /**
             * @notice Advance the given staker to the given node
             * @param stakerAddress Address of the staker adding their stake
             * @param nodeNum Index of the node to stake on
             */
            function stakeOnNode(
                address stakerAddress,
                uint256 nodeNum,
                uint256 confirmPeriodBlocks
            ) internal {
                Staker storage staker = _stakerMap[stakerAddress];
                INode node = _nodes[nodeNum];
                uint256 newStakerCount = node.addStaker(stakerAddress);
                staker.latestStakedNode = nodeNum;
                if (newStakerCount == 1) {
                    INode parent = _nodes[node.prev()];
                    parent.newChildConfirmDeadline(block.number.add(confirmPeriodBlocks));
                }
            }
            /**
             * @notice Clear the withdrawable funds for the given address
             * @param owner Address of the account to remove funds from
             * @return Amount of funds removed from account
             */
            function withdrawFunds(address owner) internal returns (uint256) {
                uint256 amount = _withdrawableFunds[owner];
                _withdrawableFunds[owner] = 0;
                emit UserWithdrawableFundsUpdated(owner, amount, 0);
                return amount;
            }
            /**
             * @notice Increase the withdrawable funds for the given address
             * @param owner Address of the account to add withdrawable funds to
             */
            function increaseWithdrawableFunds(address owner, uint256 amount) internal {
                uint256 initialWithdrawable = _withdrawableFunds[owner];
                uint256 finalWithdrawable = initialWithdrawable.add(amount);
                _withdrawableFunds[owner] = finalWithdrawable;
                emit UserWithdrawableFundsUpdated(owner, initialWithdrawable, finalWithdrawable);
            }
            /**
             * @notice Remove the given staker
             * @param stakerAddress Address of the staker to remove
             */
            function deleteStaker(address stakerAddress) private {
                Staker storage staker = _stakerMap[stakerAddress];
                uint256 stakerIndex = staker.index;
                _stakerList[stakerIndex] = _stakerList[_stakerList.length - 1];
                _stakerMap[_stakerList[stakerIndex]].index = stakerIndex;
                _stakerList.pop();
                delete _stakerMap[stakerAddress];
            }
            /**
             * @notice Destroy the given node and clear out its address
             * @param nodeNum Index of the node to remove
             */
            function destroyNode(uint256 nodeNum) internal {
                _nodes[nodeNum].destroy();
                _nodes[nodeNum] = INode(0);
            }
            function nodeDeadline(
                uint256 avmGasSpeedLimitPerBlock,
                uint256 gasUsed,
                uint256 confirmPeriodBlocks,
                INode prevNode
            ) internal view returns (uint256 deadlineBlock) {
                // Set deadline rounding up to the nearest block
                uint256 checkTime =
                    gasUsed.add(avmGasSpeedLimitPerBlock.sub(1)).div(avmGasSpeedLimitPerBlock);
                deadlineBlock = max(block.number.add(confirmPeriodBlocks), prevNode.deadlineBlock()).add(
                    checkTime
                );
                uint256 olderSibling = prevNode.latestChildNumber();
                if (olderSibling != 0) {
                    deadlineBlock = max(deadlineBlock, getNode(olderSibling).deadlineBlock());
                }
                return deadlineBlock;
            }
            function max(uint256 a, uint256 b) internal pure returns (uint256) {
                return a > b ? a : b;
            }
            struct StakeOnNewNodeFrame {
                uint256 currentInboxSize;
                INode node;
                bytes32 executionHash;
                INode prevNode;
                bytes32 lastHash;
                bool hasSibling;
                uint256 deadlineBlock;
                uint256 gasUsed;
                uint256 sequencerBatchEnd;
                bytes32 sequencerBatchAcc;
            }
            struct CreateNodeDataFrame {
                uint256 prevNode;
                uint256 confirmPeriodBlocks;
                uint256 avmGasSpeedLimitPerBlock;
                ISequencerInbox sequencerInbox;
                RollupEventBridge rollupEventBridge;
                INodeFactory nodeFactory;
            }
            uint8 internal constant MAX_SEND_COUNT = 100;
            function createNewNode(
                RollupLib.Assertion memory assertion,
                bytes32[3][2] calldata assertionBytes32Fields,
                uint256[4][2] calldata assertionIntFields,
                bytes calldata sequencerBatchProof,
                CreateNodeDataFrame memory inputDataFrame,
                bytes32 expectedNodeHash
            ) internal returns (bytes32 newNodeHash) {
                StakeOnNewNodeFrame memory memoryFrame;
                {
                    // validate data
                    memoryFrame.gasUsed = RollupLib.assertionGasUsed(assertion);
                    memoryFrame.prevNode = getNode(inputDataFrame.prevNode);
                    memoryFrame.currentInboxSize = inputDataFrame.sequencerInbox.messageCount();
                    // Make sure the previous state is correct against the node being built on
                    require(
                        RollupLib.stateHash(assertion.beforeState) == memoryFrame.prevNode.stateHash(),
                        "PREV_STATE_HASH"
                    );
                    // Ensure that the assertion doesn't read past the end of the current inbox
                    require(
                        assertion.afterState.inboxCount <= memoryFrame.currentInboxSize,
                        "INBOX_PAST_END"
                    );
                    // Insure inbox tip after assertion is included in a sequencer-inbox batch and return inbox acc; this gives replay protection against the state of the inbox
                    (memoryFrame.sequencerBatchEnd, memoryFrame.sequencerBatchAcc) = inputDataFrame
                        .sequencerInbox
                        .proveInboxContainsMessage(sequencerBatchProof, assertion.afterState.inboxCount);
                }
                {
                    memoryFrame.executionHash = RollupLib.executionHash(assertion);
                    memoryFrame.deadlineBlock = nodeDeadline(
                        inputDataFrame.avmGasSpeedLimitPerBlock,
                        memoryFrame.gasUsed,
                        inputDataFrame.confirmPeriodBlocks,
                        memoryFrame.prevNode
                    );
                    memoryFrame.hasSibling = memoryFrame.prevNode.latestChildNumber() > 0;
                    // here we don't use ternacy operator to remain compatible with slither
                    if (memoryFrame.hasSibling) {
                        memoryFrame.lastHash = getNodeHash(memoryFrame.prevNode.latestChildNumber());
                    } else {
                        memoryFrame.lastHash = getNodeHash(inputDataFrame.prevNode);
                    }
                    memoryFrame.node = INode(
                        inputDataFrame.nodeFactory.createNode(
                            RollupLib.stateHash(assertion.afterState),
                            RollupLib.challengeRoot(assertion, memoryFrame.executionHash, block.number),
                            RollupLib.confirmHash(assertion),
                            inputDataFrame.prevNode,
                            memoryFrame.deadlineBlock
                        )
                    );
                }
                {
                    uint256 nodeNum = latestNodeCreated() + 1;
                    memoryFrame.prevNode.childCreated(nodeNum);
                    newNodeHash = RollupLib.nodeHash(
                        memoryFrame.hasSibling,
                        memoryFrame.lastHash,
                        memoryFrame.executionHash,
                        memoryFrame.sequencerBatchAcc
                    );
                    require(newNodeHash == expectedNodeHash, "UNEXPECTED_NODE_HASH");
                    nodeCreated(memoryFrame.node, newNodeHash);
                    inputDataFrame.rollupEventBridge.nodeCreated(
                        nodeNum,
                        inputDataFrame.prevNode,
                        memoryFrame.deadlineBlock,
                        msg.sender
                    );
                }
                emit NodeCreated(
                    latestNodeCreated(),
                    getNodeHash(inputDataFrame.prevNode),
                    newNodeHash,
                    memoryFrame.executionHash,
                    memoryFrame.currentInboxSize,
                    memoryFrame.sequencerBatchEnd,
                    memoryFrame.sequencerBatchAcc,
                    assertionBytes32Fields,
                    assertionIntFields
                );
                return newNodeHash;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "../challenge/ChallengeLib.sol";
        import "./INode.sol";
        import "@openzeppelin/contracts/math/SafeMath.sol";
        library RollupLib {
            using SafeMath for uint256;
            struct Config {
                bytes32 machineHash;
                uint256 confirmPeriodBlocks;
                uint256 extraChallengeTimeBlocks;
                uint256 avmGasSpeedLimitPerBlock;
                uint256 baseStake;
                address stakeToken;
                address owner;
                address sequencer;
                uint256 sequencerDelayBlocks;
                uint256 sequencerDelaySeconds;
                bytes extraConfig;
            }
            struct ExecutionState {
                uint256 gasUsed;
                bytes32 machineHash;
                uint256 inboxCount;
                uint256 sendCount;
                uint256 logCount;
                bytes32 sendAcc;
                bytes32 logAcc;
                uint256 proposedBlock;
                uint256 inboxMaxCount;
            }
            function stateHash(ExecutionState memory execState) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            execState.gasUsed,
                            execState.machineHash,
                            execState.inboxCount,
                            execState.sendCount,
                            execState.logCount,
                            execState.sendAcc,
                            execState.logAcc,
                            execState.proposedBlock,
                            execState.inboxMaxCount
                        )
                    );
            }
            struct Assertion {
                ExecutionState beforeState;
                ExecutionState afterState;
            }
            function decodeExecutionState(
                bytes32[3] memory bytes32Fields,
                uint256[4] memory intFields,
                uint256 proposedBlock,
                uint256 inboxMaxCount
            ) internal pure returns (ExecutionState memory) {
                return
                    ExecutionState(
                        intFields[0],
                        bytes32Fields[0],
                        intFields[1],
                        intFields[2],
                        intFields[3],
                        bytes32Fields[1],
                        bytes32Fields[2],
                        proposedBlock,
                        inboxMaxCount
                    );
            }
            function decodeAssertion(
                bytes32[3][2] memory bytes32Fields,
                uint256[4][2] memory intFields,
                uint256 beforeProposedBlock,
                uint256 beforeInboxMaxCount,
                uint256 inboxMaxCount
            ) internal view returns (Assertion memory) {
                return
                    Assertion(
                        decodeExecutionState(
                            bytes32Fields[0],
                            intFields[0],
                            beforeProposedBlock,
                            beforeInboxMaxCount
                        ),
                        decodeExecutionState(bytes32Fields[1], intFields[1], block.number, inboxMaxCount)
                    );
            }
            function executionStateChallengeHash(ExecutionState memory state)
                internal
                pure
                returns (bytes32)
            {
                return
                    ChallengeLib.assertionHash(
                        state.gasUsed,
                        ChallengeLib.assertionRestHash(
                            state.inboxCount,
                            state.machineHash,
                            state.sendAcc,
                            state.sendCount,
                            state.logAcc,
                            state.logCount
                        )
                    );
            }
            function executionHash(Assertion memory assertion) internal pure returns (bytes32) {
                return
                    ChallengeLib.bisectionChunkHash(
                        assertion.beforeState.gasUsed,
                        assertion.afterState.gasUsed - assertion.beforeState.gasUsed,
                        RollupLib.executionStateChallengeHash(assertion.beforeState),
                        RollupLib.executionStateChallengeHash(assertion.afterState)
                    );
            }
            function assertionGasUsed(RollupLib.Assertion memory assertion)
                internal
                pure
                returns (uint256)
            {
                return assertion.afterState.gasUsed.sub(assertion.beforeState.gasUsed);
            }
            function challengeRoot(
                Assertion memory assertion,
                bytes32 assertionExecHash,
                uint256 blockProposed
            ) internal pure returns (bytes32) {
                return challengeRootHash(assertionExecHash, blockProposed, assertion.afterState.inboxCount);
            }
            function challengeRootHash(
                bytes32 execution,
                uint256 proposedTime,
                uint256 maxMessageCount
            ) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(execution, proposedTime, maxMessageCount));
            }
            function confirmHash(Assertion memory assertion) internal pure returns (bytes32) {
                return
                    confirmHash(
                        assertion.beforeState.sendAcc,
                        assertion.afterState.sendAcc,
                        assertion.afterState.logAcc,
                        assertion.afterState.sendCount,
                        assertion.afterState.logCount
                    );
            }
            function confirmHash(
                bytes32 beforeSendAcc,
                bytes32 afterSendAcc,
                bytes32 afterLogAcc,
                uint256 afterSendCount,
                uint256 afterLogCount
            ) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            beforeSendAcc,
                            afterSendAcc,
                            afterSendCount,
                            afterLogAcc,
                            afterLogCount
                        )
                    );
            }
            function feedAccumulator(
                bytes memory messageData,
                uint256[] memory messageLengths,
                bytes32 beforeAcc
            ) internal pure returns (bytes32) {
                uint256 offset = 0;
                uint256 messageCount = messageLengths.length;
                uint256 dataLength = messageData.length;
                bytes32 messageAcc = beforeAcc;
                for (uint256 i = 0; i < messageCount; i++) {
                    uint256 messageLength = messageLengths[i];
                    require(offset + messageLength <= dataLength, "DATA_OVERRUN");
                    bytes32 messageHash;
                    assembly {
                        messageHash := keccak256(add(messageData, add(offset, 32)), messageLength)
                    }
                    messageAcc = keccak256(abi.encodePacked(messageAcc, messageHash));
                    offset += messageLength;
                }
                require(offset == dataLength, "DATA_LENGTH");
                return messageAcc;
            }
            function nodeHash(
                bool hasSibling,
                bytes32 lastHash,
                bytes32 assertionExecHash,
                bytes32 inboxAcc
            ) internal pure returns (bytes32) {
                uint8 hasSiblingInt = hasSibling ? 1 : 0;
                return keccak256(abi.encodePacked(hasSiblingInt, lastHash, assertionExecHash, inboxAcc));
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        interface INode {
            function initialize(
                address _rollup,
                bytes32 _stateHash,
                bytes32 _challengeHash,
                bytes32 _confirmData,
                uint256 _prev,
                uint256 _deadlineBlock
            ) external;
            function destroy() external;
            function addStaker(address staker) external returns (uint256);
            function removeStaker(address staker) external;
            function childCreated(uint256) external;
            function newChildConfirmDeadline(uint256 deadline) external;
            function stateHash() external view returns (bytes32);
            function challengeHash() external view returns (bytes32);
            function confirmData() external view returns (bytes32);
            function prev() external view returns (uint256);
            function deadlineBlock() external view returns (uint256);
            function noChildConfirmedBeforeBlock() external view returns (uint256);
            function stakerCount() external view returns (uint256);
            function stakers(address staker) external view returns (bool);
            function firstChildBlock() external view returns (uint256);
            function latestChildNumber() external view returns (uint256);
            function requirePastDeadline() external view;
            function requirePastChildConfirmDeadline() external view;
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        interface INodeFactory {
            function createNode(
                bytes32 _stateHash,
                bytes32 _challengeHash,
                bytes32 _confirmData,
                uint256 _prev,
                uint256 _deadlineBlock
            ) external returns (address);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        import "../arch/IOneStepProof.sol";
        interface IChallenge {
            function initializeChallenge(
                IOneStepProof[] calldata _executors,
                address _resultReceiver,
                bytes32 _executionHash,
                uint256 _maxMessageCount,
                address _asserter,
                address _challenger,
                uint256 _asserterTimeLeft,
                uint256 _challengerTimeLeft,
                ISequencerInbox _sequencerBridge,
                IBridge _delayedBridge
            ) external;
            function currentResponderTimeLeft() external view returns (uint256);
            function lastMoveBlock() external view returns (uint256);
            function timeout() external;
            function asserter() external view returns (address);
            function challenger() external view returns (address);
            function clearChallenge() external;
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        interface IChallengeFactory {
            function createChallenge(
                address _resultReceiver,
                bytes32 _executionHash,
                uint256 _maxMessageCount,
                address _asserter,
                address _challenger,
                uint256 _asserterTimeLeft,
                uint256 _challengerTimeLeft,
                ISequencerInbox _sequencerBridge,
                IBridge _delayedBridge
            ) external returns (address);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        interface IOutbox {
            event OutboxEntryCreated(
                uint256 indexed batchNum,
                uint256 outboxEntryIndex,
                bytes32 outputRoot,
                uint256 numInBatch
            );
            event OutBoxTransactionExecuted(
                address indexed destAddr,
                address indexed l2Sender,
                uint256 indexed outboxEntryIndex,
                uint256 transactionIndex
            );
            function l2ToL1Sender() external view returns (address);
            function l2ToL1Block() external view returns (uint256);
            function l2ToL1EthBlock() external view returns (uint256);
            function l2ToL1Timestamp() external view returns (uint256);
            function l2ToL1BatchNum() external view returns (uint256);
            function l2ToL1OutputId() external view returns (bytes32);
            function processOutgoingMessages(bytes calldata sendsData, uint256[] calldata sendLengths)
                external;
            function outboxEntryExists(uint256 batchNum) external view returns (bool);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        library ProxyUtil {
            function getProxyAdmin() internal view returns (address admin) {
                // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/proxy/TransparentUpgradeableProxy.sol#L48
                // Storage slot with the admin of the proxy contract.
                // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
                bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                assembly {
                    admin := sload(slot)
                }
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "../INode.sol";
        import "../../bridge/interfaces/IOutbox.sol";
        interface IRollupUser {
            function initialize(address _stakeToken) external;
            function completeChallenge(address winningStaker, address losingStaker) external;
            function returnOldDeposit(address stakerAddress) external;
            function requireUnresolved(uint256 nodeNum) external view;
            function requireUnresolvedExists() external view;
            function countStakedZombies(INode node) external view returns (uint256);
        }
        interface IRollupAdmin {
            event OwnerFunctionCalled(uint256 indexed id);
            /**
             * @notice Add a contract authorized to put messages into this rollup's inbox
             * @param _outbox Outbox contract to add
             */
            function setOutbox(IOutbox _outbox) external;
            /**
             * @notice Disable an old outbox from interacting with the bridge
             * @param _outbox Outbox contract to remove
             */
            function removeOldOutbox(address _outbox) external;
            /**
             * @notice Enable or disable an inbox contract
             * @param _inbox Inbox contract to add or remove
             * @param _enabled New status of inbox
             */
            function setInbox(address _inbox, bool _enabled) external;
            /**
             * @notice Pause interaction with the rollup contract
             */
            function pause() external;
            /**
             * @notice Resume interaction with the rollup contract
             */
            function resume() external;
            /**
             * @notice Set the addresses of rollup logic facets called
             * @param newAdminFacet address of logic that owner of rollup calls
             * @param newUserFacet ddress of logic that user of rollup calls
             */
            function setFacets(address newAdminFacet, address newUserFacet) external;
            /**
             * @notice Set the addresses of the validator whitelist
             * @dev It is expected that both arrays are same length, and validator at
             * position i corresponds to the value at position i
             * @param _validator addresses to set in the whitelist
             * @param _val value to set in the whitelist for corresponding address
             */
            function setValidator(address[] memory _validator, bool[] memory _val) external;
            /**
             * @notice Set a new owner address for the rollup
             * @param newOwner address of new rollup owner
             */
            function setOwner(address newOwner) external;
            /**
             * @notice Set minimum assertion period for the rollup
             * @param newPeriod new minimum period for assertions
             */
            function setMinimumAssertionPeriod(uint256 newPeriod) external;
            /**
             * @notice Set number of blocks until a node is considered confirmed
             * @param newConfirmPeriod new number of blocks until a node is confirmed
             */
            function setConfirmPeriodBlocks(uint256 newConfirmPeriod) external;
            /**
             * @notice Set number of extra blocks after a challenge
             * @param newExtraTimeBlocks new number of blocks
             */
            function setExtraChallengeTimeBlocks(uint256 newExtraTimeBlocks) external;
            /**
             * @notice Set speed limit per block
             * @param newAvmGasSpeedLimitPerBlock maximum avmgas to be used per block
             */
            function setAvmGasSpeedLimitPerBlock(uint256 newAvmGasSpeedLimitPerBlock) external;
            /**
             * @notice Set base stake required for an assertion
             * @param newBaseStake maximum avmgas to be used per block
             */
            function setBaseStake(uint256 newBaseStake) external;
            /**
             * @notice Set the token used for stake, where address(0) == eth
             * @dev Before changing the base stake token, you might need to change the
             * implementation of the Rollup User facet!
             * @param newStakeToken address of token used for staking
             */
            function setStakeToken(address newStakeToken) external;
            /**
             * @notice Set max delay for sequencer inbox
             * @param newSequencerInboxMaxDelayBlocks max number of blocks
             * @param newSequencerInboxMaxDelaySeconds max number of seconds
             */
            function setSequencerInboxMaxDelay(
                uint256 newSequencerInboxMaxDelayBlocks,
                uint256 newSequencerInboxMaxDelaySeconds
            ) external;
            /**
             * @notice Set execution bisection degree
             * @param newChallengeExecutionBisectionDegree execution bisection degree
             */
            function setChallengeExecutionBisectionDegree(uint256 newChallengeExecutionBisectionDegree)
                external;
            /**
             * @notice Updates a whitelist address for its consumers
             * @dev setting the newWhitelist to address(0) disables it for consumers
             * @param whitelist old whitelist to be deprecated
             * @param newWhitelist new whitelist to be used
             * @param targets whitelist consumers to be triggered
             */
            function updateWhitelistConsumers(
                address whitelist,
                address newWhitelist,
                address[] memory targets
            ) external;
            /**
             * @notice Updates a whitelist's entries
             * @dev user at position i will be assigned value i
             * @param whitelist whitelist to be updated
             * @param user users to be updated in the whitelist
             * @param val if user is or not allowed in the whitelist
             */
            function setWhitelistEntries(
                address whitelist,
                address[] memory user,
                bool[] memory val
            ) external;
            /**
             * @notice Updates whether an address is a sequencer at the sequencer inbox
             * @param newSequencer address to be modified
             * @param isSequencer whether this address should be authorized as a sequencer
             */
            function setIsSequencer(address newSequencer, bool isSequencer) external;
            /**
             * @notice Upgrades the implementation of a beacon controlled by the rollup
             * @param beacon address of beacon to be upgraded
             * @param newImplementation new address of implementation
             */
            function upgradeBeacon(address beacon, address newImplementation) external;
            function forceResolveChallenge(address[] memory stackerA, address[] memory stackerB) external;
            function forceRefundStaker(address[] memory stacker) external;
            function forceCreateNode(
                bytes32 expectedNodeHash,
                bytes32[3][2] calldata assertionBytes32Fields,
                uint256[4][2] calldata assertionIntFields,
                bytes calldata sequencerBatchProof,
                uint256 beforeProposedBlock,
                uint256 beforeInboxMaxCount,
                uint256 prevNode
            ) external;
            function forceConfirmNode(
                uint256 nodeNum,
                bytes32 beforeSendAcc,
                bytes calldata sendsData,
                uint256[] calldata sendLengths,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount
            ) external;
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        /*
         * @dev Provides information about the current execution context, including the
         * sender of the transaction and its data. While these are generally available
         * via msg.sender and msg.data, they should not be accessed in such a direct
         * manner, since when dealing with GSN meta-transactions the account sending and
         * paying for execution may not be the actual sender (as far as an application
         * is concerned).
         *
         * This contract is only required for intermediate, library-like contracts.
         */
        abstract contract Context {
            function _msgSender() internal view virtual returns (address payable) {
                return msg.sender;
            }
            function _msgData() internal view virtual returns (bytes memory) {
                this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
                return msg.data;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        interface IMessageProvider {
            event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
            event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "./INode.sol";
        interface IRollupCore {
            function _stakerMap(address stakerAddress)
                external
                view
                returns (
                    uint256,
                    uint256,
                    uint256,
                    address,
                    bool
                );
            event RollupCreated(bytes32 machineHash);
            event NodeCreated(
                uint256 indexed nodeNum,
                bytes32 indexed parentNodeHash,
                bytes32 nodeHash,
                bytes32 executionHash,
                uint256 inboxMaxCount,
                uint256 afterInboxBatchEndCount,
                bytes32 afterInboxBatchAcc,
                bytes32[3][2] assertionBytes32Fields,
                uint256[4][2] assertionIntFields
            );
            event NodeConfirmed(
                uint256 indexed nodeNum,
                bytes32 afterSendAcc,
                uint256 afterSendCount,
                bytes32 afterLogAcc,
                uint256 afterLogCount
            );
            event NodeRejected(uint256 indexed nodeNum);
            event RollupChallengeStarted(
                address indexed challengeContract,
                address asserter,
                address challenger,
                uint256 challengedNode
            );
            event UserStakeUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance);
            event UserWithdrawableFundsUpdated(
                address indexed user,
                uint256 initialBalance,
                uint256 finalBalance
            );
            function getNode(uint256 nodeNum) external view returns (INode);
            /**
             * @notice Get the address of the staker at the given index
             * @param stakerNum Index of the staker
             * @return Address of the staker
             */
            function getStakerAddress(uint256 stakerNum) external view returns (address);
            /**
             * @notice Check whether the given staker is staked
             * @param staker Staker address to check
             * @return True or False for whether the staker was staked
             */
            function isStaked(address staker) external view returns (bool);
            /**
             * @notice Get the latest staked node of the given staker
             * @param staker Staker address to lookup
             * @return Latest node staked of the staker
             */
            function latestStakedNode(address staker) external view returns (uint256);
            /**
             * @notice Get the current challenge of the given staker
             * @param staker Staker address to lookup
             * @return Current challenge of the staker
             */
            function currentChallenge(address staker) external view returns (address);
            /**
             * @notice Get the amount staked of the given staker
             * @param staker Staker address to lookup
             * @return Amount staked of the staker
             */
            function amountStaked(address staker) external view returns (uint256);
            /**
             * @notice Get the original staker address of the zombie at the given index
             * @param zombieNum Index of the zombie to lookup
             * @return Original staker address of the zombie
             */
            function zombieAddress(uint256 zombieNum) external view returns (address);
            /**
             * @notice Get Latest node that the given zombie at the given index is staked on
             * @param zombieNum Index of the zombie to lookup
             * @return Latest node that the given zombie is staked on
             */
            function zombieLatestStakedNode(uint256 zombieNum) external view returns (uint256);
            /// @return Current number of un-removed zombies
            function zombieCount() external view returns (uint256);
            function isZombie(address staker) external view returns (bool);
            /**
             * @notice Get the amount of funds withdrawable by the given address
             * @param owner Address to check the funds of
             * @return Amount of funds withdrawable by owner
             */
            function withdrawableFunds(address owner) external view returns (uint256);
            /**
             * @return Index of the first unresolved node
             * @dev If all nodes have been resolved, this will be latestNodeCreated + 1
             */
            function firstUnresolvedNode() external view returns (uint256);
            /// @return Index of the latest confirmed node
            function latestConfirmed() external view returns (uint256);
            /// @return Index of the latest rollup node created
            function latestNodeCreated() external view returns (uint256);
            /// @return Ethereum block that the most recent stake was created
            function lastStakeBlock() external view returns (uint256);
            /// @return Number of active stakers currently staked
            function stakerCount() external view returns (uint256);
            /// @return Node hash as of this node number
            function getNodeHash(uint256 index) external view returns (bytes32);
        }
        // SPDX-License-Identifier: MIT
        pragma solidity >=0.6.0 <0.8.0;
        /**
         * @dev Wrappers over Solidity's arithmetic operations with added overflow
         * checks.
         *
         * Arithmetic operations in Solidity wrap on overflow. This can easily result
         * in bugs, because programmers usually assume that an overflow raises an
         * error, which is the standard behavior in high level programming languages.
         * `SafeMath` restores this intuition by reverting the transaction when an
         * operation overflows.
         *
         * Using this library instead of the unchecked operations eliminates an entire
         * class of bugs, so it's recommended to use it always.
         */
        library SafeMath {
            /**
             * @dev Returns the addition of two unsigned integers, with an overflow flag.
             *
             * _Available since v3.4._
             */
            function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                uint256 c = a + b;
                if (c < a) return (false, 0);
                return (true, c);
            }
            /**
             * @dev Returns the substraction of two unsigned integers, with an overflow flag.
             *
             * _Available since v3.4._
             */
            function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                if (b > a) return (false, 0);
                return (true, a - b);
            }
            /**
             * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
             *
             * _Available since v3.4._
             */
            function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
                // benefit is lost if 'b' is also tested.
                // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
                if (a == 0) return (true, 0);
                uint256 c = a * b;
                if (c / a != b) return (false, 0);
                return (true, c);
            }
            /**
             * @dev Returns the division of two unsigned integers, with a division by zero flag.
             *
             * _Available since v3.4._
             */
            function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                if (b == 0) return (false, 0);
                return (true, a / b);
            }
            /**
             * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
             *
             * _Available since v3.4._
             */
            function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
                if (b == 0) return (false, 0);
                return (true, a % b);
            }
            /**
             * @dev Returns the addition of two unsigned integers, reverting on
             * overflow.
             *
             * Counterpart to Solidity's `+` operator.
             *
             * Requirements:
             *
             * - Addition cannot overflow.
             */
            function add(uint256 a, uint256 b) internal pure returns (uint256) {
                uint256 c = a + b;
                require(c >= a, "SafeMath: addition overflow");
                return c;
            }
            /**
             * @dev Returns the subtraction of two unsigned integers, reverting on
             * overflow (when the result is negative).
             *
             * Counterpart to Solidity's `-` operator.
             *
             * Requirements:
             *
             * - Subtraction cannot overflow.
             */
            function sub(uint256 a, uint256 b) internal pure returns (uint256) {
                require(b <= a, "SafeMath: subtraction overflow");
                return a - b;
            }
            /**
             * @dev Returns the multiplication of two unsigned integers, reverting on
             * overflow.
             *
             * Counterpart to Solidity's `*` operator.
             *
             * Requirements:
             *
             * - Multiplication cannot overflow.
             */
            function mul(uint256 a, uint256 b) internal pure returns (uint256) {
                if (a == 0) return 0;
                uint256 c = a * b;
                require(c / a == b, "SafeMath: multiplication overflow");
                return c;
            }
            /**
             * @dev Returns the integer division of two unsigned integers, reverting on
             * division by zero. The result is rounded towards zero.
             *
             * Counterpart to Solidity's `/` operator. Note: this function uses a
             * `revert` opcode (which leaves remaining gas untouched) while Solidity
             * uses an invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function div(uint256 a, uint256 b) internal pure returns (uint256) {
                require(b > 0, "SafeMath: division by zero");
                return a / b;
            }
            /**
             * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
             * reverting when dividing by zero.
             *
             * Counterpart to Solidity's `%` operator. This function uses a `revert`
             * opcode (which leaves remaining gas untouched) while Solidity uses an
             * invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function mod(uint256 a, uint256 b) internal pure returns (uint256) {
                require(b > 0, "SafeMath: modulo by zero");
                return a % b;
            }
            /**
             * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
             * overflow (when the result is negative).
             *
             * CAUTION: This function is deprecated because it requires allocating memory for the error
             * message unnecessarily. For custom revert reasons use {trySub}.
             *
             * Counterpart to Solidity's `-` operator.
             *
             * Requirements:
             *
             * - Subtraction cannot overflow.
             */
            function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
                require(b <= a, errorMessage);
                return a - b;
            }
            /**
             * @dev Returns the integer division of two unsigned integers, reverting with custom message on
             * division by zero. The result is rounded towards zero.
             *
             * CAUTION: This function is deprecated because it requires allocating memory for the error
             * message unnecessarily. For custom revert reasons use {tryDiv}.
             *
             * Counterpart to Solidity's `/` operator. Note: this function uses a
             * `revert` opcode (which leaves remaining gas untouched) while Solidity
             * uses an invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
                require(b > 0, errorMessage);
                return a / b;
            }
            /**
             * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
             * reverting with custom message when dividing by zero.
             *
             * CAUTION: This function is deprecated because it requires allocating memory for the error
             * message unnecessarily. For custom revert reasons use {tryMod}.
             *
             * Counterpart to Solidity's `%` operator. This function uses a `revert`
             * opcode (which leaves remaining gas untouched) while Solidity uses an
             * invalid opcode to revert (consuming all remaining gas).
             *
             * Requirements:
             *
             * - The divisor cannot be zero.
             */
            function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
                require(b > 0, errorMessage);
                return a % b;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "../libraries/MerkleLib.sol";
        import "@openzeppelin/contracts/math/SafeMath.sol";
        library ChallengeLib {
            using SafeMath for uint256;
            function firstSegmentSize(uint256 totalCount, uint256 bisectionCount)
                internal
                pure
                returns (uint256)
            {
                return totalCount / bisectionCount + (totalCount % bisectionCount);
            }
            function otherSegmentSize(uint256 totalCount, uint256 bisectionCount)
                internal
                pure
                returns (uint256)
            {
                return totalCount / bisectionCount;
            }
            function bisectionChunkHash(
                uint256 _segmentStart,
                uint256 _segmentLength,
                bytes32 _startHash,
                bytes32 _endHash
            ) internal pure returns (bytes32) {
                return keccak256(abi.encodePacked(_segmentStart, _segmentLength, _startHash, _endHash));
            }
            function assertionHash(uint256 _avmGasUsed, bytes32 _restHash) internal pure returns (bytes32) {
                // Note: make sure this doesn't return Challenge.UNREACHABLE_ASSERTION (currently 0)
                return keccak256(abi.encodePacked(_avmGasUsed, _restHash));
            }
            function assertionRestHash(
                uint256 _totalMessagesRead,
                bytes32 _machineState,
                bytes32 _sendAcc,
                uint256 _sendCount,
                bytes32 _logAcc,
                uint256 _logCount
            ) internal pure returns (bytes32) {
                return
                    keccak256(
                        abi.encodePacked(
                            _totalMessagesRead,
                            _machineState,
                            _sendAcc,
                            _sendCount,
                            _logAcc,
                            _logCount
                        )
                    );
            }
            function updatedBisectionRoot(
                bytes32[] memory _chainHashes,
                uint256 _challengedSegmentStart,
                uint256 _challengedSegmentLength
            ) internal pure returns (bytes32) {
                uint256 bisectionCount = _chainHashes.length - 1;
                bytes32[] memory hashes = new bytes32[](bisectionCount);
                uint256 chunkSize = ChallengeLib.firstSegmentSize(_challengedSegmentLength, bisectionCount);
                uint256 segmentStart = _challengedSegmentStart;
                hashes[0] = ChallengeLib.bisectionChunkHash(
                    segmentStart,
                    chunkSize,
                    _chainHashes[0],
                    _chainHashes[1]
                );
                segmentStart = segmentStart.add(chunkSize);
                chunkSize = ChallengeLib.otherSegmentSize(_challengedSegmentLength, bisectionCount);
                for (uint256 i = 1; i < bisectionCount; i++) {
                    hashes[i] = ChallengeLib.bisectionChunkHash(
                        segmentStart,
                        chunkSize,
                        _chainHashes[i],
                        _chainHashes[i + 1]
                    );
                    segmentStart = segmentStart.add(chunkSize);
                }
                return MerkleLib.generateRoot(hashes);
            }
            function verifySegmentProof(
                bytes32 challengeState,
                bytes32 item,
                bytes32[] calldata _merkleNodes,
                uint256 _merkleRoute
            ) internal pure returns (bool) {
                return challengeState == MerkleLib.calculateRoot(_merkleNodes, _merkleRoute, item);
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2019-2021, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        library MerkleLib {
            function generateRoot(bytes32[] memory _hashes) internal pure returns (bytes32) {
                bytes32[] memory prevLayer = _hashes;
                while (prevLayer.length > 1) {
                    bytes32[] memory nextLayer = new bytes32[]((prevLayer.length + 1) / 2);
                    for (uint256 i = 0; i < nextLayer.length; i++) {
                        if (2 * i + 1 < prevLayer.length) {
                            nextLayer[i] = keccak256(
                                abi.encodePacked(prevLayer[2 * i], prevLayer[2 * i + 1])
                            );
                        } else {
                            nextLayer[i] = prevLayer[2 * i];
                        }
                    }
                    prevLayer = nextLayer;
                }
                return prevLayer[0];
            }
            function calculateRoot(
                bytes32[] memory nodes,
                uint256 route,
                bytes32 item
            ) internal pure returns (bytes32) {
                uint256 proofItems = nodes.length;
                require(proofItems <= 256);
                bytes32 h = item;
                for (uint256 i = 0; i < proofItems; i++) {
                    if (route % 2 == 0) {
                        h = keccak256(abi.encodePacked(nodes[i], h));
                    } else {
                        h = keccak256(abi.encodePacked(h, nodes[i]));
                    }
                    route /= 2;
                }
                return h;
            }
        }
        // SPDX-License-Identifier: Apache-2.0
        /*
         * Copyright 2020, Offchain Labs, Inc.
         *
         * Licensed under the Apache License, Version 2.0 (the "License");
         * you may not use this file except in compliance with the License.
         * You may obtain a copy of the License at
         *
         *    http://www.apache.org/licenses/LICENSE-2.0
         *
         * Unless required by applicable law or agreed to in writing, software
         * distributed under the License is distributed on an "AS IS" BASIS,
         * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
         * See the License for the specific language governing permissions and
         * limitations under the License.
         */
        pragma solidity ^0.6.11;
        import "../bridge/interfaces/IBridge.sol";
        import "../bridge/interfaces/ISequencerInbox.sol";
        interface IOneStepProof {
            // Bridges is sequencer bridge then delayed bridge
            function executeStep(
                address[2] calldata bridges,
                uint256 initialMessagesRead,
                bytes32[2] calldata accs,
                bytes calldata proof,
                bytes calldata bproof
            )
                external
                view
                returns (
                    uint64 gas,
                    uint256 afterMessagesRead,
                    bytes32[4] memory fields
                );
            function executeStepDebug(
                address[2] calldata bridges,
                uint256 initialMessagesRead,
                bytes32[2] calldata accs,
                bytes calldata proof,
                bytes calldata bproof
            ) external view returns (string memory startMachine, string memory afterMachine);
        }