ETH Price: $2,513.33 (+0.28%)

Transaction Decoder

Block:
19159140 at Feb-05-2024 02:35:47 AM +UTC
Transaction Fee:
0.023087294977178432 ETH $58.03
Gas Used:
1,838,144 Gas / 12.560112253 Gwei

Emitted Events:

179 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x000000000000000000000000000000000000000000000000000000000014e081, 0x3c45f46a08fcdf94cd1d325054c9f1cc5027d5f51713f31598d455d84eca716c, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, 55aa4ed0099d07632d8c7fe95ae0cf78721000fd2b4c76dc6693c9b40dc58fbc, 00000000000000000000000000000000000000000000000000000002e9a929fd, 0000000000000000000000000000000000000000000000000000000065c04983 )
180 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x000000000000000000000000000000000000000000000000000000000014e081, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 0000000000000000000000000000000000000000000000000000000065c04983, c1b634853cb333d3ad8663715b08f41a3aec47ccebcf3c6095840b86d43a3073, fb9578c70a689410cd13738f50dbb3f528138f04000000000000000000000000, 0000000000000000000000000000000000080de5000000000000000000000000, 00000000000000000000000000000002e9a929fd000000000000000000000000 )
181 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x0000000000000000000000000000000000000000000000000000000000080de5, 0x351ccd0f4a0ebec726cdc391b0c723aab944a700b7db48c9875c60d09d2246ec, 0xf4dbec89ef72bf296e46f98aed3d167d0476e9a9118813ef3a8c881a96e0d7d8, 2253e066f7a7cb192f918baefb8b775c07204f539b399f7baee605d2903ce1a2, 000000000000000000000000000000000000000000000000000000000014e06e, 0000000000000000000000000000000000000000000000000000000065bef803, 0000000000000000000000000000000000000000000000000000000065c05793, 00000000000000000000000000000000000000000000000000000000012441e4, 0000000000000000000000000000000000000000000000000000000001245870, 0000000000000000000000000000000000000000000000000000000000000000 )
182 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1881324, gasPrice=12560112253, amountPaid=23087395458076456 )

Account State Difference:

  Address   Before After State Difference Code
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
(beaverbuild)
9.628580089872977722 Eth9.628671997072977722 Eth0.0000919072
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
10.000770487526048032 Eth
Nonce: 476631
10.000770588006946056 Eth
Nonce: 476632
0.000000100480898024
0xe64a54E2...80E2E4eb5 799.870253719166828779 Eth799.847166323708752323 Eth0.023087395458076456

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=527845, data=0x005BFF733412216C1CE001CCEBD38A00CC46D46E471ACFEDCF614722848D0310F1780BF15705769BB35784010C06874F3248004D1241EECE76AE55EEE570DF4AA57CB4F398E616C86F8EE920810196870B86F96CCEC0B691AFC9C9FBF3FCDCFEDCFBEE5B3DC68291231E980CA330F281368201464F092382CB86B5510A467D9F8158F57198CF46946FF577603418A8C3DA005DF3BF3E58CBC0B297716161015AB5F282B7A4456E00CEB9E007F941F4921FF1282EDB1C94D0A93472FAC73BBDEF9DA9472692699DB00AF407F8E9A4446BD53AE7C585D902E1927D2DCF4ABE14F19B89E77FCE34761AB0949FF03804A50039A25280CE98136E46CE9DB17B539BBE37575EF5356A85256D48AC9D4F31DFD4585F02AA1B268899C2ABDE14059B9A5AF45A4DCF483441832607C089994D41BC7E3C52EB4F125A5B128C4B6870D2B0E52238101C83242622C62182BA5BA0443BDE52D4E83FF5264DC6F0BB4B846EF077528BDEF83FDFA19153AF9C7633E5939C29DF42C8B7D31EF7881CF1CDD7EFDCC5C9C70DF1EC7CBBCDD16578FEFFBE1F489AE2FE43B505C34026C1C05B81D6ED34DD0EBD2E064AADF01337DFD70CACAD44C33454E1C4694278E16BC4B0FFB7DFB73AF7CE3C5BF369B48506A1AD4AC984F6FFBC2FEF8BE8AA34CC24948D90C4E4744E27245224552215E85BEC37B3F7D61F258676013D866690DD7D2B220E104CDAFE6F7864EC8D7AD17666F7EFDECFEBA85544082160E1A931FDFFB324AF747F7512354A14A52DCB5DA425D091D6FD72FEE1904830B5A65C07E21C8081CB4657D60BFC8545B42041A7C35FDF0C8C78A783CAE05DDF72EC9B8919F71F888AE5E9A01A363B4BFD1DD805296FDA322B01A1725C65732DD45F44B78D7A064D0DA629054AEBD41B4B6D555BE17B6C281200DC32979AC102547742FC1933E86E87004280A00FB019A42A0F4818FBAD0CD06F8CCEAEEDA00520D525C80A02123A020DE79D0154349F1CF5B5DBEDFDE6C0A7E7C66BEB7D140CCA27986E501E35090E0D05A1201D3EC6C26A59D52AACAA9FE9E27F195D16EF6744875C067DC1636C88FEE56ECCE597018AC72AABB26519CF182F4D5F64CF35A04E8B1A4CC9956AB9D806880F32818DBF5689E628FD21C4072985C7CC00C3FF95F429D64C05BB292CE252152BB21CCD801A2D1484AEB9B7454FE4E1E938FB81EB292DA0C1E8115F24A86FFEE55DBD26843EA57B5358CBAA67ED37DF8412C95150A049208461175BB26A87D7605383EA1B38CFF757E7DC076A27DA30A40C7F93D0D48F00937A708F18F3516C72AE15B6FA0EEAAC6E666917155AAB44A4FF8B668127F36C2ABE6E86A23F1B8B41F12460B879567B4FADF31FAA1703067D046050309AD8EB271442A0EFE811B23F9CA106EFDF1B3FDB36210F89D0B0D7937C3A9E3EF65F81C039CB19E56B6F858AC1D226AC3896D82E6BCC37FF20FC6F3D82FBC8ED10B07C14B069668919BEF8BE62776F2B9D3190C22CCA1840F97B11E6731AFE523988038D0FA44D70B2DA93AFA726A1F548B5D4DB592F0FF8ED8824EADC547675A0CC50F77A95E798FD21EF481925B4E9AEA6B462AD906768186799BFE211939B0EFFA0E4F8DBD0F59ADF2D122EC52EABF30FE438283A104B51801731647EBFA3F5F3269554B4FDA7B6DBF62780929F0C4045BFE7F2E85A13AAD7A72B8F85345C5DB1E987DF2F267E58294F5925E70A175609A19D709DF274742ED70F4DA2BEA8A687B79D9803A03533F131083C3671B1C4DAA1AADE672DADBDB92AE133A65C03B8DA2F9C5233FA3C84AB6C9ABD3FE288113B4F1061FEA9FD9306ADA45A58AE5189A29CFB750454BFA469AC296005CB4703BFE85A793B342113093763C9CA6B22FB3748640DF88BEA502AFF0DDB588F534700D00C7081A81F314CCE778E97301D659D09333C11AC31A80BC8B6AE33CA366FD2C317CC191050D794E0F226F8D04878A4CAFE1008D340C6C175A3CF11C9AFBC46EFC26BA9A7E2AB72D0C99308CCDB7CAD724989C04110E09FBAF4166E69B34ABE0309558C869FCCE38290FCEAD3EAF248ADD99F705F4608C0090BEE61F15FC9444ACF23C8E8BA0D2DD4AC90379081F1BE96CAF017CDAB2F123880F22050D52821BCBC2934341216A686600816CA5C467E6E067DE484366CCDAEA15AEAE39B082E0F34566017981A63742B0F1CCAF1D22328B6506134CCA25522D9C3DBB54EB304D2A601DF34DD437E5FB0911424F978B96CFCC5C138D02B65AD08797421E8D6A31466215BDDF336143D9D97F4562BFA787AFF0F8B9F0DD20DFB33B0BB2C15B7E147D30065E6DF4C6A2FB7D4BCBDEB51A383C7D93D82C150E0931713BCA6327218D88427926256B79D9F1297FE581939A77DCD2F472B3F1204A4248536E1F36496F5E148E3E8CA14392FB07ADD964D16EB9BD3497E40A9A30E77B3AB58CDC05F30634802227E281C1D02C8CAFDF72515CF8F7D738F92506EF3CB1A9B72B0457C17C56A4A6817F82739AB4FE52A8D63E5940C2EC441A2D1A30E6B8B50E1A26D90E6598276582502D413BE57713D90D9F7C7618DE4E04888BB82929DAAAC21D78D63608B220D47EC3C8C7DC4E8D47B803B8B14FBB5B68371F00F7B9CCDF5FC5D237628B8C4F7001A72846340E3581DA0A667D96233149F8668C6551F649EEDDD1241938A8DEE28E71BFA3B9A679990AFA4A372E10CC6B9B42DF054112CEA38CE787F989550AF37E4D6016A566AC852C36B45E5F78B5BF30CCAD7586508C1E6D13D1FB58C27EA18725634C8555D3D205B60432C8DA7A19C9D00E0DD6AC0EC6A3BE8320C9E2BE43F0C41E74CBFBA5366178405C0E095E800E479AF6328D2F900C08AC0729EF13F03D11C50C42B94632D11D53BD2E4EFD9D41D0BED9482D1AF6C0176DC617F0A2C351D7C48D6339F392ECD3851F4AAA0022EA3144A79D33687637B4DEA5F5D377975174536C7946820D888D26F2F56405DDA25A1CB8C562E6E16047010E6DF21F0A3A590FFC3FBD9BFA53085529B0C93249761D8669C279890002E19CA640E04D43523B8BC2982438318240ABCB5A208B0E6648566F4D088E9070EE58F32AE9C4EFC1D41EFA0E4FE798941D296EF5F360498C5353FA4827ACF5452F32CE0E9A0ABF5F9C7E11C66FD719CD252FACD2AD17AA9C04E0DE8BBABEAE818B4DE2775DA189FFC0759F66795B955C557AD2F4842F733666F3DA6E60687FABB3A072B2791FA016D333EA32B893F5510757EE45938D85A3CD581AC32A2392D62785682367C53C1B5A88535B741DBB304DE3C3B7EDC84CE04706AD0F6984CA525AD71C336F7B2A1D14CC52C270A2032F9EB82382271156C71F64DD02B408D9E8F9523E3C1312CEA5B86AE3E64C916E3C3C727D034B26126F46D55CF83308B41351FC12C9FF58BF9A52334A3955D3F42B8FBC5E11B763ABE5CD4322F81FC93310A4A0BE908F03623FFD95C045A6B25CAEA7EC6EB929C62CE901BE7033F760E839E2E225E79D6B84F066FF8CD31A339E22850A737C2CF4209D78AA5415ED42F1A6EBF27B30F45E74E594859A0B309A0CD37695C11A280D17A753542DBCA1FD7B6591BFFCC91B21AC3FBA1DA7712DB832072732F64AFC9010EBDA1B3543998CEA8E866C7E7DE41F113507CC77CA2DD6648EC2A6F8E654C13E19E1F1E4E8080566385F0F2269BDE48CEA8A794AA346F42BBC007D9ED3836808BB6E6B1EA7967CA763B02E634DFC453C74C9A292913218F77D860CBDB1FE34AE78C6BD0221AC971D24D44CB5A32D56E884B55AC6122AD603A4E95C2C643013F12D3FA09D6041EE45B4B6A61B5180C04240B246F5F24C6D16F14695096528BBDA288473F74A9FBB558B7F8E8BFC67F9E01D307A55176CE12D26D61943A3D8E564E70691CB0826AF8053B3B2DFE6DB4C6DFC383A1019077A412D66AA2021B4D42EC3862C5B7691636E1B07E976BDF3C82F87DD2AAFC43F90CF9DA26FDA4DB79469868634511A105454219D3F29A9428038993EDBA0C61D6BDFB7F0FBE3E9A2DD37DFE73B6115AEEB7FE67BBD41BDD634024599189F09BD48B04C8FB32864E8D9669803F9CF4B411B99C482FE286FD4662970FC9492E90AF268DB69B160CE8094401F3B4F0674EA93AED68E0D6CF2D99C4A42B3F903632E72D87BF0A856A950A11E4037AA2D12BCDDFB345C9F583EB9E6DF6773B6D0EE74C4BD0C4A55CB53D3F95DAC7FC569D43A9EDCE70AED7B371716C1037C14417FD2A52E81E0CFF320C64D94D037980B7C32DD20C3723DB98D1031D5760ECF17BD1E10A33B8AFC0ABB133E70D3330A3E959D7C34125CF0EEC15F752477B4FA42FE46975077ADA3BAF7ED45B0D73AF452CF55575ACB50EDA10DA0F75EEBA950DC9FBB96CDE0743838BC03AA0442225DF38B6DCF861EB2B980D0EFEDE64C04C1BC56229BB731AE89C0E7EF2F2EF8E379BE2BB5AA09EA7FCE3A7C9F0A1A031C479230129CD43AE7411568E7A8ABF6467A7945F0643852EE4EF338A1DDE157E6796BCB92C725685BE62FB684E5EA19FCE5336304F2A22B67DB5C96DB6B8F5E095C7CED10046315A8699A8C5CA5083D497AB21E8935F20E650438AF1531413B9B8491711E6359F860DC89CAB8E2DEE0DE10D56FF989974C22589A1350FC116B8667752494B5D0924D421A2613BEA8262B3EA9170F8B4AEFD53BEB0B21B19C600A61FACA6687AC561B1F513732D39EA429FA0F3C9121A31AAB3EC4EE9B61591C5A01EF78300063389EB759E0C5B7B9EA212A7361672DF2A60A38A4D7BA829DB25D51CDB8CBB0056740D63A45A872C3C4FD402CC02B870E1C36FD52154FABC05600F929F887163E6C369EBDA17C1D4EF7FDC879C8FD600259B73D4218A1D09B9FBFCAC809546B2B7BCEEE797BFAC9B5E0C0AC64B41B75A72B4805B0530AB829F0FDA71301420580F10AA31688474AFA04BDE593F6269A2037FAB660DA56A5001EE9E4EB68607D2DE78B11D867E1FF18BCD69C5134DD1F39371DFC627CECFDF5979E0AF6EEE718770AAE2F28467287D28B6CDBAFAD319392B4C8C0690B5C9FD327E81BE2A610A7A5871B6634D2B0F4A8CA2DAB88CDF9F4679700978E840785D205FCA61275839E01AB2FFD74A54111D638E6119B250A07114D406C58FA3C54BF6A210C37BA8FD02C8FEDF98B5484F0F5CF38AC64016C2450355438D93F3C33D6A44FBC3B356E8643AC0B9A0B301544A2A4C93D49B93921A70A716B9BCBE1AAC25AA6C2A65D18C2BBAE71AC21B879D11987E7AB9DEE4610FA4362B2BE708C693A4EDDEA8530F2CC6785CE3598635FDA9C402E9F2E89092C0E9C3378144E572F05B9B8341E8F9842D9D082C9F5D892BFEAB053F5C7EF45034BA91CEA53AD84B227114139E6576E0F850F628FD7F44235EBF485054D2D6ACFC7FB6C1AA3B82784E1AAB992C08CB26737086229F17DD155B1C414E6D5A380E8C9F6AC91BF8FDA8AA55F55DC0026C84C8378E27A7D3D12F67DBFF2487226DD716F7CF4BD960F271A5EC399477A73F8060D7CCE0F2A670EE0EF17CDE811B280F8D80FE9C9CDA4625299CD539A1660D6312FA486D3EB66244D71B4DE3F22A9609A28381C0284C83BBFEF048A14739454E4EA388057DC9011BD5FF489256DE9976E1850C4DA0E51E3CA52E70AE6EED6303587A0C0678D2D3B6DEE2E9D405E27337557FEA6059EAE320E120061F9CA922EFCC9D05DE513F8A4C08839287818C8CA27AD3ACE5D19ADC69B2CEF0C49D0513CE9D818EC5AC12AAAF95E78BBCF2D43C2C1980A5524B2EEA52AF68BA3D08502BFDBCD4A823CBAA602027EA9BD8315CBFBEC56A15A15E76BF97B2DAB26EAAD2EB3682F47F0D7422407D0DC92458A16A98584F0C57D9196D9A6D290A05B74FC9DC4B1167A5ECD6F672DAA5CC49F8F9A38E5ED51FF11EEAE85A99249F86A063467A8EB1FBADA032803871AA2BA95A28F263333A0242BDD501C5D37F2617559F4B5D00AFB55DA8F73C49A3549CE0660AD9CB97D27D6A7F01B3F06BE657D777C09E3082AA610664F5E807CA07448C42E8F6E96AB9EEE9226CC53F48C4070F7D32B6FDCB2856DFB3020AC4AB4185940FA69BC6051DBE34F97F1804BFD3EC15B95B43D98DF64DE103885775EBF2A69F22BC166A8A9D78E2172E40A4969CD7F60EB9DBDF94A355CA718452DDFDFF2B0763E67F95525B98B6F1040F40FFF0FA2E9FF00CA7A88AED75D042F9FEA874684958E54FB044357FB6196B99DFE765E40208A86B4ECACCA1A8AEAC41C0A7D562A4724157801506CA92D1C227F72DFEF37D8BB03096BEB867AF29C3284B1F81D16976EEBC271D146D20ED3FC4EBF5F0070E09D9827EA5C905F78A2E47F26847E2CCB8D339D30EA1A19D057A111B68E3CEA1536D3A14175F795EBAEAC388BC24ECD77B181B3F4A066BDEC076C10680988B89E7B1AB236125980443F0AA4469C2CF9454DEFA8260C7B84C10CE865C91E51B5B158DC2D5DD1E65696A9DE5BFC80B82B201DD6F4F56831112C492CD431AB238531158971E09BD9D36CD2AE400B0799284EC74FF311B76DC31E734016166B40F171BF8232D200092F63AA071393067CAE50BE082B5365F18407441DD8499C4783E9BAB254B8FCA2DEEA817EEE1C8FA7019CDD7C4EA4446543533706C75BD27B5C97A34247EB42135823135698044F261CAA5CABA67CE31FF67B302EACBD6277C5967029ED00C5443446BA7A23FF27B44820CFFCD666CEDC8D49B4EA3786F492CB72632F2872276163B473FBDFFF4CFDD723B8E791A850A0E2F933E3ED69DC3B51973B4718F7EAE40F98FB4EE280B9EA5C369CC8D097AC2DD0F19717F81FDFE182DE805BDBC8F2176AB717CA797CE6EAC068BDCF7DE5F0C1BD8F68646348DBD347A2BA369631D90DAA441BFB448CDC8E1F7E10BB5510F2D9FA126802DAC44B1C58519D2187261C5A3F5F61312F0937C564DDE34614A7232EB7E9E0B35ABA3B343BEA4A1A11901EBA084BADB1172349CF1105D98145311CC805416FF57B248E8E2DE93ED8ABE1193C5C15E1625B19D377B9C1590A53679BCC44E6BFC88A8B1EF5E1EE8F0143D1A5F2034E3B10CF38BAEC19934E175A7EF5437F1FB42F05B584B7BFA7932A91865218AAFAF2CA4927E5050AE16DCC0997EE6D64218AD1F525F8095241AB8997A906A09A012ECC1A6BD07FD3F3690FF33D6C8877096AA1B9EB7B46C3D821548660A7E244B3968C1E7877BE9B214C29A5E56C1FC42B0A695DD89D59278A3FBD41E0438FFED292E3FEB45126DD58C0E320BD7D04848D0FB228F3DADA516FC8960A954AEF1DF83B0928000B18A64EEBB97E74FADBC06C9BD636E7FAA9F73F78D8AB0C9E0127FA76BECEF8D00793E85F814BCBF1778ECBD59783A972AA492DDDB226842C06B1EFB8B0AA3D8F55DD05844E2BEAF8AE5C36AA73EFE24430AEDACF6FB38704F69054DE79AECA6F1E19B10A519A41EDEEAD84A535648A75F29F54B06496679C50E2EE90545173CCAEF1E7B8DC956146255D887A8F2DF2AC2B8B9EE45B49ABEA7216A4CA531F8602F1C0183031DF8DB6645FB06E1D3241B992C5A54B1B17316E82BA4ADA17119B47E1D7B12112B4334409EFBABE1EE7C75AAE65AB95C578A67E2B09487848E13BF8D6DE449370D617D1EA8FCB51A9CDC9E51732DDAB0D759F4C37E7884B0C0BCAE88D513237B9F2EF33D897707DD0B62622E625181F73F6C77C998E17C35B582F49765EE82EBEAF43A23430AFD4661F7DC3B707770CF793E4E63EF0ADA88F15E1D1812C25DFA83526FFD9E752CF6BE79407CCAC4F474F1FA40BA94A0A18ED641D4A6B1FF4829E44D60E4177DC9DEA8A7BF8254B677134E6AA2F38D90D80CF37C0A35E7D6E528ABF53C7A5012A1DE28846FB75585690E76BDF88803C091BEB20E8173BB6C50B3C9F23904ECF11B359997DDFF84204C190C7693DF873387C22D7AFDBAB3D6CEAF8A107403CB63EDDF6A758091C3F34989D2BC86C6257F0637CAA81F3B90F5D0E66A58BAF415A95F4EA5788AF9B96B826995B186C89F2033BFF30E4284061A681BB78C1E29416030F75F076868284B46533BBE4BC566DA3FA8292FE3B6ECC8A2DCE3AC3D3AFC03F7A9C6ABE982EE48778C621A8E0F87E90C3D7E8BFACF2935D81B818870315160A35A83AF6C080670C71A7778DD1968A961FA305932444841884B623744D6D72D98AD2D67886126902A03B42BBB470340B3F74D1D6E1F648284599669D27B035DD50CBFB34A38EA19E61CCA74315A7392538D30DDECBD947BE4D2CD0FCF4EAE238AE46E16F53BBF3A0AB574443A34A338949B16A91F84D0CCD7778622FF3B2BE5567FDE4D09EEBCE36E13B2FADDD14DABED9FBC7E857589D5BE414C5F0A4013B7B738F7554D3BF2543311BE8C6388A7E6A8C87ED0A041A52856CDA8E1CD4E67919F8126BB612410A0A6AAAEDC935F4F5F92338F7F44CA6F2BD2540CFE46C7B5DF492A50F788C13C0A30632544180F6472A170F4C192EA7DBA9D6A93BDE408C6E51D8E4E3825288AFEE880393CF752861148D69A46B9408BDE4C149ED59D550752A0F480310F3DE57566C94E61CF70BB7B4417398B41236A425C35024EC1BAA1BE60870DC3994B00697EDB3E7E62FBFE7A933CE58590E342FC8378D6B2BF056235F8012D4FAA1127BA5F8F2036AE0710F06C5BD0CA66D0343C50E0F950FABD9F86B7EF7E6498A0BAC58312BAADBAFC5F46CE8780BA6607709FC653EFA12269DDA15190AB7C2D8015925D9AC157731EA22E78FB84612DF05F480AAF3E974389244216FE6837184452CD6C8FF9D56C177D2C8D2E315CB3D9EA5C4B1275F4449EBC1002FE89B8AD686F230C0F84E6AE6B6C6ABA77B8DE9DB718AE1296CDCE9D38D435EA842F8FF5D1182A575959ED94F6393B149752E895638C31C352B9D4A96A4B81807CDAC92D03ADD2AE984DDE340263D08F632F14E4F8D91D7A5301AB79BA6B9DFC2613774486BEEB236E206EFAE497AE0DFA17326D2F9C1B0BB18BA58FDA4C0F1690861E915492A3DC979F704FFF990721962FC973EB56782DA19CA6B87799B127C6BA33728494AE9E05BA7B92D5E95D2E39235D58D468FFEEB7C88C5419881633316664625C5569D889443C3E355C3180B79ABD5AC5807924414F87704117C10C73086CF4BF40BE152043504D72BC6A2EC291C4AF70EE304AE04905575B2B1A334DFE8428C7A168185224A6409D9A8D1D40DD6C164EB17A6FA7C6079128973B63DC4AD290ECF47921A6075E5391044FA89712F6AFA75C314CAE6850FF6CB1EBF653884F414E1CBE8163D80A0C5FB5BAD45504675AA45962BC01B0DDEF3B71F7A93B52ACAFB89FF24C38F6F31B2DC6F1B60EFF5DF8354B8C1C8E293E67C7041570D88A3B0A1062C0FCB7A7DA4AD399924AAD8064B93B4E4B982897C563DF2CAFF7DD79C886C799A3B5B98F5BAD9D118286A5D1070AA4BF1701232CD9D1379CC9127132D884342FFC1F3C1EA7986E43540E981E95ACBD88CBB11F278F34112DDD7EB3300FD47B70F509B9D77F7C60C4CA0154BAB1130434CFABBA49AA0D96BA52D98153867A89D4D00DBEEBFD4D825CC2AFE45B9ADA92021D9BD940DDE5665F2917F11D9336FFA24C23F366692C455560A4A80CDE7FA7FCEC8091497C4809B90AA070C6877A9FAE2CA8DAFB191CEC66A2BCB7A10A3CCA90482CE07D72CE17122A1160A8E205F033BD0E70395CCD6C1BAC7C5A164354A8018EDA3AD2C5CD3CD73056F87E43F1409FEE70B0058959121A4003F50B0C66A4886A88D7AF89398009D32AEA4F4D0883396151FE3EC16BD111779735DFA967B245EE1B9D159CFFF7F8CC34D97D88596586FBBD1B32922B8FC68F4F372B90C9F07E0A56404057F990CDE558123A6DE41C95B768EF8CFB3622A9C76C01D4322561307484A0CEE181576734C4CE9B9D06C60E93A6D30D5F34957350C4EB31A93EB0F2062B224ECF07F97F33CFBAB1AEE5F331C09CC7B11C3B8F2D3474B47D22DB077A3C741A62B82E623C4FC27B1DDC386C83A9888E1E8A14E0F2250BC471A0CB9996D14D60960C388F744399E230799590C5DA44F94EABB62E1FF1A50E5CCDEF1F4E3538A8EB5B78795358FE35EE8B892257876684B93A93913517DC501A8D395746A2F51918599C47ABADC3589E84764672D06D383313EB23727F9161159B632B5D42C33D98504C570E9AB8BD66398AFF58B39798A64BFF5984403FC04D924E0FA4FB47FDE9A13C5DA303BE565D3E657078BBF493B95253D29FCDF05FD8D6850D0395D83477BACE410B5DD5831CC31131D33595A50A34551BFFBE6980448113277671D948BB8EE30F393983E50B3D4C7BB98298191C90322F0CE1449C030140527C1CAF95D0CA19092437AC35D643348A1D083CAEF3088F9ABF1E17E3F56D9734342C18A6340F0F871ADA0AAB0CE8EAF0A9039477F791BD531714897711E5C50FA4890BFC629150BF5702EDFE04C2741E20634F7F018DDD3B400E49747217A59700512F9A91EBA70175F21933D56449583A2BF14D16A74ADBC003A31F9566CAC73F209963582CB09D2D6F7E0ED37F009CF3F4F72A6FC97C428E2F7F9C9362D780C9319BCBFACE41F54308182623E2797CEA88ED87AD9AEA53C22F2F5BA0CDF2D39FFE9AE4DFE65BE28A3E4CAFEA46914850690669FFA8CBFD4485CFFD91B7F616F8DA992678A19DFED0DE1BBCE8790AA2786AB63989CC94DF1589BABDC24D5D8C96DDC4585577A45EAFA44438A3CC3DC278A7834F8A3A4327B43F8A9C37A79E90F0DD24EF390BBDC9B3193B44864AC6F9C6E5775A44F2D97487B3FC9EE79FEFE3AB744FDBA19DD06047FFCA458E15EABD1488D2CCCA0CC6DCBDFB0631C0D4A70EF9E4AF49F181E3144A4D40169542F6C3233A25BA514E3922FBF177DC2DA387287A6FA3637E7BCA522DC2FF4A544051ED8F364E5DA4BF107641458149E909296C3D2717F0FD6B157F64AFE2D054F612F905CDB9BF36151F8B0EC865E99FB776EC2C7A85528E77607609FE67F2E95649DDE273D342D77DDA2B43D901B5A93949CDA6A61F1F01E6EC4E9A3ADF08C91AA9650F6504FDE6EEB38C539127F443B1A379E034D7EBB610F0844100A5886966B4F777FEA45F90AEF86BB66631E83A9A7A1E1574B0A2B158233ADF110037A543FDA26A639BDB0F15E16ED8037E8C6EC7FAC2A4FBB4E785C9C1700886D2D832D8364194A005FC7BBF811A844CCE46C79F7CEC4AE1141173A4BF10413245B26BF4C352CA8B62EFF4E445B37B19C7AF06BD55989559A63242991D96E58881F42FC3167E830852796AB7E9D499B3986E270352E8427FB25A47E23CE4764D4C3B100C418C3A3EEFDF61858F8E1B2EAC5A80CC71780C9A9CEF7818F9CCFA089565FD1F8B8DD41771449E746F1D2D32587BF93CFC7B7B1C08A836D7660E43B4B19935CB93594A87E048E5AA90C545F01F15E0A0BBE658C6E7126656174D0CF301B6349EC3C0CA5A812AACDFC85E3ECCF2EB91E26881FB7EEFE5D8DA7869C6C07F6575D6FCBDE77432F1D213A81A41FCB240A7DE51F91868F4CF9465E687DEDB51D37FC47F6BFC1E018DEEC11EA4A1E3B129AAC508FECA17F9E427B504E257A3E8FDE93C4C62FD0EB0140B3A69EC750C8E436576E292E62132A6FC3F701E6AB56350BE33616BC9F4A2B6E64EC28B1D9C4D0A2B0C9A7E62BCCE01A550D1D46DD7BDBBCA68FE40D7D929BCA38D17BDFAE9AEAA9122BC3E1BD7E4136F1EBE5B30D853072A311189AA4336D119E7EF5CD905A9652161C0A3D6C6D354FD5C7D267036A7402E19DD2E5B793F464B2B43F2AF7DF2927F19D2D0D8D8338E099AACDBECFE4FABEAC5C215940891EA9775456670E24FD407895DF5C3869C85C4960B30ABBFAEE7174A8C2AA7ABA627FFC44465C51316798E3C3021473541449DD8413E9A2CC05A51218E1D040118C683598E833612599DEB9112281CE40811017D097AB6E9AE14F1ADD446AE60C0CB72202451CD0BB3E8D7774BF4CE2FCA836B43E5E08FB3DB47E8C82F5D345E687AD156AB6481A0A969747DAEA349A9BB4B85441DE5D2502AC2C5D9E495FD0770479DBB5023AE44F16125AC5BDF1D6429221E5E54C07AA2ACD5C9DF30FE752212206518D07D0D8C99ADE902CA7A59FD04212FB973EB494438CED4DC9359D2D6D170444AF950A94C8D3A5E8331220A0828CC2F15306EC59446B30867DCFC11D0FC78E1138ACC94F52B4EBC29E097C281485C752A7C67C53D412DB95E64438A888C657BF96AAAC9B07B26BBF7270DE44BA880BCF129FA0954649324B88C90795B23664D2A598EE9CD031120350A7668A142A5BB89601C9F1C1A9C8A2BF09A2D7CDFFC928D7FACD4C9C55FC9AC37D2935B4899B5ABF3A1FB0E957B5F829E01D3F41220962F3848962F53F994C9B5BBD4143E6904FCA3419F151D3E120CBAADD0DCFD99AF6C2F4A3B3F6CB94CE0612689560EFE1F22D3F437CE68FD963794B9FE0469B9688EEB8F3EA50ABA6C430ACA04C4A9BFB9CE7864B82E45372755100FAA7AFDABE1B24A6E7C438A64B5341646C3945BDF2FAC0C8A36D884C987A6E53A681DA149BF83BDF7EB4EFE6E01E3C4CA4042D8A3F539CF4A2D4504158D58F7DE8502A470B2C4EC6B6E52B81F0D502DD71F1D3B33EF9B9248D582BAE9B5A53E96538984AB54C25D30A6D398F408511734D9F5BD48DCB20B9A036602ECBFFFA9BE10B3FA68D8C4617490CE0B5FD446165FC2BF97E3DDA9160EA119D6E9CC299922AA96B63BBABEF068897210F847C6D1B82319FDEB156B91D37E35C1A4739A706B66275FCDB530289DC786C7F2DC78302B3C656DAF4C7A78ABFC8BA5F0D46DE58B4CE3153E78799ACC30FE4B8577155286BF5AF0DD5A1F2AC93C24B7726348DF2BAB96F47DA5D598F7E1C53CE964E825BCCA05A58F99FB1A976969DE09BF8C8AD3118148281CEE3A9CB347508D121A081827698DAC3CD8F1F01D5F9E6BDBF848F16787CA2258935555924364691565AC9CEF0CD8174E620F6A683E71CBCE7FD54C57339E426A892D92035A77C9A7800DEA8C4021B0BCC4E6D08548EC3E6B9CC6D5B3ED59D8AB6EB4DE5ED67A0A44CD95C6DFEA7F4424D34CD869FBA3EC7F7C655DF6C76B756F6A613E7A6635A268CCFB0EC1E2337AF075CC5D908E4AE3D76DDD3F0802486AB993E843CB0510A8C31DB412DB7E36068D6D92F3BD0D299B0C2E55BB90650134B9BBBBC105DB6A4890D1BB5F18EDBD11F793DF98C327EE70A6010CB47464E189609DA13E0D270AE98786D07769781C414BB6B54D1824ACB56E0BB72A98795959A103D574E9F4C511BDB622FA758A0830A17A09747909D0D490BEDE4D79283741D501A762520BB9D66CE7B460C1FBCA865237305A8D717EB703CACACFBEF82171CE2A53D10D1CF4898929ED90E2EAAEDF0ED7E771FA48AFB82B3E1267188E77AB1788F111D5195B65F7C141042BC78AB1D2C725651E78D5DB36FBA3EC19EBDF05D8ABE7641B7043738782BA92E0565D4A7A95D3AC3893CB92B8B805F7B003B67C124E48FD04F6802B6783ECD871D349B92ED9E6A055C430FD064BF0811E8376BC6E6068E5888EF10BED6C277D88BC834CC42E81421BAE08903DEA05B6BA205F118BAACA22EFDFB79B06AA9F0C849EE89BBB427066026A7E1B66524E62727887440D04EC06035C1EF1D3CA03DCFF9BD4532F39EDA533A8F95496A9E13A64D306CE15FBD394D9F959427CAF49D552B78A0F289AEDB12A194F5ED83689841E5360ABB1849444C33DCED7BDCC5293F1BA7654DF0921D953D2EA8E20FC8F47C598593BD959C3D70C88980710E3F97A02FB0111B16CA0B0AA094C0BE57CB8F5A176DEF33840D693D5A84E384EB875AF6F99D71A3579618F93887DEFDFFC0674B727B4C38912F0140E3EDAEE3F4DDA37A92A78E605FD19677A44EAB7203FF4DA345469B117E7083D4883DF4E7C329FAA3732A33373710D0EA54B8B1793EA07C42B876F0AFE8024C5432C6D68194FDE319E0E1C91B20E5F736278E6FF6E41D8EA4ABB49F3C91B546AB434BE39A648F43846994716D6BC8AF8F16CB80EFFCE2BF1C8F67201C6C3A90F15508BCB90F5EDA8C5C35479F70D1E3605179414BAECECC9116FC3C62E280830E5F852C199B4C939B59F3A104FC75474210F5680CEF802ABE81B44F9936AB3B3397E3E02B12AE046331094BE69A32C5EDC2BE0F20B33990539BF3131ADBA72B7A113256163B799E3CA21AE1BEBAAAACD6E01B936E4D00988EA29A912B2A90BFE30712764EC3671BD0337CE0A9FF515219D6E4B41490447846F93C36117C6C2DB2C6CEA229C79D6BA1ABF26A42566CD469D11DB8E3B27A8584C2A3CE4A080795E22BFF5AF07D7B5B6C28DFE1B603CDD84124890B6E1F93F1795B469E69DD42E68710C31D1584BDCE9AB2C9B03CE223FB8746C8487EAF57FB531D32BB00DCA08974B1449BF903E5A588AEB5D3085722F4C8A2B263221CF750AB908A38D1E25DF82D68AD7E502B08DCEE048C08D853207C0E51AB583480EFB44776198A1C9A321D0A085762EAA8BD0B50D359F3411F388B98462948328562FA85481686AB087A7CBA33AC8BFE1F3B32BEF487D11AA4214103B3A915A3DF15EF50481CA6D03BD305B1C7BF4D6838AB409260A2B4983BD6F11483A6F96CF38E00A3F724F8E1E72F8073A695F84BD9CAA2D24638CB60883A1F1E93A861AF041D3A8CDE0ECFB0DDFA059E28DA3634658F2F6A347E26E1ED8C0697818103358C1A9D79A36079C7D63F92A9E435891D4AFC5514D47A514441A8B5106A4EE47CD8D0102C4943709263532D02E6B20500C9B9891851028C5D696156F9AE48B955AE87CD8666DDCFED247E3B8372D96FC1B966B91671E6911B3CAE8D1B2E7F63D58A3216FB189019ACA915D5305C85A9FFEC5A0CA4AFAE43EEF192FAF52CC64CC596A24E432BEE5A78903B6257B574695211FD4CFC107C54BD3E58AB5B34340B8057B12DB0EABFA8712920E03EBB9AEAD12471125FA0AE5B736039562AC3F8B22FE1FF25C1641666F1AD47A4BCC7427F2D6241BB55B8EAFB08DC105C1A185D6CEFAA2436F16A1E3E6D957EEB6948DE6EBD951B656AE2821876E006EF40837832BFEBB359AC528396106EDDFB9A33AF358B25DF8A15D052BFFEB80FFA60E03225F45D3DDE223CA00F44C2BFA5B0681DB2978540490D39C54794A794509B1D139B8D610A1E2C0D05491E4D4EADCE366CCF388BA5BB607023493BBF9B118BC3542416EA346D2745F2730DE79A425B28101C931C436CF145C6C284000BC02F4531EFB704BE78ACD0D37CD67154A765A8CB6514C9FE41FDA385FA9637E40BECA138994238EEC3A8F1D24391574190C548C7EE88102EB8CDD5C1B547D47BB0E284D500677EB8077F60E51C205B669CC0F129E3A10E9F622B3D48A84E4208A90FE22589E41FDC369F2737C503945AC8B2B9031690BF93F5B79E3FD2EDB5F035F9DC44617200763E6BCD24B9547E596388519327F6069FD885DADF00FEA6459DFCBE051809245314AD7872EAB79FF0C3CFE79A971D56B10EB601B57471B279DA6CEB35119A58C4B8298DF4425912DD5E9AE7CCE429D50CE460A883BB21093300891C414C67E7EC729D570ABC1083B08381A41EAC57CB87FBCDDB943507D185CE7E674EA210358A9F4AC383DE381FD542FB16EBC05F2FC18CB05620344D288452589DCA8F14AAD7FEFC246D95FC041D675208DDFC5D43083DED013178B9122CA98D6FB20489FE78F22F79ABA519776E2326517F43280543373210988042976B9314FED3747AC2EB4959283D523E982BDAAF6F70604E50AEC5E66F642DBFA5BFE9027D28433350A69168C430F78C622B5DC714751F016F50659F1122B25DD3AFD954251A2E8ECF27690A341ABD7D0FE8A7A65A0F666EAE8E225B08A2A2507E86AE33C5619508F889336D830727AA1E14501D03CAB119C2E3987A127950BAA4536D81FFE256220B8ED7CF88AD7C1A607248973C58E93C5070ED23ECB13074832980800B21349D7910E8641F07727B021958F1A56602776C3CB6D97F7262D1A24BA43DB2E4AC4EB44FE49D0CD4C82C50710A1445C75BAFB55F80BBC6B3AF3F18FC1BA304E00F467E27745AF93D0A13BF742DAB21F5D4FF8F2FAFCAB9937A2DE43BF392FDEBD3B2099C6BD8C778EF1B8278CD314A44C49A459B00EE849FEEFAD960A0D90A2DAB3F90D22C56A24898C965C7F38B268C07DBE96E1A7BE41023690CA2EFDD33457F584461C2AB13049A4413626BDEA02644F9340BDA5A8F2FA78D687D140BB5F081FBB7E195919E72741032FA9972BA92A912553C45F2D6DA4B46F9F5B340018C95444D07330CADD2DF7D5038D7851A629A09749600BC7AD7F3C6C8DFA5B729A659872CE082165D628614254B8FC159A8AE534EB7BCB418FFE8B29C393DC340EC162A300EFB8924A4728E35A6F6602EE9AF2305085D7CB2C7BEAEDC3D1E74DAD8276CB1FA0A07D0D25A22065F24F2A18918157B00B0A56B4003BE700728C1AEA876D083C8D0E285E80163751CC1BFE3578C1590E4C4D39AD75AD124125360A59487D31568428E04410101BCA4966F9FD8ABA25A6FA7FBEBAEC26B8D550C8FD2359E258C5FC2504A07A7B204862BAFDFE6D97AB5934A4BDC7749A78B11A9C63BE28FA9333CAF3468D341C40E60F851822AD3B9B151B9D852015260C910F16B17AAC548938486167335121B9C59C33B3BC5B3927B56A8AC931C86C6B397B7EEB2664C6B1D3207FF4892833037A9814D8471596678E8EF8443B0BC610B9DD875F1BCA9A6800F636F34EF150655720CC6A0C3678C338B0FD95024E79308098ED1DB59B2DEC8204599D0487BD755CD99704923A909962551C893BABB665CB81A846ECE4479BF5FE7A56520035774E41BD65E0C5A8CCDEE5E9329E873EE4DBEB08CE4DAB11FAE87AFBDE4B3DAE6DD33AABF22685135925A2697035501D36DA1F7E92A97DE5B05451B33614CD7977826E347F47A2B311913EF4DAD31F71B6913B78B308851914EA9B9EBCEBD78AEC06907E28357DD9F1F0ADDF39F7E248BC37BE6BAA8D281F0401D0DD0E6C8E3398F2FD47C2142C18F9CFAB7A0A0F0CA28529343C4AFF8E0D345C028D8957AF4B39399EFB7E2E0FFF6B43963259D5D18A13C5C2350589F6B80A3188BF42DC3A610892EEF88F36C7817251AB98B5F9BCC679E872A2FB242797FC909507CC244C2C61E656412189CFEA80E307B6B5B2CECCFE7304664432CD94BEC6468E9C4EFB2BD1BABAC9C680C9A7CCD9307491D5C60DAD7191BB35D8482DE56DEB53F738A99380365A5EACA287FE8CC3FD7E790746AE7C8B9E75517FABBC006E8F335604C1A9B2897C0B17304CE13AB73100DFF765BA326C39DF79852058690A29D5AC1C95B8FE4A7921735C6BC52535CABAFC4258DDDE4FA0FFB70DF26ADEF0FA468028756025AB446C3DBDAD3B423F8EF507F1A592948790FA6278C2D1C0231BE7D7BD2CE35581867919653DD4BC1D63FB6F35C3C8DC96636D1FBAC2EB0C2030545E70C1BBD2C1A03C3F8EAE9FFA73655AF4FD653C85DCCF71182DE6748F3251D8BF7534F05EC91887D6941EE8DE51EB950750BB70553DE2D7571BD5EA8E55168ED826E77DB503180A1FB6173E92A1034E2BEBA998192318A801DD0E7CFB3F43E9BB40F07B336C4EA3F9A35E9C96D0C7B1DB98C61C4F1A9485C48E34ED951171A3C0583F9D2851221EC42D1E5648D8938930197696F933668413693C61EDFEADDBC27671D048F2D5B44D1AE4918AC690E3946E9184C8EB5E20E544B419237FB989DE8A01E4E577CF34BDA2A5C5D292FC94A80FF14EF3BF37EF306DCF2123DAEB40D9F731E800EBE40E52ABA815E3C32A583F8E419BFB4865FA703E7D88FB459B0BC32086F861F5C36F5B3B082CAFC878E71E1E98CD56810F749B1720AB154B76787B99409007F59C6F37E4814CEFA2F5F88F549D45EF7372624FAAB1FD75180FD0F84363E7793D71AA3B6F9CE6260502FDD40D5B5C567F5EFBF77487FEF0ADF758EE3BF7F4B02962828252D52F250FFCFA2628DC7E59964C8CA2C89D722A4D67E09D245081A2EFDC629D04D5D44B031D72F6F9542CB36583721264585FB0AD3C73CDF7E62EF945C9FBAF485ACADD3483B4E769D9B4DFADC45F9216EAF18ECB16ADF462E3FC75BD96FA10F7C82F230503E0949E37EE2D44BC7995C74341B052C0742A6563E3B4A44347F25E6E3F35209278ED05AE2B12DB81FF6C15657EE2D033723A097BD3006B21AD8CAF473C8BD43F2FE0A91BB887E4DA29BD37F4187ECE2A961E5D716BCF7673DDDE514018DE1B318357F27EFA05946A3F51FD1BBDC066C056BF69BBED1A3B08DA8BCE65574AA9EBC12E86C291C57D5A178BA3E26D3348C4D0861CA95D26A2F79A7972C56BD65035DD2CD486F9B2C50CE7107C003CBEBCE7F4618BAD2F17D3AB655D974A931BF3B86AC885D139E0418FD4C7484F22121AA166DDB40D005B3466298AD4DDF373FCE5934DADFC7EBE129FA240F58ACD7CF2214078E2CAE31E7C91A2F7B622B26E882878A129BF2C978EE04634CD0A288BEDDA0EE9AD80081B5315578819FD504BCE4BF017D0174831674CAA01E88C541AE5CCD3220F071DD0C400A6604CBBECAE01B8A2C93DD6DF751F75B2D3EF4F61483F3C0FD0A47387303AADBA324F3C1E05555B42D84026DEB9868D8962B3E78D4B9DE0BA4A789938BC8076F4F245DDB75BEB2AF5C680D9FB0E703B7536D467C53EE7154E78716B0819552ECD26D7ABF9078FF44AAFCE47D1AF92DBBE4076152CDE91453981CE9254682521B69CAE8FC5E90339ED172F394675F0213F6EB854D54484C01489E74D262156C63D772F85922459227CFB6BCE353FDCABC89D89B3B8A6A95AD89400E756D2324ED8E0296205C1476821B3F3C91B0E481C101EC8AC33FDA34F58E687749E04123882233DF5D9EBA66181F1E5AA364C95F52412659A41DA47F5A1C3BB8F8F53326D17A6EA0AD6EED0FC6BBACA3589882934791DEF76C6E4BD0346B39C1D3D3FF518174034C069BBC940AC467BBC154745724585DAAF4C6E2549830EAD45DBD7389247CE46F1EB63B20BB5BFBDBD6FD48E66CD64650E7A14F1A913F9750C3DEC8BA5B6E428C89B7C7164B7F10717BF2B4D38323893AA8A25095B551116680A61FF0D51479752A4BC687CFBC7A0B7937BF24A23916F71ED77A2AD251FC76A521051D22BBFD22F68D604B9C579BCF1E2160CF3C209D820F525D818160D34C6D0D058F4D1BC244D07B71E28C4E07432FE7A062164DCC4B3174984A0E597014A53DDD819D244F41126D01185F16B7825E8E5086805B66FAF5E83D796A372E135DA6CB5AE4A085A8C46EF6D27B68CCB3823EFA534141AC932A282894D6B350AB4697835FBAF4DDABC3F9D9D5E259755CB7F91FCA44F6F46945CEE64A958E704A9DFB6160D12F9A268CE73DCE21636DFA9304EA96C4E2544F0AB79BA0D890E610158D1A586CF3A61D242422457005A84F33D54178D11F8D1CFD08B877F5207F3D24F81804D8931DB6B83B6268EAB2EA8C50AAA42FC2E1E1CE2D45F117046F7A93D6ACC0B4876854547D9815270730C1357A3ACC374DD5EDE6FC4368135B0FD7AB31411382435B9BBDD67CD47CF621F93C5FDDF6FE46E4FE3D4A2B71E3DDC2D40EA31C8D21693279C2CA06A57AB54C6D41375FF10AE787714655D10EA29FFA7E030FC102423A0462AE3C91939B0F37204560489D5BB322D0F40B35E781F460DE19E39C0C70BC723CAD6146A448ACCC92FEFA46CDA5FCAB947E74470830663A1030FCF528AA3B3E4FCB84E49FBC67CC520801ABB8534ED4FDCC59DEC10F033A767D2B5489F82176B2DC6E7376165C2614E3CADCFF0DF2B035FF922E1F1EDB3632C07EC4B78DCEF905A2DD141F80ECCE947EECF4536B16CDE8093DAAC6D26D50D29C85F8B06EA8EA87BE83EF5E9E4385EF181A9CF6FC5793AE80C104D3B8EFCC9DF4755180DD5AA585A82FFED968E7DA88332A95CBF1789E525DEE3647C0E8A77FB81FA322D1AA2B56778DC0474D9F85C15D0A791F5B6113F81FCFCADCF1A1AF921AB8DE11D3B2A70F5DF471FFF0C7DDDCA4AA8DEED32441788280776035F2CAE2603F9EF6B1F4DF9CF012E3C47967E7222D6CA13895F072895901D219EE7A28D39B2D8214C0160458DD2F291E1A3110ADBFAEF34FF7A217BF2BAA569DF7AD10C2B3E2E033AFA2A719B0E5C0EF8A9131F92EEFE6BDF354C34F3E99CBDEEC4F83C8E8E9E775B6C4FD3363290B2D1D6A2E3F85536836AC8D36BA47261B2EF9367D149B42D22960A0F48F4D5616DD776F4776EB77312AC71A0546E38987AF54DBA6645EDFAAC217C6718EEE320E4795FD840A6D614C968A9DC98E8BBE97CDB5215FDD5D0529D2B993AFEB2309DA05F8987B8C4E79D0A3B53E51949C50FB19D038E56B4FD84F5BAA04FD07D21AD15C442C30352F3F3A05AA50F23736ED3821E6E0A7DBAD06F89ADA02F8FF558FBB62A6E62D7DF05690331E958818DF70E8EB7A64D0DEB08DBD5B1881F9623563AE88CFAA79F41D6C51AA1A737B39BD12AFDAEA53B961399771ADCF2DB3A87DF3BBDCB0AF41C352DC3BCA246ED0DDC7ADE54CE9FEE1FF290A288BB77D0B28EB1336F233345DF47416A250F57FD4E7B2EB8BA68196E40DCDA2931C2F23B28D0A17EA97FDEBD6CAC7886E6E914955C3F6B15B3E5B28C5C3E09C86BBB283A522DA6954F204192A73F1A91AE9AFD847606C028A47FA6B317A50911B60C2F2E0AAE4917FA3F3D50C7C18C22F1DB611B0286400274AF97D16883B437AA51E21F10E50B919801E320121FF88E68CE52070D513A6EF62DD25F82F20FA6052591435919D8A385B970E07B8D75111A9283A087F4728C60D40971407500E2C0134CF4BD4B17A5E4B3EB886F5F2E39E23D9FA3D752711B1DA714A8B082DDBC870F010EEAAA082E6FD22A36712C5C465F86D46ED8D25730449DDDCEE94BB3C0E8B7B2D0CEC81875DFE81EB47C720671AC3ED8D1423EB98F8D033EFE65301CDAEAB472831D00A6AA94BCEEAFD70F06D6F286C02A0F2619B5E99DE0F47F72C0132143192DBBAE546D390B2ABAE893DA039D5EC5664DA0F50EFF52EE29F0DB4FD35D4ABA3246840707E6661555A85C137F7440F566A952ADAB581160F5CE487D4B0640BAB5CA3DC08A41959891AD5919F6033361EDE5B1727DFB94DDC3554DDB34B00B4A4A416AED129E394121230FAA29E3B3A838E971AE44993EB8A2BEF68767E685AD2B178761732192CC8A82795625B7B66BC0B300E30654E7429100940B014D8DDF288D37D3F66588D52FCB7286F665752758EB205F6951026D9A30E61824975F652AC8FA9AD91F5301DCF724045E3E3F5109C8BF5D2049B28765CB8F7F48FE0B935458B095BF6D3205521BC908C5C67E10C97314F6EE8077FF699BF29105DD545D5DED97DD6E02942D36FD07C45BDBAC69FE2C753D67E633854ED2200A2822C3B46FBEC2F47BEA6B053707CC18C0911431682A23DEAEA68E7E78EB8CB75BE7E50C52A549E29DBAE10BAB96D950F40031E77311173F59A01AF81CA0E8EFC35C43448BA9EBEFF127E6426362500DA21E446AC828B3BA16E2D9FB03804D208852E867BF90831A1282B72D278F2737FFD689E595CD37597F95B11520A6CC6733DF0CC4EBFB225A066B2C3D15FCBFCAE425A8DB04823BCD747CEB8ABF22AF720B708CFBF1A0894CC715FC1BF35ACC6C0C0446114E9BB40CAD3764CD0C46D0B828367C454DC69A3E5858FA2A30C75C82F8E254ED8A9CB2A38BC8AE1535A7105079FFFC373A3366430828971FE7652885763CDAA2C0B76DB0B9534A837F94CF85D383FC5045FEB4DF1B5ED8949B87DED84838321A73AB88C7E26B99F22FDA94A44160631780B55E126D8F890BBD1A5FB4752827068D60617F966793AE0A42FC3711F1C0C193A3C4BDCEA0EDAC0D74DEBDF56C426BF06D6968C8FE327E7CD75602BD15E05E5E834F68A07BE44BD57D9EBB0C4F7D64B1E77F3A6261D71698F8C4618B660B32D4746E62E4F26B62948128AF4187F07F6E722F95477A825E765D476831673FD25F924A91E8863806558CBABDECAD7D20C96452EE709113D6BEF587F4D76559059AA45305E8BCB93C94916C014D2CB0A0F96398DE308DD8416DDCB4CD664BFCA04182B1EDD9DE04BA747ACDFA48783DC13A0773CC9471CB7EE6D982739B551D976C20BFF4439F909C771FA2CF1C921447B4172179E2DA7E913830CA9D725E38D161DC782EFA171DCAA43529F5E8E08F7AECCDED5FD9DDA8A2AC835A638E4F36915BBFA50DA0A27C0D95FABB944304BF3817C5AD1AE4EDE22D9E5B7B7B74D9B667061E0F427138045C04170C62AC7F6DAD9A62F835ED3D8D4F83EC2418C97FBEE1C2BCF2F5D5B99394254B6DEF624A55D6F57F109DF3E383C850A5277FB147D16E01500D3CADCAB6E41C3D55C7A465E14DBDE2A90871E2EB0544E7DAF267D566270CD0766262459D3BED2EC9D124F8B14EA4B92BD590ACA48554B8CC5401E2A58D82F03A438DAEDFB9A6F0DA4952C80B5C733F19755F468D10B18F386A9509882E52B743708D48E77872991ABD05965D9E66B9537464C3064D9207E5CBF7390C1E7430838230821661D62A1AC68CBC76BD7FCD4D3DB483788AC5FB3631FA324E32E2A49A1710E708060D233D4079226D0270996475EBAD911EF52532D483BF394F11905DA826AFDEDEE2128BBAB5B3F4DD79460320AC933E38BB7A8C5E3DCB35027F229CBFDA56EA0F92F2B987C3471D11F7F4A04149438383274A6D8440A013595712BC8CAD54BBBC947C0D464E58D269F3BBFA20AC7E9B7A6EEB0830FA3ABB4B3FC871706D932B223B945B230797EAED5ACFA7958A5F45879996286074BBB90AC5284A54474D75FF878F4C5FEEBF893D37C7B5A26BFE8064432E48774D55EB439E0A7D7B9D5EBB5C40F781B81E11B78B2EE7FEF1923049D89FBCCB79615EC046DBEE0A074F59B8D81FE1CCB5E70ADF293BCD2E940CF1F53B33693F4A9AE5362B05F8EC78104001AC5B3E1C82322FE1354550CA80A36A14D5C32DD261FC4455D728DAC4EE8E3CD6793D866316C188D69F752359C40E88EB39785802245B8B2272FE01FF39A6B7792E0EDB389E40F3DEF3AB274AB44FF59148D572A4477B3745A28B26F7C463A49B2B4A983CE19E7D65B3FC4B395B518BF87966AD77445C8FAB1A21D248FBF44E6DDE453FE98B3102D8274FD22C0A002DCE678D5175C5EB38EA6BF42B8D7787FB51C5C0EB3574931D516E99B3D30EBA76E8608B3C4D2C5716F92A8F7F969A82D96B8112A6BF2523F60AD61C7F159EBCE11B0F077CB4A7D5D983F5487E190DAF9262DA65587DEB8007C158309A28CAE44749D46CE229548787320CEB170A4E63826DA4BF14F2C331D88118CAAA08ED600CBB73BB346D30E2AC0B41D2527A2E715417B2FBFB2207A06B5F10FED22C38A98DF6ED2DCD270FCF0F1BBCAAED73AE8FA41EB402522996A24F439647A1EACED75F1A13A7726837A56C455CDA093E9E8225833D7A56393FA1ECE68802F0C20DCEE9A68B4AA445D67E832977366F467B8D259B884C73B21E9160B47B07A52F44B81C741002D5C787973751C62B1707A63F2643ED5ED7D13DB755E015937EC5341031C5C31EE29D764AF4F3F4987F7D481C49B849BCED1B838E9991E42F893F7EFAFF2E694B71F8DF0739AD97D4071BD9B95AA39858D918191949FCFAC14017CEB1F5ADC3DAD9A8E218D24BBF815427C12BC9E80D680141E685A56A04FB4D00AE59E1E78C1A4E046BA8C4FDFFEB7D00248AD39D3AB2AEE719224D76484F89EA6EF410D321EFC8211C3CA9F4F93887BF2443FC86D85658AAE2F7DE3E735DE83B3FBA040F15776017183214633513340D08AD97627ABA470B2A28D39A1C54B5724269B3A08FE71FD1FC54DD00F35E62EAD76E04238852630AF5CC8BA0B66D797DF4ABD9236998223D0419B3F04B202D42B28D96F2965F283A621B9C063542C5FEDBCC8921D7612B0A851FE0578F8CFCCAE605821C6894CC9BBAA098486E4B4D390B88838D512C10E65B3879ADABE66146AAD366273C8F9A0501754DABCE262C54E72FC7625154390C299AA1C89B346E8246706083169CDAD944C0D8E9785417B098B72877BED7930A1B12AC2BF1889F15908E8FE87A74DBC2436E85F76EC3C1AB9612B92840519FADCBE49842DFF4C8C591FFE16DE7A761C906CAB301F3DBFF5614B58BF48A66E4110894EB808125636E6C3057083E4A264AF5071E7AA596F0316D6DD6D2BB45420F20ECB949314202CADAFF14465731DE4F355332ACE637B013062BD9E1FC6301B6257EB9BFB2C4B1987914FBFF4B1AE096E8D73B7D4C97A75CA9601EC30921E93AA0063329C36A021CF7D3032F4DBA086F0EE3EC85ACF512F31CC5FEF66E0B11FF3D28F621D91BA40DF4004C4ECFBFA92C11BCAFF3D6EFA9FF900D37E4571CA6270D12766683CA06A237C325A5F8217CCF83F4713DDE15906F2D201D7D9BC73E83764D7BFD0776B786ECE58F933501DC69C529D9786395BC52AD04443E47C34FA67EFA00B88F676B3DA27336B094F371F55FDA67E0296819C934FAD773059722D6F43D4A7E18E0B6E76E301930A6561958EAF64FC3CBBD29175E89463A67C9936CCD91D330CA640B8BA559179CFF7ACBF176B5BE8734AE1777E33DD2859849A43468CAEC44568677BECC03A275EB6A76B19CBDCB94BBBBDCAD06634E2017411A93B69C46F0F7CDBA372FF2E37AB63DD75D5A93731D8A273AB7652995EDBB1E55273B36941EF07CDA6BDE3E65CB0957005223A4D4EE86682969E78AFFB5FE0561FC3058922C80DC3C613BF0F433E61BBD87CD07907F7696605F95B9AAA8725BB465C4CC5EFEB4F3644BB911979C14C3C079E7D9B67780CC030FA6CEAA3AC7CC128401FED710F5C11215752D67AE2783428D9EEFEA2D67377CB407D8C56570F5EC7FA99DBCB5EDC25DBE2A825BE2A000FCD809C684795711F1EE1C4A27A0312D541038CF2AD4439FF9630DF9DE6A9654980D5D116ABFAEDB7DA159038CA003A27DBE1B3D15F23609E6B7D2C3F03EA4C257294A38EBEF2334780FF102657F3D5DD0523023103AA04B8E84AA43B7DCBAF733765AE3AC2E5A7049DDC53F185599CD752A149A1B9158B389716BA8A3065E344009DCBB39DE71713EB7B0A94DF539221E9803DF57B412E7BE0D69A36FFE94BB0CFDEE76D993375A567ABF5331E7B4A454148FDDA1F4803F3D6812AB059540A7F1DAC1073EA621FC2A132FD770386A475B60BE64599D3F72E23947548556127F3BEB53CC2412252D95D057F384C0819BFCA3880F17A7AE9B1B007F5D188E12BEFE97ADDDB41F0CBC3593ED0647196D1C5DB40802EF526CA8C36D0D8B9F119473EFE46DC8644CF2016A9B0E2A97359264718B821EAFD6C6A710F3729CE6C591E63D5F998C301582C93AAD88F2E5E9BBA9CFD8BB93AF6C04A155B0A16751733C21525F9ACA10052C9F2490BAA31F72B87F14A967C8D01FB0649153175B78ACA117D66BDBDBC71502AE1A4DD995417BB3760BB22EA73DF02E128BA44A24E43B31DD2E5051504F0F7FA2D2678080A9962616B582AFBCFF16C98A82705909145DC2F5A443264DD1A4A4533BAF0C1E1BF1FB693AB948CB1F9AA62F10CC1ABD305E4722D27A7A752EF2C911D4020BF76F65CF36DC141A3A3115B522D71313A5B998715815A8A1B76D3D57CFF5861D647CB8CBB0FDEDA7B8870692AC5FED6C0ABA4ED0D242A8D653EF57F671C65A508554AF795224B67AEC1046038224D28A47B0D61ED6345A93EDC63027E462B07FDCB92353A4F3A0D1569D350BA4AF4BA46CDA7132FBB099385F91B58E2D5209130305E6CE1C15B9F076DEF66A107F620DA6083B0216E240EAE3F697016B32F75262B6CEE52B54CDA01BBBFAB37F3574048B7A0ED757DCF70EAB05BBE00D814FD2DBAE8ADDAB2E14E7A8A551510B0BF84BAFEC4E540FE8395E9AC1F55BD891A2060BD9C7D24780028120003D691D65CC12439F975B1B97CDCD99D32520438D55251BD709C7C608737DEEF5DFDC449EFEE49EB0ABFC6F911EE72C42C6A380E1474C3164DEC4D043CD34B973D71A0EB8179C7A10A50EDD662566BAB8D19D6FEA2DE5F79CC52175856F62CEC48FE4EECC54CFC88F14C22FD5D7D3E705B50CCC1A1372D52E6296E16D41914D5F4CEB9424E211237F658EB38DD13FEDAE46E8DCAF940199A0B889809C013C366B38F1DDEEA5B37718A98EBCD1AE8C9BF42BCC20541C369C76622D54934A49E7F6269900507C36119E59C058D0130D4DED0193C5A46A99FF530BD26AC000C32DE46E11AAFB8033966EAF8117BC0BB1886E65149F877303338FBE18414BB2432F5DB190CA63A7C8B27AE88E8213FD831423CED028C33F76964670C830F2B96FA8711DAD78B10A3F28FDF7E3C87E80F5B0E064ECC81EC1BC8B105C10FCE9D71C5C6F079F108D10DB7793D9C51F2EC0B0C89258481DB770A04C054B43FE041F6EC42FBC178F162014021A0E820E180670BC921661A3D0373353A2456D64C2B131D8DF3E09FC140E76A587A1731D04EB56E78572EA5554831045C9C93B0DC631B8A649AFC2C89D261820088046A41470B813B2119795AD1940CEBA1CFCC6E309672A57DBCB9D02830EF2311D28974EB06671A37336953D381AAB94B38841D46849069116269F4B2C6CB632B9E87E5EF917F7BDA6F6F29553E6A1DC1F437FDC7469ACE089CA34CBBEB40BDAFDCFA59EDC01900F660F46D7757CD3AE114655531886E03CF7C29BDC67BDE42C089E24D0CBC0698689C449459FFF68DF650E0B0FA2C95DE2893C6BB57DEEDB216C797A17D90A4520FC188BD2280F2E3E415F127BE869EA3562BFC521554247286A0B868B69E5E42969D106BD9CFE7B81441CECA277C97A621F7CBB60859AB48A34DAC982A5A574EF2FC82434199585F9D08B3D34529FFC6A6EE34367C841FBADC61CA20268821788F0EC5D6BB6EEA5530AC653076A55D2FA31C7468A9B33C50ADF535B8CF427B4B5EA7A80D142151390DBE6554F7440AA398E2479A3486238454DA4E8A848588C852E524F9BE5D07A2079C7E0E314EBF0E06DBA77A00B1B1D21D48FE3234C96D65D27529515F99ABC65428E7413FB8905CE24620AB1E37538DD3E9FAB03E526507DC92FA1E6EBF65F52FE54D2495D5DF713C667DF83BF1B9760CCE94FE09F5B4D891AD81CC908D8BEB31399F7B1AD9882260CEEFCE08E55DC83A68B92AF9E26139D6FCCA8A8F8D05E5798163CA7F097F2923FB247718E7F357D7B85984373D3DFC758B1FDC830B732588AF5168F74390639BA1F20E6E3D81D99C8501D17526E0DA60C769487E956D3CABBF4ED8E5A8F49E34602B16ADEBDFA32B7AC1BA7F20246295028842BDDE77459FC739F551FC28F43BBE578A799554948B8B1E0659B3401EB7AA99336172042CD165782FC5234582B870A36429B39A4C37DBCFDBCC0536B2773F0967A78C4FDB8486547755799D59B3361F03F6D6C82CC0B63618FBEBF81015E116D0EA9660219B81E786B51E2CD48D229F9F95FA6D25508C4EDE485E65A7355698E1105C3A560A1E6FE279DFB485EF029224AB3B13CFBC38728B612431C9115D02F87674F3A2E058B70F6D7E3943723AB8AC4215D310F586CBB604C49A9E085BA3EB372BFA755EC5ABF694863C902D361485F81876A6FBA3094953AE1BEDECAC8983C7031D2CA6BD39414A1D28A6D4A98399046E352B9C51FB72119A81D2FCD2C7DC7C9FAFE01DD15A86609872FDA386D07487EF594491D881AB0A0C82605F94AD3B0F964985D53C4CB80F05E1789D2546ED9313DF47793945A6BC54D0945BEFE9B39731CF8F8781E63444BDEF4F08B7EBA40DCCDD397750722962E63350545950AE733EE92FFB52F6AFD6DB0C288CAD7099500E55DBF838056042D046054FA63591B9A8BB6F94AB0C8E365C4C14000D6722A31D61A867B01EACBC761E05909317D76FBED462B00A5292E69256EFB03B4E9203E499AB4E4C4A15870890453A9AD958E6C65B395F88B34766FA014AAAA9AAEE7BF0BBF886586C2D6F706121A6417657D6769C6648DED72989B989C5676E771EFB031D5B8A7EB33DF0F4889D4055055832651AD86BF0401F90706CCF18E6745B63CFAF2E82C318C151D679E02DBEBE59CBD303705BF4FB52A9D211DBCCE586F720B4AB1BDA60B42D1A099334EC0E11593AF5194999DF27D40282F16E510A18F4EF148EA335092E53BC663766B13A696C60C2719636B1BBFFD621A5EC68E07F29FC279268FED30F2118172DDCB01326EED5B3744C03C6958EE37CAEB1B9DD05B69F47175D081988EA00ABF75F80F0287D5041523CC3988C91A613050F5B33CBEBBF4C3356AB19D3618D5C5A83146BA98E0C8A5CEDF51B117DA7D2759D03F79808E7C7EB909ADA073983E90ABD0ACB1E75DF3CC6AE5B228F989581FCB8BED9BC6945A385E243E321AD787FBCEA67B14B93A2237431C4CDC77658C65ADDAC86D1F2B9E0796BE13679E579040493510C4642BF8C70D084507599CC0DFDF54C4F28F3E0B88B59D94B371E42FFAE9CBEA052D89AC41AE7D24F77DE3B80FF31853F5DAA4B487BE956CA24772EA3D881EF98EF25594F0FA64DB9B1D71D4CB72D939E153F56445733090409DC844F75CC957D847CB1FBE8794606100DF384EEB2AC548C911E26FC3F91056CF2FB9697F7AF407630E39E9F7FFFA91482EEF763E1383220C8F92B4D38FD3D5CF271376DC27E587ED226B073101EE5C1B5E9D3A1F50712E72786D92C55D3B672A723BB8975512949EB0815F396168DBB2E26CEC17D4B90A8EE83E08DCBB992EB357DC90665BDB285B4D79899CBC48822A864200016FABD360EE45F74CBD4908E13E92453698C8AFB7F07BEB0A0C17B13AC6A2FA61B9DBBC1372A5A3D9ACB8E71C12E2D3CBEF5A22D89D3833314CB3FA4D30543B8B2F4410EE8FA4C7E48AF3BF81F7FF03E869C845E836C663CB884B4ABCF14B7B753BB60EC53833324B7F6E72BF95CDDBF93F117A3CA85EB7C1FFC945ED579187B263FC5F00039F35B3CB348BFA9BEFB5F2563B89B562DB36B135E53FC236ECE370340C42B6BD6DA14126F87A3813AFD0B3700A9A04B34C5B6D913628295D51F0596A26B61B80A277CD2D5C2481AEC652B9DF8A8121CF4675AFEFE39A7A34330A8A638BE5CA2E449631DE3CD2F37347258A0A8882F6085C00FA7233DDC64942B7BCF96691BEEB54BDEB9254781C20A335BB012BDC8435ECFDF842F26D900FAB46D81A10A214FF1EAB60AC48BB997F6F1F5758FBF22CEA39678DD497C14D8A06AC1FD6881655E034CCFCE58ED640DDD2274C365ABFFC8A9638351A8CFB43DD20035F656D4F91AB6700CE01C9E1F64187DE3280A8AF104E0B5FD52D355999371182BB20E1B9E8613F021D6F03319BD74B716B914EBF7A9200448717F324DB71E6E54A0BC529818853F47728747266A11B06BB2D395E84AA14CE226F4B46538745E3DD16BD9C4DD9D343EDABA5AE4F6C1E77CA58C6429B28295E2B42783EF5AA5E7376A6A728E5EEB58B2EB7A530B9ABB820AEAF923EDDF61B5318475A10DA7E7B2C3EC76AF98D5518EEE5B52B40FC8CFED7FC23AAF44E5572B725BF9B8B122173852116A47CF81AF39B1EA00DC0E323C0DA8BD660A19944CA03377FB3A932FEE260E5F276208D2E10B1D4D40695087608DF05EB03C3331B2894C0D2221BB1F5F4654EA813D50C6EDC37A1F9C44149B6E9D86E59A0EDFAA7ADCA370D8977349356268EC33AA6B69726BD1F2A7B86E99A15AB26039AA4A10DB9C554FA10E90AC456159EE25215CE66BB671C298391AAD823B7577927E72BE921633006361DE67F0D7780A951ACA8864093901D21593DC990F9BF63D819ABDD07AA5D872C3536B22CB35ECC1420E6F47FA7F3C4A885A45F84857097250AFC23720DE311B602D5701593B3A68D637CFE5152E9B7D2DC180E8749D71D1D7702A257D055E8F33CF87278B7334712E850948387477FFED0A08C678E52D2BED4F87740B71A581922E28AEE14315FB096C0CAAD49DF45B0D0A0CF86C830AC5FDBFCFEA44E657C1FBACA7FEF0B95DFDB2A211221934588001D047519537B2B5F68569DFC04EC4803A4FC282C03186B008A05BB158858EC8E39DFB5C4FD815761C7ABAA441504635959FBFE3079AEB234CF9B28511DE0917015360DB67CE1D7D75FDD17D22EA469487F599C1F1925B69F9F53B905664BF9F56FCC69710715CEE43CB3C420BA29E2F95025F32C2092F33FAAFF6D88EBA146535A6F5F5B7F062564EDDF8206716FB97BE5903985D5AE1F8E3745E42DF45EC9123F1021A0672BB7119B6C3FC0143BF1A85E828BF63B259547D8473589D849D62ED2ECD08A95756711B136583691FA2A8A5295F5F71ACCFD4407086BE0ECFF84A4AFC3EEBE9D5DBFFBE7D4E5019A09E0EC6858EDE09F15A667C3D30165EA7E4A74E9D2C0C9950CB9C892BA11B8B8BAB3CB3E3D3B8BAB64C48093350AB4C7DCFD955F1AA279CBDCED47890D0716C9D2B8850EE3862FA15DB3E7BB31A3DF20A3AE31CE054C1D3D37F2E404B7EE97256BADE8354106E2BF55C12B7463C893ADF4F63E6347680AF0FEF1FFFBEF217E69F49795807E3AEF8614930BEFE794DA8590E187E3FCBFD22520E389B4D9AB34B642D864A33E9859E51E7F96C6C2FB3D2A16E3FAA290F9A461B15D9E67333ADF6B0AF75D530F0537AFFC3DE012CED18069C797F5CC1403FB3FA21CAE47726CFBFCAFFFDCCF4635CAD3B5DEFE2F897982E99D8213FF5A9F3EE5BB07B6B000A4C0EBCD605543AD0FD05585ECBC50B91CE489F7113419088727265BC678A864FFF695484A43FFE05F15FECD0F01AC9941F1D821043937C7D04D040AE6DDD00880B20F45BEEFF4BE8D6A07D2302EFBE6FCDA0E3D7638C6DE010F3AF079C06E5C49AE00244347E97611EA8BE7C695AF0B0CCE66A22AC7D1228D9CA7882BD3A950E4ED09BD7A3F03380F7D10B1B8E481F07E7D779739BDE6F8A46B5913755E44ACB9E54D4EB86E6B04D7BE4C7823D565A7B44618770A4B84EC09707F599F78741FDE230435682937B51EE30A70BCE5BC518E64DFC0264251056FDC7E38417342E53858AF13994DAD925BC4294EA0C07083030162FBB389E4EFDCE8FE36F9B57768EA2E8F42979F1D6E1E92DA3D05F9F43D78C9CEC70086D1E3DFB782EAFB14987F70897FCFB5599C2716A35A0D46A1F026EDC67E47BF677F50B70F9F0D8658DA2A36D14658C6DF7BA71FC959304EC31A5CEC567C8D3EA6C38DEE716E58691DDEE16E5DF4F095953E4CD96A2DB92A714C60CE18419AF8E90557FABF62D05212CDD17A920EFCA99686489021C2DAFE222C844364E6DC22ED5B41CD69C946CC2B64642BE31C9843696B59217CFDFE5FBB4D0C68D8F8C2D2484AF7E506218771808E0F4479B952C21BF6EA9C6EFFE286107F0F2710221CC7F4156666CD7EC538FD23780251A0BB338AE384669DEE86580B9BC20F8D2982AA8E88CDB620301D1070CDF8993E74931F36C563478B6EDBA4957D1D30AA3713762DDBE1FCD5FBE2F3B185A6DD9E48409C0418AD63E7528BA7B114EC1A1A62411DCD93F41648A310135CF5616EAF216861DFE4F7BB1E9EE818E345585D5465F101F367C85EF9FFB1E0F68EE4BEE616CA39BFC4FE5F7C00DF1F5266F879DAE810F8D0D863BBEB08894B27C0D08E4510DF4CC5A18797B68853AF1269693E63CEFB25322FED11D5BCEE4BDC744D65860D1A62905D05055B07A911529977F89399E75A7FB8DB04E6259D0420A69F1D424A69518C88F00FFCC81F5301840027233F7E254CC44B3269C96158A67403BEB69E8BC65E7C43C0F68FA80BD2CE16508C3404A253CE982A084E08C2E6711465060532CEB74CDB1DAF3688045C2B07C765818ED6A4CA03FCA03623270E4141178F5316DB7663452A8008BB95A0E5214F0D72145E258EB29F80040847B8BBB775FF97D9CB1F31CF750B0B419ECDFC1F2E73219CDAA758FD3716C4B82E1803BB0B5BAB74087E4DC744A3774B03B727249D314C8DCDFF20AE4818B86FF8F97D0EE702ED8C8E80A8AF7A2B60CF9FB611BA3CA5A18B5004BF6DCEF61A037DE77D4C7F80CF70F9621887700FDA5275FEB9FB9916D63B48AB70D8C17D73105019364C9FFF31BF6C8BAD5E8A7622E1F71501F051AB3EA3DA9C3B5AACCD6D4638475F13D7D30805E03F3BC53A2415CDDE386CB98B056CDEB50C21581065FF339BAC085B0FC39953EB384850731BD7104C06D25F16F9A3DA31FCE3C2A74DFA7E4BE0FF6ED380C4F3B2225A2E3DB309076DC6C6D858FD6F20A797F22BDC1A0DEC949F0E7EFF6116A880E4451B68979459376943DF87442DEF0C783370BB3CCA950EFA93C5C2F3920500C68C39B391D1256CAAE843993DE11C586CEF76FE930CB12315B115C7F5FDDF5CADF740C6CAD31D732A705EFD83306508C4E308703030A6115E5D6F456DE3719963B14884BB59F3893A12D291CEB74A1F691A70D7602DB6ECBB90D02C249A73BD42ABCBF966A093FA244CFB0926D26C0D8FE761FF5316B42600F9D0C1DEDCEB1624038F340242076F0D62F6BCB87B3CD06629A1995992F1ED36F607F799A84E6D2BA6A8F87B2541D1FA4C8DD7D6571888B146D44F28F189E6DE963A4B5FA98A6600C31E301CEE024BA927EAB00B19863FE40E40B28DBC7246B609BC8AFF3A2AE79264834646161E256DB36D9C1412770298CC43EAA548AB8D9A155E252CDD858FECB22795A2A6380299B98A4CDCFB66031F639DB6D4EF4DA58C389104814CE1E8FB030FC87C700E4E141E44C67270A6089D2729B9DC89BE57B85AEC55321DD020D38813FB38335E53C2572DC998443A0937ADBCD984549F91AB44F0CBDE7C35D28B60AE125A9212A2EC808AFCD09286967BE0D10DFAF35994915DAD146A6F967937C1051BC1B57FFF7E15AEBB1A2A3DC6A42A26A404B7C902895623E63D5E151ED140B707DAAD6607C8B4718BC84A45C1EFB7115CA304903540C318C711E7F59FD12E2C749C01BDB335C40920D35291E45619280D1EAFBA1C2DC0AD0D52FEE7242A08F082B005A920257E32AEF8EE14347FF750187F8880D5A2EB527BB13CD07F515BEC089A8797043805CDFD99FD95ED9F82A05D61C0A149568F9612EA4A6FFD0C62948328F5718AEF74B75F5B67E855CAF924C0A2579FC55390FEF2581E4B9FD9B56CB0B40B4B40D9501C2C1FDAF4A5E38F95BE4E621D9236CBF6DCA70BD0F060A1C404DBD0EC8CA1991EF1614CD02A8831DFA7FA99C36B85571E77E5BD516973DF2C0ECD7F6F3098B851EFE065E239E6A8CA58338B39E958937298544CD6E9EA396F406F89BED8738AFB421E7FABB2D914A5904C7B2BCA234FB8053B7F631EF369FC9C1A8B0B2B2F0C4A04A0D7061E560EA745D4A0DAF96E1AB378D4A1E8DF238DC73AA93564B8FE186BA85BB51A329BA8D5885C5C18BAE12B21B9C8A7B4DB83BA4E5217162EB631008F5367F61E14AF8D65139BB990F5401323D5B0FEED6412F456FAF01263F6E9AD33CFCFFF5CD264DD5D3E78BC1ED1F160F40EDD306F1E22CA79F076F2BA4BFAAFF61B39DE578B5117B2262580DA2AD07D1B347BC1E380F01FFC9BBE26602ACAF54B98005074469ECED7B83F348A2145E3E22AED5B19F978161507C8BC4E379C957EC70B5322D23A90F4004EE0716F5C99943F9AAECA51345ADF75F3561611C130548AC28709E6FE3D76210CE47C7B4BCB84F949BF56E4D791A4304A937105D291D5AB406EC7F3FA3DEDDBAFB3A591777127930F0BB071B959937530D3C15D149F4301EE1DB019F28447E54BC2770F489C5F132CDFD5F5FD9B7E5410525CE8288C63AD6F35B4B20174CDD3E788AA55CF1C1A60885DDF5A06EB8CDF3D34832955F655DFDFBD665AEA5DE0E7BBF88492FABB67B8B18FF4B0D8C7E243383B337EB16257B75BAB10913254595F7898F37D3B65FE8BC49EC74409C00580947F0BDFA37E913AFD533E8A5A9A06AD667F45506D75CDF38C8626076CE9A79A55256055E7E19B3C48A5FD7D4952C2E13AF1EF46C241FC3F4844285C6D2D19D4C33DAB2AFEC120EFD831C24023DFFCEDE54EB55CB80C609AE58FAB24F6D25712630D2F9A1F52D4919180C02E28C804E96C7A47B2E8503A17712D343CF96E90F94D87DE4D447D6B4739DBCAF6A6C5E05480E968A3E4BA6430B8BA1D4B05260C2F812E2F01D6D995DBEBA865B109A3D24BE697466DF59EF552949F5BEC90551EFEFB7A2A0715DD4B52835C7D5CB1A1E81BA2DF7105DD2CE8DF261B7144D7B5EA68A947955802BC7B8E10B11BCD6D92B0E05A1795C16F555BA623608C659EA6EAAE6129C1123308B60713EA839D2A14F334BB16E73D72373F44B055A35212458102AA9323A92411C4D48468A0CADD75B9CFC2AAD4455809EBFDD06BCBDF4E52320BD1A113DBD9C1C97388FB1528FA89F267E9B00D9A2C0A54BBA99D8DCE82DC370CFD85A9BEC56593244F109B6F1C751402E53A7809A9489B2AB06A07966688DAE36FB48D87E1936E8F865A69EF37256E47BE0DFFAC6ECEAF536335A00D458F8258107AB34E129F4F789F3F32D0C8137A8B2CE59A3E14AF02A9DAADD2A64C3E8B9B656058DDDBF7BB40633E62EB7D144479E348F2AEEC8F9A1922167578FF094D968C719C2C3B4191F6053E6E8207AE874425B69635F32AC7085F6B44CCB1C356D69E0C8AF7D78DA1DF7B35B80135451BA27B025FC148596C208B3AE87DB24C03705DE1DE3F2F9F12F60CFB56369B971C7293166CB2C9B4BDC8C23E8F2254C966B67C7AAAF19EFF27852D22CEC11CC3A9AA911D7294198502E1A8A6049A2729FEF20990BC09B3B3CACD2D9C29F2EBA013DC9970974637229BA6A7D3E65A7D74580E8198ED2C016857D9D82E9B74F67B4D665F89AC0B678CC9815B3E4A47C5B8124D7AEF2F95D26ABD5680353CFC89DF60F2B59862C77FEDB6EDECF1D20F70B4C2A50A26B64F3C6CBBA228AC69B31A9A5557A07EBD9AF8B050F5EC8A2ABE0D631E59C2B814CCC3410EA1430E82000DE30DF0D46998BCE60816BCF1F1AD4454644A74DD63B8CE78B4C86484C66450809ABFEC9BC6BF418E567AEF868FC34AA2F65D1AD0317C84B5962C96DCC638E8C79C14DBA712F4CBF3FDECB3F1CB673DFEBE26AA596EA4868DC7D39F85EBE6C97DE5A14F02A26138667ED2A69706F58C3F2B01BBBAD533DAB0599CCCE6B402910EBDA3786E502EAA2AD3BC5C87DA69FB2A0FDBC95B056F7744E2AC537A496D026ED26C478AD75ED8ECE312C5474CA4837BE9A59C22D41F0ADC404231C66303823D0235D4C6BDB3526D35EFD6EBD3497C5AC05E317B3C5945203D59880B5309F7AC0BFF7D68D6ED779E81A742E14AB00A78EB61E16F682512870E28620013F81E082E6BE455ACD8B36A6F4AD5F2ECD4319406F8A53C3BD1ECBB609BB72D5E0BC4CB2E90FC320F121816DB78AE738A140AF8AB43C194245B53CDA2CAAB328459820FAF573A021D333AA45905ABBBB2A0008FA86C1CD481A8D8A3A1ECA6AB944FABD844C84C48B22EFFDD6C6BA9CEDF3CFDA4FB0E407DFDA412C2AD38D5D6996E422DD2F66BB11E8299F37FD35A79DFAB392BADE060354FC90B6D932A5BB8EE9A1CE6D66E4B04AF3366CB728D3554EE9014709B817E2F4B73C52C4FF5ABAEE53455C4E8B1579CCA9950F5A05208607F0848061951DAFBCDD751DAE4B67C71A8BDB613016C3DC68A6161A18A63067A9562FA3AB5AF111AFCFFFFDCA4C8D9A64DFD2A963FE7463CCF8F523BF9B23FA8B31954275C3AFCB1CA568ECE02A9B1E371D15C31F40A05DC6222A26CCCC8202D9AA3A7CB8EC6066278B26760ED8D9D913AA2639BEEDF7EED06C0B7CADE52E9B8AD5AB8E56BC7094E67199BDC99E1625672927B3F7FABAC9F254807ECB34786D20F1DC15FD060E9201BD89D9FD604E6343BDF20DC2D883AC54713A17F3ED75468AAC51D55E20E02E925B049D337FA7984FAA2AA6FB74E066990CA2F14B149359D7049C0B27CED3F61762636AE2EC6327E319562D8F2BFE1E55365FD360C9AD6399F97C670554013838459DA6A0F1174B32ED8E0267668C6B7B7AB2E0D8F82D958BD8B219745E03479C6638AA404011C912FE995DFFC216B67879CCF48AA0656A0FD5EF2BFC3BAB898B29FFDF3EF5C5CDAF52E5467A19B3993D15D585A2FCF3B732FE92C96586D1EB39A5EEB14F591E1171C0091D4FAAD9206E384B938D701C413BC517C7E618400EB1297284F403C5588EA68A561AD03DE215E6920A2D0DFB73ABFD2B010494374B1AFDFFF616E1EAC5A23F515D8141005C45DA1C7B38AEFB12D0ABDA5D05266FF641EFF6EC0906E65477F3082E4F44C560B902EE44878330D848ED6D55B17B3C2BA16DB184B7EDE98366036AB60819510DA5659215A0D04FD41A3F7C89EE45F4B08DCD8AD7C4A1029C650A443C6C6FF062CF7694198BB3CE0733ADF1BC1C83489B5AF00634EA89FA156B9A23AB9D740961A1D4E302C8D9B0485B65D7BC2F28A2FC2E3E08F921BCEC63B185EB179BECABC985133E78BE98FF38F84C52AED5D40C4E40106D513E9AFD3C88366159CE1F7AEDC73342B0475E399C0CDD1B076E8E3A2ACE1C6916CFC6856211CAEEE3DCA15E5F5ACC626ED03D40C38F40C32F818BF9E8A828927976C7ECAACEFE74E7989E97C9140FB4847A021F540845AD9745E3B59274704C394F0B4E58A973FBE7EAE4809AB47F2D1A175D94A26A7C24669C0F60B3E1B4EF5C2D2278C57240DD10153E6B8A94813971F57B148614B5FC81FEA60CE687188429C09E8831F2D1C665480FE5A9AB308899CF9F8DA9460D8CA51378DCE2C45C0EFA6386592750F9D715671485F659682CF71F67FC763FF0BBFC667B6A36E49FC783546ED828A559AE85B0F6D8326C072C0F6756E513BF8392E71856AE404C2DBA9B66B0C0FC016518C208BA6AB5D04F6AE22187E5B255D9815B6C349EC7CBDDF1B11A435C9E882C9498B1AF685E4B09BA0C110365FB2F1EA8CCA78073A9BC091472344D7556722090E5BE9F8F361133C3A7FF9715BC11BA4E74013AB4F466180ACB7A02592586D700D964160A14625F73D7AF33E94FB507997FC1E2B92C9F0E48FD52C4A8E29D972E800B2B63E034E21096780B3E53336A1A6EF1840FC1BE4A6CB0CF99716E395D6F4E4930235B88D68D2AC4D6F0DA94B7DF85CEBBCB63AA2B04F24DD24B0AEEAE83B1EA237FE49A76734375E20FD15E05E6D1D7602C1E842EB1A64E47FEE15FD05DE7672ED93E3F7EE2A5576F5A25A50890835E8C1D1AAA105230AAF6A9296CC15967032AA41A59969E7296DE4316AE6CB9D5E2516A78AD4F9EF53D656A80EAC1B2C0DF11283811A69D16745F934FBFBE043A6EDAF488973759692BE4C0BBB8D44FD12D5976A65C88DC65F7E2CE05F0539236C68B261D7FAE59DFF27C28068AFBDC78BAC78FBFC3A0A947E761B62E9CC7F7E0EB9C6528FB533236ACAFF9FA6D3146AA36AB47D0A1CE4414DD16080A5B0347F9E9BED5C3A0CA30761D605500EC2F3689268D75B26978FA6BC0864F07D946F5E35DE670B01A1C44BBCDBFB36812716C59440FE27FE24C3FEE86A628F1EBEDF72DDCF01375E00B4EA882922FD2C80BE1E746AA01D6852ED797EE8CC4BEF9D6CF13EC3AC1B94C9F99CDA56716ADBD8DB1A7585F0E367F291CB73788C4413B9EEF475C3445BC22132C2E5F2913B7DFD0F5BB31F47D3E14C189D548D72783A1625367D71AA40E7D4FF5474956D45B55E50DA8438209D1C03A293623980CBE3E48297E31F853F06BFAF5D89D7C9C408CCC365BC1D0223BE82AAB7E2B1987780F5405A178A4A3F972FDBBA2BBE7F22F2FEEA7922C582A8E9FE3C99D3F23F605B315769AD9BBAD1842280725D4F954245C8CDAC6B3022586285EA253D196DCD3876FCC0C24A31F286B6FF97A3952AFC4C8B73E31C493D651C9FD58A8EABA974A914B7708E3F1D1A3D99DEA8FE7308D18F77E7493D1E9756A7E75DB5AD70ABFE7F26F6F8C22096CFA0035D2E0DFB1AD68FB5C29209A3D0FE779DDAC9F56FB5A65A31BF4E27BD811730804D598E8B3E645191245A6DEEBB153E11164942641B51C3047300365127C1A68F0593D02F98A084D9DBEAFDE390511D869A38656C7CDE26E614FE9185948A87F9234ABC39F4E65737A0636D9D3584A6C4DB7A6B40D74D310D3EE28FF8FF74CE4C4AF55F18721D3C010DFCC398F74887E64A49CA42F3BFB8C80F8FD17CDCAA2373621745F581AB4C38E9EBCA57F88D832F01C419BD239FE2513A408966CEC3393D391EB3243348457F1F39C5A696B723A858FBA2B0DF85BD51BB8CB5EB7AC80C4ABCC7962826FE1B11F8D4E54595B195275674E86E6115F7087037568EAFD3008BC9C8E2565A3222BC5B0FF8A3B6B42C299B3CF72FB3FF6A5F4AFFDF2C97E7A1BAE08C418C17012D03C93E4451076D789F5E7D0CC0EE5854EF6B21F50FF85F7E20F515A9095100D390B810CFB8F08CC1289AFB0F18546593FEA994CE494D03D6DB9F9DBC26DDE9C01763B5763C650E592516DDB0B6B5CD2B30274CEA3895792C8EEA9B3F04AE2E86500B07CF6D49A432DB62233E4B8D7A684BBD3E5CD655A87F5FBB65CD207BD09EA088A5AFFC81D49F31F8F7C93D0F89A3B0A49FCD354E456149BCDE01731780FBD71A715372ECAA1D16BC7338A301ED08C36A2E80FBA028E58F96C109B4A3310621C24464A7585E29AA6FB018E8FF88956890F42FF8FEC4C9D5F3E489723EBEB50D4FE2B43BD8BA08D07B27CE71D1B1D44B6B8DEBBEF80EC29412871E2FE3392AD40421CCAEAB6DAFDB92CE50A9C877EBC7CC1ADAFCC96EC3850D470F2D09F361780859379CBD1F5161EE222F10C5D3652B39FC8A6F73808D7B9F722DD26C0279D69E473315B2AA70480B0B945363390849044348B6967F5C0381B6F9E391FDA46F352A8EA737D4C5AD83C603C8A596CA24B9FDE3A5169D65041DE7A6C7272D6916340B8D2E0A8BE7A29F29093D9EA62F1A95C7ACDEB03C4BC5EF4CDAC2B0C021CD4FCA2E409A3DD44B0B66B2779A355AB5BE5FC8664094A387A9916C0877AB88A882C3B605509D0AE7DADE6078B7531D0B7756EE1466A8B470CD49ABA5DD5993C3C2DB5A5DDB185981420E72D68386DA667C4F91065953FAF99F0A832BDA19C8DAF9F87FEA4888EFF2353625823DC2F7BCA85B29BE09533F181DA40565F36656FF14ACC847F4E59C3F79F2629124E69795A292C006D2AF3ABC94C2B6C53CBEF2A35393B4AD8F042D105A6F877F33B670D84D50C48EEC622E3EC58E694A8740559B5275283AC1A454B5302ABE69A79EB5BB72D5D06E1D4FF41F4ECAEF9B4C7C03B71686767D21CBC5388F3F91891A7B8D6AF53FCAAD1810015021E76B54AB2034CE4B03C52C3FD2CCF0436A53A650025A9B0CE2D3735E1CA0A049F810B8095BA2CED27937E2C7F263E846FAE6E7E9CC1AAA78B37EC817847DB4F831E83255539D91C8B78840C766F75187606116428194CA58B1A8499631A7FC88D72C92D4E49778C83A4409192919CBE52D038FA1A7C04C7A8A2B190843184208F907598139A508910F9DEE669B2FBB8DA78D2C82964E316566849238CD485B9A3153E3BFB45BC6EF7F7B7C85A290280062F2699C41810F87B8DB1FBF4F19A6BE785FC0A227C20ADFCE05635E5627E41BE1EDFA4DE8AB329B6443B71289D3836953812867E7224406918208424E89B2861B889A68BAD6F5384E66971F3152B32F2EB73FA364CCF012AF19B2893A45C41F42EFF9FA32DDCE81F29AE183D06942CF98B7DCFABBC05B6E1FDE72FBF1A07B0A78C80B028A1E5F18F1BDED6210AD135504EEB15392F416C7BF45C06918BE67AC62344D9CD04D6EB30A4F7C126FBC1E66CF292A12AF19B40989629A1E4CBF7A28A440E0573227FF7A074A5BFE83171FAE63395C330DE3F379E924042F126FC46FD4B14160504EC682536E73F77B4632D65C28060459AF45C8AFF3ECFFDEDB5547D3A3867EA4E15FB6DDA917236B11965CB0E6BEDB75EF37E0885BDA21B3E67B209F9C30AF36B0D441D4D5CC0603A81890D97EAA78FD1FD138C7B10BA6132E06A0CF029769270B08943D004C2652AA91BB6C37F6BB794E6C4460A1FC9F09CC115C381016211BF5FFC2A8EFEAB50CB4EB5E256E59A768085359C295F21C3910EF06BB10407FCD0BFB25CBF08EB70CF78DFC420D6818E38A0EFF2CCA8D8865FC246BA132E17B604CEB1F62C8E3B53F6A0FDE3E99EC00F3564D41318D8E4058AA0E75F718D495F4E8E0951ABA668562E2BA6A78EDC427575B528BAD9D0EECFCC987596130B29AFBFCF053D0DEEC36E2D6954EF319FF9824495016D714C367F5725E7070895CE67C714942EDA47E9F6E1889EDF5DDEB7FEEAAC731766D0F432AB5753736926837AF112C20FE4ACCBA237F4D93C5CF3D4894994FBBDB39080218920878F7DC7759645AD85E53E1B7F4F8EB3304E650A1C3E0765710F31A14C0029E508E2E2BB52DC78DA63B3EAFE08C54C23916CBDFFF022B3CCE1229AFAE3191FB78402CEE352CF2FEFF486EE79E77516BC151EC25C175528E64EABB6E220146977C1F3B395156EA5B479CF23A8EBB014588ACAEF9C9E40D062D952A7975C30A8D5C26C52E4531A833966EEF9945A1755FC59C799134C3C1573CAC7558201F58FE76E833918EE51E05F93D022B2A5256E38FAD8B06462297A654E88733D170A90A6A5B7E418822DB8662A380E9D5427984E518BB136B7641E5B9314A9CFF08349FB9C2100515D414DB8E7F8110A5D5C0462A3B4B10184BD3F45DC4C049AC4D38E51EE9AF44B55A16B2B747868A8E0C19C1E117CFEBD585DB7E41C3F0C56A06462FBE41DE9F9C0059640622E0AADC7A93B1EA2FFDD8F6368D6FA774B6EC91580E6AB42F3BD269FD3A60EF8154CB6E83E14F769F7CC59332334C302E60A15DB0917B84F3A7C7A563A8DB5ECEE51C159272E11122AD70299DD5783953054C4C8A7A9B3484AE2802049AEA50277F27E8B32AE33F051287BB5F6BED8B88B856F117BC1543A144EFBDC6D1BF6F0E718C6A08FA19F7E2F0F618B5CF36F36C701C6F94817582DA64EB1B48E99D7D308DE0ED6FC2199F2B19639B2447625FFE285F5420481157A396ED8F7E163868E17FCF4BBF6387577F63B5678498647147B9CAD87D7EC7FE19279E9ABFE7D534E85F3ED5A3619D3EF81F3DBB1B9D84AAE901AAAB10233034193D89CA563228ECF46ADC1A51F76CE8F223264CE0BFB045DF8590B6A5410C3B00D2909DB7E88003CD9228CE43D01CB48ABE3C1D87BE7F22B999BB1FC697D74D1086F3EBF5EBFBD071B27CB50C6EE242C0F09620289424200CA6200C10D85C471EFBEEF9002406000E50725ED7CBD50737413D97F405E8B9E97DDBF1AEE1F5EBFBC538326B8A6EBE3D24277D797AAD26277885FDC02F0F338AECF6EBFEFB06BEBCF6F64983C54621B4E395B9E0F713131E47155F245CAE2BB823B19BABCFFE7D4F7965C59E87937C267BBFB3E6A050E47CEFD17E5DF1F048B6B7E696A051704FFC0B3653125714BBB90F1F26083A3F16A6E0948D4A04EDA78ED5CDECD848ABD335EC0AAEF64E103A335EA41FA279A71F239A2D3369B062AE1C04BAB99DF5928CF7A9E4E907C6F05963E590543CB0B70E4D0F5273DB75636533826510584C16C4A22B9DD91DCE931B4C2B3D9085669A38932EE555EDC2A6E0CF2EC8B3151CF220668F280D38C73495E07A65CA444B74DDC8641056D40D2DFCD57C229CE3CE6A6C7B59523B0F8AB220DC851923238543183AA01EAA0593C325F6E9C4A2B298EC5D08C21C63548DB1387FFFFEDA658300FCFCCA26BB1EB4EA845976FC499E3B902CD20315048E2A5DD503AA4CCA138C3363D404D8784620E79B768C9A2DBC4062A9B8114804F4FBB9BA55F06D2B3978A624C4D13335AEEB762889A5B9F31778FF6FF45C186051E8CEF372E508C1CB132F31B9E36842A2DE5BDF3A4A098C318AE7F33B11F50240668F2AFAF3775B6C7D3396F5937EB0C725DACB3D90FECB201B8D50B5A28280EFF6826FEDD5626A9BFF0A9283AC7B356D682FB227829BD9F0087386FC1246D4A2C12E7F3EB79DAA7DEBECB8F9FE2898E7A6E1DC0CC9DA42AC5D6C342A1CF05D3F6A74335E80C658FE142F3C216FDC351F97BC19A780291831DB69FA0E8E6ED737EF1F75919F7027B86D859BF2446C59FABBB0F3AF714A108A31E6EE417D0FCCFB7B64A9219C4AE0C1CF6878E90907137C3C60976B00F50F3FF230E9EA38A6319B155D011CDDFB8D94BF1F8E2A64E8342AAB410B6665FB66A75686930651A5CFA63A3195E2F601C86DAF301BE9CCEA027ABA1D291F7CC2E60B93B06D72B93DD11AF9D0AB00055A7D816577ABBA6433B609B8B2A0F5B5176A78D84B78D692CE475A1084BEE21D10EF216313F053C11B5AEFD86C5DFBF294FAAE8D63FFCFBB68BC16F682640225D81D81AD161168C7C7A0D57DB1311C018E444C0F09459F6FFA3C2F58C8D786258DD115A44F47A7F9131DB12A7C4B2B59A0612CDF2795B6812E8CB2A1E53F1F1A0F9D7A7DB873EEB4BDF5C7B7F28D46632A03015B2D432882A6A2D19B7C0BFF3F07AE1C19A9CDD4B950948094E6134AA891E39F771F1DE14CAC6F6318888D3DF782AD2138482CAEC2FFBFAB9AF4457C677986058C8718B6FC7FCB696682FB0255F3277EE270692366A0F78F6F476DA6323035B67EC96E3FC32FAEDF6473F5017A918A5647714DA51FAC17C5F1B4ACCCBA69E45CC761A7748AA5D4E08C50C5BD41A4DEFA4B80E3EB158B975EB3D796A3FFE92FACD3C349E5414F228E405C10E4FBE413BF928539399B3F2112DD0C60998A9CE27275260E048FFF6220AB67379FB166529D4F282805185FD33362577E79E94746B27199350EC99D74175CAD52CAE285BDE17F4CC77349D561958138EF9786460C71E8A63107F424A7D8432A86796A99833818603470AD7E649A277E0875BBE41CE1B029572E8A61D5D84AEEAB960D931CEB33B7D41FA8AFCE96C7AE24BD65F62A2360DC9A9B6CCDB2636B1FBD614D8754A413B960566D18C8F272016BDCADC63053FC577E7AC5325D07126A0C1122FF45277E7C41FC875E9F680854B47CA0377EA81F1EAB8EB9306AF0E1447DE1B73081B08862191E730FCC4A3874A272E203ED248D7BA23875201981479AC5171A422B960E848AC6DB118F7E04974E64380EDB83F098F0B5052503815B13499578FB7AA33F4DAF5DFB4B8F43D71F4F1354B1E8ED01A17622FA6BA93897204D285EE48F62E0F2A61AD3E56318A4DFC310BCCEBE9E98E6260501E84B62632FF804DFE3274014250A69F8DB48ADA9B713A69264A846DEF1B48D16A26A91FCF7BB4F3F95AB3BC348CDC0ED5E38205D452CDC2D4491AB3732A5019EB4D8D0A8F3DCF637B0A360B2D08B2D1ECF9C22BABFAADB2269A4A78536F104D5EE2979944AF42C3DE2D3F752CB5F41E554F06D91EA0C81E05521658765F85DE24E778B6DC8CFADCEEFAE111D4534872A1B6E9159BF469A7BE1BD686DBE60DBF1F24C5BE99D9DF7A5B535C4E6AC45C4099A2674B217D0FA72B08AA53E4233C07417DCCF502D0945BF8619ECA6464F5EFB81B00BED636438996F14714FC70ADCCAAB895A8752AF141A15E6522D30C909D57821B29EAF4718CF6D22EAE752B09C52D93A209022360E90500A34F4241B35744DB3A8A17FC806C65C7415759A3BF648A0D957633326120D08F97ED2A420130D84BC2906CB13991CD23AF259B3FE08A8344AE56836E96B7C6455DBEAC4DE7FE0348D618E596819905E02BEDAF8E5F1FF141905BEC7008DD05CA2B43B41F37A13AAAEA55F12691D9CA0D7D7BEF4453E79CEDD644B6C90E6353813501375EC8B6DE9908D83DB552790715539564801FE77BB0D7F4881FFF4BA5444DE0FDCAC7F8746918F18EE22BF62050F890747CF2280CC5AF1DA65F375C985CAB94CE9B4599C0465EF6D2D475EA1C3D1640EF87C8C4EE70B06816901A6EF4B4A1553648C3A455035741C45A615BFFE7E455BC7FA004891CFC26BF47AEBAE3B7A17B3ACD4D302A96EAA9D6381D9A25B91FDB47F2288F8AA43D4270603814A21BE825E0E2FF61F2503BF2858DFA114104FD5ADCE34F14409D5FE6BC9E900308324C5A8FCF28249671C3684900B934FA9906ED058805546A86853E40F8F86D2AAB21110B93FEB1CFC7A75C6061268639F31D4F69F7F2346465F29ABE300F516A00D8E418F3DD83E3ABCCA9FFFCF31B1608CB39BAAC5D74D451AF85778C0B2464EB49FBA38954D0140BEB8EC3DF444258617C82B55862C3A7566124563413FCA1821F15CE24333A806D57C043366CB4A728F3FF757E2FA6753C0EC467AE66B611528F80ACB5BC202FC8D5946E762895D5A996FECAF58F2B1986AB729F994385813E9A23BF34D5825F7BAE55F1B9D27EC582C2C8C325D469D0DE68A8FBFBFAE26D63B6D7E922C260D6E595145FEBF1F85E8E044799B46BCBBE684930042F276751B70F96FF8EA887B7BE0FCBDEAC189CA90B145A6623EA18F69DF01DFD96B35775EC84900FC55377CF48A50B737A73CA40809719A42C8BC09FFC92F594EAD3393554A209237065F51DF3210FDAD7D8928252B563B40FB2165AFDF6FDC53C26E79339741E5487F15769188FC9DC68EA2138AE40345C02DF79FA1BB808206DDAB22017007A4900147667230C0C1ECE2C91BBD879B3CE5B7351FFC56AB8F9CA93920EA27CEB55012FEC47762DF0E583310D3680CA1FB5013A200BD3F86C180515376C490F814F184A9E9F45FBE04A45857992EF94E23C8F0442DEA41928D33D0C41555530F8A52D0041CD0B43FD5CE2C7CF3FC70C86E219741B85F9E94F5BA74549A11DFCE63BE58688B193E767D75088F98AE6ACCA1EB80A22E1840FF024C8299589A90950728A315EB336C3B1AC6B2FFAE4E575C4C49D36124C1355E5AF866648DB1DA126D66314B15C08CF35875AC2184CD8E1E2B94DFCF7E5774EE9C7E8434EF9FF37F12BAFFCD8AC5EBB59E3A9A8ACE12B3AA8BE9E6026256F9294A7020AC85DC98B3BAB041A06398D986BD8161480CB645372B6A9471545042944148B8B20E6E71C14E552A66AD420D369E70C771487F152C6F8526A66CF7C40F7A51E4B0FFCCF532E32F1A7DCBC1810913B6B8DB460F4B8B0D34AE406844D85297866F1B3B82B68636AEB4553EEEC52106619DB9C02D8E1F98F2A66C52DC350287DF4E11394C278F58993EF0CDE9C41C9ABF6777DDF9573172172209A5D13549CD67C2FAA9ED0BE933E2FF4DF9DC463D375C2F84E9C84AFE483FD310E018EE53E5B36B89022502E11C0E3E0897C533011CE6976DDF4DF83F8165E4F4D2174CA6D3799EA2F8724AB60D385435CBEE6F5C1AFCAF87BE5B402EB3B13C246598DE732C357E4C4B6D9521073EF86B444339D3458576417E12D66524E8ABEE90395B645D89B64C9F7444C2DABFAB074EF6F67020ABF24E94880AD22B5E342BAF2BDB7FFBABEF4FDFE42B85D81130532448F51DF7F1677685C65B17AE03DE284CB3A0275D31291DEADBF4F673774CAC7A827D263C22C2F93D3F3D4D9465AF131B44DEE33CB7634951F138056FEB89C65E7938AB086ABCB97317B44D72FC7A306C7D13372DC00D36DB49BC6D9DF2E53E1A3495ACDE0FD89235F859492318ED86564E6E1C21BF7B4770E8867D53016F2B37D060BB3F70F1BB17AC85993D615A3D460AB7E4BBDE14E1CB1E297F04D622BC9FCB7DE883754A3C3A705BE452E806F7382C7FFE319071FBABE1CF26F9E6F1D22ABC46949EA9DD29442C651A57D95FDA2FA60BBF31AD01C4D89EC0972DF4575AEA14C9AB47BF0DFB06F179AFE25858D9039B36D735E87C327832800DCD98AA93905391E37590148C8283C5C901AF84144E3965CC893A3B8DF11927A79E0E799B120CF5D3BDAF0B0CAF1F99E18E1D0D87F8F31E1BE060E57612B4CA4D89F479D4EEA7E47E2BE3DE5C8BDB972A182DCAACCA2E232D53FD8866944891BC3CBAFB002582E91A035D37101897F7F94C74ACD22F1296819E09961B0EB4057033AEBFBF2B66F2BC7F1707279A7484B12B36BA7F6F8650D59EFE09EEEDD83EAFE7063C96207D9DA8940DB9F4EDA6723274D667A85C272AFC00A5E3C7B8AA41BCF43ACF7542D6CA4FCEBDB5F9AC773E98B9FC04F27D9B0ECD11062358F6EF3640DBC3D5C0939D285A33BEE6B1E5C394EE4D02E44C13935FB12562F4FB48EC34EE80F202B9CD71C30444E29CE5B224F25181A08A523EAB4F52EC13D5A765B95798155BE33B01F87198BF97C8133B80CD250DA459300E3D20C3792211C171139EE91AF9C33F529D843105990EE1D352E42E22807CBCF54EABFAF0B176D1324E78EB8123429154D55FA1AB8DB334893974D8B161402E58122355F7D2865269A83D5F54F474930A440E7CDF6D54489E581714D3E7E9232E3AA5995279F6CA64417FFB57690D3DB95C7919F2A929277EE923E93310B33C0391783D4AE025E46B729B8CB330849F9D36719AC37EFC934D9FDEEAA65607547F53289A036630292DFD07DC6D7915E5933E6848897721DC9B743E3F285FAC19CD9D84BA6FDAB77BEC201F9FBCF93AB490E475EE22F654551ADD61E53611A8113F384A338473EF325B7B3AA848CC4788078058152634E44EB0F7E5C06DE83E5962FB394C68814FCCB72E58923F4EC9461367BFF178BEED4E7373B4107C69BAB25BF5F376CDBB2AC87B6D717FE0019AF6C6FFFDC8EF46C80DE54B3DCE9E55313DDA82045F40D7CA1DC341537ECC8676961EFFD1CE4933B09F31B3BE7810791EF947C384B2BA6A2EE69CB67DA8B89A0A7E38BBF8A3AA210004657C1138D1484BF60386A127386381F29FE88379FADA4FF49F3DBD5BDD6C87ED76298F2993D3ABE23B579D142E7D73C9E8BBB984FEA2C6A5CB171BF0D04B9040768926EB6F67EF799B9A31F94216D1AC842CF657A89CC0558B1BD8EE12C72C6480C86B9E8B89849F87B032DC6D8DA57A94184D3471A1BC8788E871420CD1E543BF03DA1BC428D2B8DE92402F08CDC3595AC7879AC6AB18FD175A608C86E4CA0207391EC683E06AA70C403AA691B1777C72D35B5DE3BB51D621D265568C6B827BE8BBE73A7665A9E236DEB2A0C0C633A5A1C9DE6E608F7EAF63853DD06C306A73C06516FA3496E4EB9D1493B69D1E1BE24F8E8988B4A9486734FEB2C60FAAD34AA495A5AD9A404FBABED882645D1A146A62C04CB98F68BD3C430D34A43788661177233339AB85BDBE6E78C00CE45B5F16B47856AD01B88A730A9BC331907FFD7C9D42EE2527ADF83350784F83C82F7F6FF5B5EB0C1A4B51E3BB9103256A372FBCC7E582EE049166D57D1E8AE9E557015999752CF18E51990A932BE8953C37232F42E4287755AC4AD3D32372CEF05C979A9D78BF3F1B56459B725079837ADFF9371FEC289305E58A8CC5DA67C54A9A8A788A8DB70C9EC8AC89EBD6A7675B87B575EE1706999D7647A8C5DC381A57C710D73D7572E386315D3E5411FB8EB0CB6A99D98D5DF2B396D6FA6EC4DB23AA205F9FF3FDFE027EB37C22CFD9A3D0481AD22FFA4A3B430FC5D191102D6109D5A14FD00BC88D3F71653E40598B84490BC4E77F6D0CB89ED35D196361D699C65E523673D670F19BFDF074146A8BA79AA1AE63B70CF2EB1065267423C11236CA3A1DE57C78B916D13B5B02091E525F9560805180CACD6FDB0B86D0340A69C7EBAD5D92911C03EB9867485F4B95DEB7DC45EC681BA0904504C6FFD476EEC6C933D43A05F1E359EB418761DBDA9016596DE13C434BB4869AD91E9B580A74C60334EDFFD29D7F927B86B78E7A682A3C15FB861E7F7AF27F9D0DCC0211F3F8E8A084B333D8EA7F2C13F7C23CA5EF15D0608B38F0FCEF14B923E55BA9DD8C296B12FAA9E4D111D0DA5E810948C5C7858BCE8065E4725161CB65ADE5B4D8DA71DE2B3097B008083C6724FB677D5D0B515EF9D349BEDF9734FF4428D0ACF759E5FEF3AB16A1E30D4ECC34ADA05061E1418C9C70436563D1EE1C3B4896945780406DB085C46055AA547A319C45F8FB986F4D9D000DB77315CD9BFAE4ADFB5F99E468BA190EEE704D255DA4FDF85C9277C9795AFB0FEAAEC207C3B43B035F7AD904D936F7002FCEFA343D653CC3439397EEB6913B36CC9CEAA2712775315E061CA769B0A07DEFCABA1899FE78F8F4C0F76BE06C9F18D8FB48216EE382DC4EB2C6BB3ADDA5525494163D7B0D9E6D3192259E28D17C59A4AEE425E9BF331CEDD9EEFE6180AD799A47520C610E6964BED1D59DB763369460B3F4A0C2F03B7375453447FA0D8F373C3F5CDD1F6B7E7F4D7E95552BC9BF13F015DA98AB265A0D2A7BCC7A229B0D59ACAD9DAF5095C6DC646A8F41CA0EE1A4FDD62E46C05768808C35E95248756B8B8EE79CE498132DD7B88F5E484F65452008D8FE2F17A09F20C5668852D1961D09F51B4459D0CAB1107BC297D255FC7E917C65836550991EA5C7A4208C69AC4F2843E550DE937D9CE31DB39834E0F72F2B6343F3918980F5A39A986130B6D410B5AE2C0648542489B2C500F15D4E6E4869524357F16ADAC42327B92AF3A511771ADDF6835D906580DE19356B844A9A2D310D97672A123528B64C934D19C7BC62C8ADE8C2CE01EE62812FB61A8FC5441198381E4AFC401CC1FE5F8FA298872F8743AF0FCBBCEF7EBCBBAE7A33360291C3901E537C189AEBF110DBC51FF2E5522A36F333CBAA1465A05705BB9DFB3F7DED39995483D5A4CE1308A2AF7C209C1736A7FEB078F708C77AD877969861727525086ABEB9B10B74CB8C71CB9794D0FEF0287DEFA869B3D18A99B7A379D565A7E872B1F2BEFFB16E31B58068FA2108607E3DA6E8A19422D00FC1942F7BA36AF28C5FAC2C400F9CFF0E297F2386E4F36BFB9398D5C1E4BB4AAB8049B0C00FFA9C64E870F46BB76C7A2211DDFD4A1AB18B02481C709CFD8968C636543D70A8B11CE4E7FF43F127DD95B2F1A2C1F7F951CAEF0FE365976278B2A40678F0F6F6533C66DC741BE3489F2F9F11AFE64C1E3FAD94174016EEB0666E8AC9A61697953BAD4616B4B385317AD324C653BFAA3F5EB05D9C864B510D90580EF0685FD5405B5D2820A27F10213B860B9A3DDA4C6C36FE050B2100C8B353F7FC0695F2760343332E2A733B4A3666C310861874AA3518AEC9056582F444AEB2A54C9868840887DDEA8C9994D172541E06AF7FF6325083342CD1456AA1C1CADE3B2ED7C88AFC4CFD0563DA06F74775F85CEE1DF33FDEAAF2D4D61414E5CDADE25D1AB12C0CA4F9FCCC77ED2574D33841A68D630528834BA22C3D55B15193AC60E44B2A603DC4610E4A81082FC5D20B79AB4893A1DAB643DBB6E62578514BF8F1932CEC86AC6BDFDC55A8FAE9EF1DA90C1715AF2512347DAB9068E94400DFEF980801EAF146484D572E3219D772CA663DA0C7F7449BE0D900DF0764BCE974825C91191A83D82D6CE47B7F34705C4F0A5FD5BD05BBC13E5C33981EC7F98599F1F5B9C9450004B55FA4BAF09FE037AFF4D42FCE26EFEA4533A38293646DCBB833F6950FF873ADFD28ACCCC66F3B4F84DBECC82BDED579597510D108B727DB16465DC6D800F0A938305AB119FD85B34E7770B04EB3A1F51361334CF02C14E71479C7AA031021AF25CBCAC8D72DABEB70B42C9C833DB91A13D4F74013A2F33E226FC81DE42524B4B41419ACA59DEF13D7FF64FE7ABEEDD037C4342D77B1D6FA4D81C255558F900ECDF815824DAB465BD16F5654F4A063678896C7DBE6FF943E8E169A8535B44C51BEE509151540DF9B430CCFF17FDF8E524ACEBAACDCD15CF4586C4AA84B6CACC4F9FE2E2B3693811B8FAAE3871ECDD6E7E36BB7B770D3582A7340BFB28EF635992B5597B40E852888D9A0C833145923951669B09EA276FAEFCDB7DDA429E23629EC2FF653D1BFE3ED4CF2D610C1058B4F5908F4386102DFA19E3507F5B19DC98639DACD282DEF0662F2F349D6D111C037F7D22E0265273359FD9736389DE7D0569A1E2DF01412DCB6697D13F1D21B2945A88182406565CAEA8E799CA25518A89994AC245817B3019806DE862A0ED144A2BACC3BB85D10D56BC1913321A0AEA9FEAF297A4B8B687091C18EA6C93ED872DA4ADE5240969981631351A8C015019D185C3216E82A36F7CC8DACB6B9FE3A2171399B87C8BF200D86DFD0821B9BAAB4C8797D5BB8958AB880F6A27D79A52CE4F8393875A9D43562ED6C61700B9DCD865B7BAB8BB3F4D6EBE7ED701FDC90F259E7608ECA3390895F22453E70E56D405E120E643B5A0922D85485E8218113B6A514ABD4FE41F1088D4D469C8787D1F40A5BDCFBFE7E9994B33A747EF59CC0A4F23E198AD9995A7E74CAACF4AF704E59F7AC491FC88DC56EA76D9C8B1BACDFFB5D4135A0BB06351C5EE97618B738BC7EDC22F20A3ADF578CD210E5430CD45237746CE1E1071BE7745C15E88AECE539525F8D9A100D1413F63E5CC5BE7C21D8C9D29938363CD58AD9985DCE7F1E7ADA633B3C599902018CC6E9AF99F49C10D65706A809F5D7834C95D34B018F6E8146F29E12F77BE81639F52DF27C3D988EA28D79975BC113838119CCF7C30408F573B9B51DBD395398126E01187CAF819D56C37D77139960A5AECFA266C9F89388A92059206CF551869F848D2D3AB39BF189C8EB7D400946DE7F68B849A10DD1AAE68DCB41BA81ADCA6A31EF386E2863BF8C3DDBAC41CC2B276B1FBE6E00D88DD9D224D0AF73418D10A71F5FD02632100EE4F554CFB2EF9A573835EF24A55D607860FAACF4838F40EEC60AF5614B05A5CB8627B0B84C031911D74E0E3D15D2AA6BEE5FEBC41A80A94A36A11131507D14641572009CFF12E49F65A6C2B34BC8A3BB9249ED0D41887D1CBCAC27A8B7FA8C2D2220461A1A28BE314988AFAD860DD36342643CE02EBF59E6D7EFD75294A50AD90372102A042D45CF6A4B2FCED3A70CAF2FC72D482BE5C43B6F53F2D0CB13B716D173E122CE4945550001168D04239313548BDACA5C36287C0D80AB23F33B9108C657A7656AC86529847240AED1E4BE4A1D85285EB3A013A40831AC6D0D256425342836D61611CDAD77DA35EF5CBF2BE103D21C13BE1F6EF2D13BEA778297C2C30753A494F7A4885EFBE72A658678939A8D1C0DDC50CDFD08009754E27E4E7A846034E24F6C2AB1B256032F3BA5137B194BB07EE3CB6156FA5507780FC0346BAA5B5D178ADDDA430DB749F62E446E5850B7B4B8400B27659D609081C01B0ACB7B9235CD6707B1A367E03FE314E11C9401E352A424B7DC828C9B07CF2E409C2F7E317D6B2471F24B18C251E98959401EEB3D390FBF36D57647E51E236FAEC3469A036614FA451FEFE71587BDC57FD6F2F75F2A500627277196986C2DD05755F3F8E4785B986DCFEE9EFEFBC035BF3C920AE1829C9106A29D6AAE2F2B73350F80286C8BB7790649C38BC01F7C41968F896955B7C135FD6D8A81F901980EF610B668106CF278EADE67F9DB3F848192E1815C95C9F0716F72D61EE56424A21014F0110ED409D15BB778517160C8B851DCF67DF0E73791B362D902C2498DD03C75D6A3EBA1801E10F46ED69E708769F01F6D43A2585C31020B528C617405438AB1B36408A8BED9BA6BAF5C01064CEAAADFBC4BC9954FDE676DE76E980512F4EF6E46023D551445F20F81C8C8A92870279BA29F21D13B1767D2A338D6BA7A42C1828304AFFC3FC6A6731EC3938B88ACA178891E7AF11054E6E5DA657E2D3B2522BDC49B06255A3429642C245B0F52A0D11AB6A6376BDF00EC49E20BDEFB866965E31CEEED19F08E2BD5A308FBFF65BE7E98196AF22A18503B603C404C3FE9C536112B3F8913E5BE786FDCB71C508F803577E428903DE6A16BBE3B5BBDFC7128ECB5BE2F8AE6BFACF1F4EC34CDF35BBD41FA46050CC107968777C7F82BA42AE092C25BBF3C5922E07B004E8321188C96EBA836A3DEE8132719DAD0FD7E3E047553AE395C86EAE4FF0066A99C388208993F5E15532309AE00DA6962E2A6695EB51874209F8EA95D90FFA5425BDE213C0063DF9A0146AF16CF9EF2083EED9188E5F94B05CA8A2A70245D4A5C1A7A965773E107D3E0BE68E6B139C4D703EE29943F47A76207BD6ADD4F7D1FFA39FDF9463B45C0E6C59F1AC5C52110CEC705C3946F91453531C7804777E8066E0C80DCCF8F799A693E2F96BB9461BB8C7FCCB1DBB19AFF1D013FD7E7D2A36B2F0978BAA5B69B9FE76BD7E563F7EF2E175A10412AD5963832083DE48FE4AB079DC80F89BA19CEAF7EC23034065F75A4F4A3BC7A703DA74DC6FFE34F1DC631B8EC32AA00C56EB719168066786E51E29779E8B50AD12FA1F60695CB174721F01ED7A178BF3C2CF92395E669D833D47600680E62C861305AE99DA2609AB50C4BCA0D8B42B2BC6C4D305060F4BF8B658BEDE55B88521CD3D3E854DA2624E7024BAAD8EF475182F4F9DC40DF0EF2FFED586FC59A8E86466D935662A211B4075535EB13C3ACAD85EA333B54A6FC62CC0746E88D3C03EE76E3513C062114879B52A38BB2339FA49779729F9C64639C8914CF5983652DC58FD95F090BDB8509F3060E0813BCD02CEA19224AC9B3F26C7211EDFA39DF6BA3BA4D3EC95CF4BDDCC09D8B14A16DD14F121C13D381C8AA547266995E45212046A5D5CE701401DD1345334F5118A1F6496C96AA65CE3828727BCE827748DC074DCA0311BF77577CACCCB2D2B6E03B24EB3D8E6F6A151AEAFBFA1D3F2EB05D207853775AC0AC743969012C3F539D20D277127FAAE6D2B6D8FCEA3A84A7CEBD4686085F8536E01C65B07ED801AB2253A39CEE8A62F02131D9F3604E1549FEF433ADF260780B9482AD2861D0659C51EFF68BA2C6CFE945F05633C754F475474E335A3474D758C6338B20AEB59C25E2732FFC4398F064449767402567C1D6DE31D63717B3238F36D9B8638DD14C2B1ECCEEA3AB80C4283D0282BF2D55897E1DCE26BBC1AB51DBCEE2F93205A4A2355DA12B6AD7BEFE2146F5746800CE588D7BCB861CE3C9E0C448B8D79F6E4B6E9B35C3469268007206EA71B462E094F7DD0DA7F764F773F44F3A8C619BE4F6CA3D17AF8832010DD04B46A4838D40AB7BD18AD76A8D3A0463AEA6F1BBE6354E0442F251B61F3DC147072C4FDE5BCBC03FE9970951D66B0E3F6FA7EC31EE6E4B7A2F2A3B81925D233022EDD501C3BAF7264F24F4186B237DBDAF80738629B2C0A48088A746FD113A1A15C320A2ED1613A014233AF42660D75F29DDEA4E5D749427329621C226710DBE2A8DDA954B602A4DB1D076D975BF36FD1D841DFFBCB7E1C81CFE9C35262048EF46935D4EC29FB4FA96B9A1C44CCE00F4DDD5A102BB67D87FEBA1BCBFC8B4BDDC91B16EEF51B4E4BE4C03D263CD193464DC4C574FA3F5F08B0F68287AE211B2AA1673E12BF619C877F231E4F75C755688E1FCD0BCA4A7EC0FE4515D92B37F893C1A0F5607073EC2E13DE73BBF01728D7A75830FD20D0DC14E5E22131F8FE94F4227D291DF7AFCD6AFE18ED4DCD78CBD12A580787DD260FF5499CA5CBB20655B861F7D95A31DA9AF4175890216BA5049A3B6B157BFF4C8A926C7E1FD1BD4CCFDA57BFFEC6FFE2E9CC6554E7A04A83E2E183E482AB1F44B39AE18FBE2197133A79D8C4964DF93245FCAC1C0DB993AC09EA006782B167A03FBF08FFF009F5000379818CABEFADD840529A679A71E36FBB609A5E2B5594F5E6A42D38F5993D244FEE8D4EB129043D0DEB8275C2CCA947263B43B6F86573CDB9771F53480C1D01676FE6A82B68C104541611C86FFE8367DB14528C55399FC83AD08C15EE501B1111CA8C4B0D15021385BDC5AF99B8C531751D2EC8572A91C210F94AF5EDC7D1D687FD716BB07E0871E3069199F1F329BD0BB02DD0DA27FD22915012AAE06B5A168C35CC61A80C2E341243F79992FE5DEFD65003303B9A9C07BCFE953A70B1B01A5FF7A819627FE3F475A6521897586C3E2752F340A960948A25744647AC0DD47635F4A176E4FB06DE8CC9387CE126352B28F485468066E47796827FA9A08DB1D2F4C9F357F7DFC250DBB715B23EEE41C2B0A312E2A94BCCB9D26ABC0A5D4910A301F8836AE84527D6A283A6FC081E8ADFBEBD8C5E119EE3F54F6630D2C3CF56567E8157D903665EA3651FD892E96450EFD5151017422AE6597C3DC85ED0EBCA1124A68061F654D0AD0B982A1C5487C0197E75BE056229242A5D9521BE058FDBB9C030318D3DB9382B69459CFFEB07F7DB1C0DA8C573401D28134BD62140C812A82192BF22C116C107E40EE90F52B7CBB891108D14B17908CC2ED06F8A410E7E39C2BCCBDD5DF0ADCAB66EED44880021EBE7DF71AA135ADE0B45C0A48844B9F803CEB4D62210382F3B55A92B0DC5186A336EE8FD83DDB51680438D232BC4188CF89DD1DF6E2E0CBCB6BCDCA2675DBE3D52A5BC12D93EA8C8A24BA2A7E7FC55379AD3FA1A2E51CA8997C3086B37467877660B8BB2A7C78C8975E0DB48269E92DCFFE84779371802DB61DB14C4E247F46B9992375C640384B9901B4DD9CE17F8F9E29192084AE94832157568A20479302F95F98D5185D40A440DA90D31D4629C90ED12FC4C6C64FC071DC72EE32CD8F8FB79591D2D7E1A76866930900621179804F1971791555CCBFE7386A2711491FFCE5B2A7BE16549C27632E1BB2AD7E4501B78F317259DD03B5A2419CA52302DD0ED9E9CB1EE7171494FD1E89DDF3FFAAC50E518F52B029907A5142E72C3E2BCFECAB27AA131114935BA88753197B7456E8B286F06FE66D53472CCFC54F6D50F3CF7BE5AEACCC9C5E80AAA14EEBBF1C76B5929F37752BEF80750EC9F416FE52C08268EFBE5AA97B0E6F0744B38B989B43DBC29433A65B7EF8DDDF4B6D6CA7140DAF616655958C84B9A11E1CE84E10A755275FADF42F3E29B41E0A917B4BB123E5998B7F9023EBA757AAE37C3E83E040B7A5DD9711316339E59D703B054650219B0CD9D7EB21F79FCC23F0BB19F7ADC8D815200F75EE726FBA975A107EE39A087D0890D9F0E27AFF2BB60A159AF34D136FD1E2E24E4D1005488F4A37CC63F03954BA4CE9D37EDFE8A1F90F7BB97EFF8B84F4F99CD1E2952EA2FD602B20CF5911506F6F5BAEF93886E5023E234AD99024C4D1F0BF577C857961FBA3F8E249C94E603988B11BF7AC0B95390AFD93CBAB791271BDD801E4959C167C3CBC60C668811AE499EE53F345235B7247C28A7248664F9A9A408549279587290410DBDB79B9A0AA601D867B204F9398C8EAD504DBAC34491DA117205A078279A5642EA2B4DE96C5403CA699BBDE2114A583D0C3BA90329641FA6B8AD5E53ECD57E65E33F416B188051E96308CD927D3F85362BEAC0FD35B150AFEA71D0208B3724B93D2EC06F8C7AB825742AE0BF9B2D8934EE9643FC1FFF7CD3E1CD2554DB41BBB61EFDF1D9CF74DB1D041675B2DE776E8E5C520D0D5563E98A657B04E893FAE5A7E68AAE6DC32DA3E7762B036E700FD8B49CE5B7AA16B0A8CF3DF1E122F2689661ABD8D3F4BBD118E40FB6CFD370924CB63F649FED6DB2A2A5DFE5ACD46883B4D0C81C5F29D311AF38C50BA7478ED7563AFE9CCFA735D5F9646E2451073E895B7CA2E96BDC92072C99045E9938A67C738434FB35B1C4A86D17430FD93B13B140D1C7AAC9CDC5D397452AE403330757E71B65C6608B19E38CADA4B881DDE54302504F2C0D7FF50AEBFAE1BAD99E7568830B928C3943F49ED0267BB454A92C005B697A9398E4FD7C4872509B0B0781C12AFC8679B1428787E3435B24C7AEB8E85D1127EA51EC42DF855CC465F45C76ADACE7A6B2C84091BA0F7CA273F3AFEBAD61444FECDD1DAEE08C436343A8F12CC9B389B9CF7A6C3AB53D85F4F8935DF271E3A2488AD967C1CB9EF806B3F6C760779DD51AC9C230A96FA381D936C47CB1433E016ACB50B2835F1676C3537C8EAB193DFC7FD8A5FE49D8A615D7C715BFC1F37C0002ACD16ADE751929FBD0905731BA2E21348C089121BD1E099376C9765C10D8F589B8208C1F0F5F246DDA46AFCBD7BA5934A999128EB532E46205112BD354BA815229FFB1F755D5D4291FA9A6C08A3006359A4AAC39E164B2AD92EBF87FD97F3EE562143D02C785FE7FFFDB2D9E1B39C809DEBA3CFB7A65B361F93130B4CAECA72654D0249793B09C6918F24C8F8E740E1D9A0BB48916231277C13048FCC27DD6BB8A61024900BF00AE4A6A1CF19BBBBF5CF86E008F08974706E970448243D793962E260F8C1E6E436F5BD9D344613E1EB01EB621B3659E5541B4F107FB2343B0D8EAA31DFDCB7BBB57496A319ECFFE68B9CA491B62537280E054DCE5823F81D09F33C7B24D852DA532F1A0445D03F3B14864EE51D8B7020234C9292F90276FAE9C40C74DEBFFE9DC27280E1FF1133523DBF576F64029AA107D5BBC26B9C0DE9758972E73F42A270B1FF391166651E79795FC70CFE049609A39A45C0F61E83B7C85DEA0703C20E72425A90796BA2CF905987B452E71DEA6DD3BAFFF247417DC32A73EDEFA48078908185ED91E5FF1DE01CCB09182D56390671BE3E77F7AD97334028E2B787BA774077C477BB4B6AAF5765872F289AF940850DC9222C5BD333BE3B350815C2FD6BF7A9A72310AC1392FCA87DAB0B1DAC10EE7B879A02992D657982895C5A117820EEB4ADBBD42BF954FA5F5D05BC26E70B49FDF000A77BEDB69AAA4FC21A6187BA65EB4EBDB644DFE7DDA84A742ABF08C2E0C8F54A54E4EC3329D7A2FED753D6871BE4B6FAB6E1186F3BB5A8137D3CDB09F50C8EFECF31523DD97ED972FE769D00C0D0BDCBB74E19F0BEC6649E615A5560AF1E7679315F6C73A30C091891CA47EF91822DB587E2B347402CABFBFBA9D853CF60A9F812FF49F2316A37258F7A18D5BE4EDEE70D0DB9D8A6217BB3D4D66AA8C61978AC9E4B2F170D1B6D143356086E64C48987FB1866114C9A6EF5E0B2B7152EAECDF2FFEE496A8CA4F50432AD1A2DCA09FA2AFCAD2DFF6DA96CBBE9B0664AF34294EEDA1FC12B025B8FAAC74EE46AAA5D95E11E796FC0DDA6591972860A7AE412B016418D7F7D77662C15A5547254DF6A71B5CFDECA8AB9EAF580BA9128E897CCEB8ACB9F800E03A028E9E098096FCBD229EC1D1C35A72506D2EB2E28F75F1E00A640DE260683FD52FA978B21B005D3A9EC1F9C157C047964128EA3024D0A7FAED1E9CB4C02231FF3C9C50F01F9A380E159AD979C41048F5895D25CC4C8EADD7847E16EEE2C4E80C8D2E74A2B3F04A03EC35E45527518693035A57AE11A6A93CACFC66DB2729068858305CEB5E73AD58F7CFC7F7BFA8166B9A838A894268442AB08D0B21409A6D1A4EA94E52457435F235C5E87BAD55FBE52FB6FF74157A8F0152876DC3B0D9240A34C16E90D6D7DD9E3C17B9D41B07D21691BC56A6935729A93AD06C38BB74065B5AD4F34A6E952C6F972B35782929FF3194EDF734F56C13433C58EB269B6BF79CBC79FE1AD1F0233CC1DC6832E9E14ED04B87A36E7E9B4402EE0B6968AD0955AA5CCE924BEBD72D267D0309AEAD4F10DF0433EBA753139AD9C55F694CE17D8FFF2BAC687D7E1715F60BD9A662E26E367D95C0C55DB459FD30B6CDE81AC035917D4E5372B14A4EE56B5949643155E8FB05FB5DEC31AF9ED7DBBA8359113487A0A7EA57B6BBE6D19B947ABE69E7314B2A8AD2B14A4EBD5E24C5441C33C3B406B0A0E7EBE6FD3C86DB6062047C6ED06A92629F02A8DD5B3CB1A9E56DBC3825D6CD504C122094C68E7F5232C9060D07FF36F6D56F1D6B49502F5DC1CC522FBF0A5D8A3D421C9B327A20EBEE8BC934D0F60AF4876E274A3CDC678C506EF1DE306E70482093D5667B1779B8CFC42723643B5941763502F4269A21930643891AB55695F6733F7E3ABA619B6A2E1B329B95A0A258F73BE6302B83E64D7AC8B4B4BD31A02EDB2EC12656A4C4144166AF34B9F4850BCDEFB189AF2F6CAC66CCC01338BDAC12492817C2D2AA0E97C0AA0D47E0309D26A666E69995BFA3A09FF18587D7BF2A67948BBB7384C9C933A8D88F1B3EE3051F12B7DBA0531A98DC8D275BFA0EC73E1E73977365E92E50C23CCD4EC592DAA129FE4ECA4A04EE2A41F68A4B7F91FA044CCD794B5C9C33597D043A7B4FC74EE64D174E576D3C8E1A2A6AC086E9B44FB6A1B79FFDF670A3C3686C09267AA22844373EA27B78F3FAE8A9F0DF7B5F5AF995FD620D41D6808E5420C34C27E5CEFB054D45D35FA3084C61778A0ADB25E0D95FB8559DCC987D3AB1E45F868A2B75944D9484179FB83F50A166846B967D7DCBFB5D53DDDC0BD1D0C76654D973AB5B35FD8E2105C0B214BF94CCE7A8AAD4A375A0BD36620B075810C4CCC36015B59827806BEA262C073F3D8C27B4BE88A3442F7637E4518B141467C463B81FFFA3F20D9EECBC88458C55F587AFCCF1530F5A012F5FD386F19FA4E6A70E67D14F32A099C7346D0104399764FB297C2687AAB1AC258753A33ED6E040E638B635BE0501FB9A5C97380A89E9CA2C6A24A35FCBC1E9EC0EECDDF9427399AFFC54F442B1E00913D2E0D86913B2F31F6807C7455194ACE3092072468F127C719F4F88FA75D97304E015C358916EA0EDE36BA89E4184F1898ABC01330F646E7363444CF70A63CD1ADEEA1703E11F20DF57B5DAEFA07F2594DE926A9B9E5FA7BB46C27D2817C18522DC30D1C00F12BCF92308210F3FE82D3A646746A6A18C7DD67A50CAC5F438181850711B5817FFA085D51F33D4E06CE87DEB45FE63A2437A77E3CA0D2AAD8D40177A79F0E13A22F7BBC815E92793CB50B50D2A8A662E39362AAA144D1531CE81632909AB9F2CAE819F7EEA66170BDD3F6BAACA1D9817E96B29368201FF7197A62DA60209DE80147F9A09FB520469480E575315B82CE16C5C32AF91C88CBF0A7585FFE7A109BA941E5B38BD16D51D11C1BF459D988C740C145604E5FD40531D1D34EF97E09917AAF05A1A0CC17C7352CA33751416B72705F3DD06198345B64A721F603487F77F034EB3DA5198925DF41DF683980BF30E93EC04E10DD4CAC01D3FBB0937D3777E306BE33B7D1F499F6911D2AFF6C1DC26AE5D72B258DAAFBA490F4A5B413CB98F13D256D7F69EB1156AA0E907B55C22C4F20D486EF0A537827D353296865A152FC418FF27656B64504B9F7F2CB4359B3FAE510CDF77AD3FD8732962416FFB64B617CCEC9277A3BEDBBB6B84E09A0621375D9208AF4DC8DFC051BD760416C7D96AA93FEDB95C9E5BDB740A3E97E6FF39AF8EF761C5478DCD265B3D850B6B92D820CDCE894B535645482EDDB79D7B0D43EEAE8E4875CA59B5DFD1D8405F9DBA704A48BE3109907A23FB84A1CD0F51F76E744FC55B76E47B3671B89D0161834A38F00DAB710250F4D45ECFD0FC7DC4C9C5E70B90CBB78C795EF6E53CFBB09E6D1001400F159E491943EB469866A0448A522B37E20AB40CA3F5178A7DB96802BDDB4FB226A5852943FBDED7C95283A6493A2ED154E43B03AC05347FABE394565D27D171393E8591BC028E0594129E73973047458ADDE0FAD7ACFD1771EDB19F1F800E6C97F798F10AABDB2B827D38FA7C4CA8F29332B0BFE51D0BF7B234E69454F2A745D266B4FCBDC96EB11C2D7A40A854DF2A97308F102A94A1D95F5F2B117932D67E70F1AEC7541C2B18536B04AF9B2DC5AFC76F7197C8BDBD6571715E8F5CA9D651EB49649B26BAF1ABA1FC2A2731F83244BE32DA0309698B8668E104769DE73AACFDC87764137D1654ABF395E211250941041E038FBC789D70BE63CE8113EAA2C5F0709746B425D8BFCBA48FED76EE162FB750445C27DD5172C6A574D86628AEC2F3A7F572BD1C7D03D7A01B73DCACE5C00C7C90891FBB9F25FE69133CEC9348F204B2DEE30B62FD3E66A30C10C9091FF2CB45C68740ECF62AF8076D4024578531E072665DECF77A31A3A4FCC3C8F32E8EC4FB7FA7CB96E4C28ED9C11BC76C99EB0C6D681A05407A2EC33C62DCFCD726FAA928340861A96590E60C26641FA6B63FB54BC5DFFFF60878B3E8D4FDAA999F12798EE2B547188C8F3F3D334ABE0DC567A6030D7F49CB342D6B22C460605A428DF510ADC154AFB978AE596699FDADC157C8C3FA81623586C6DD2E54BDB3A9E7A6BEB06FAA1812743FA78DF014A50B137B32EE9663DEEFF700E888A03A1542C3FFC38F24E2D404C99DEF930F506EDAB40350800153FFC498211078D1D22FDBBD0AF8F4B018DCE430E00401E0A468E424061BFCA4100E1680154D231F7EA89B5FC463BB53E4D09F0849FA5D93D365A0D8A86026110600D00268F75298502CC26771C2884468ABC668B5DCE7E65AA8FD2CB8DC467999A7F7847469916F884AAD104700FCBB787FE7547EB071D5FADC8A616CA0DAEAA01F3D5DDBE91D4DEC15762DBBF22B2BC310E82B19A539C38E14150A9203AA3157597FB8B5F717846C0FED78A66B49493A371CD1F33DAD20434C3D84145AF31DE7AE9C88276F538E40D8A64E10095070919B998C0546DA97F233F000FE0030A6689CC9D6B09ADC6AD4EDAAE5D04915DE23E5394CBAFCEF4761BCA8B8B042B56B2EA71A4F7A099930309F9B3B605451315D90F2E8658D683BE85BEE51D3B240FD3F30FB9CF495418B6FA8CC9F127CC03C7A05AAF46667F02AC582F09D0503432E50FFC67F44DDD8C1955A22FF7F7E6A6ED4A8FAC5B19A3EB555E31F996B5A5CCF89D72308A7EE58B6C8D9ADA3306A014C97C0240E9DE343104BD6480B146CE1EA0D4212BEC05F054DB9D7723971CA96F31B4C3A3EB7E62378F2681C983325FFF467CD991BF0BDE8873F09F1F776AFBAFDC35547A43BC4D97D5B23CFFAD78EEEFA3E543DD4B20C0447F037F5216D8C3CDA657AB4EE8E98F1287C1C0A66A9DB9EB40E27EF25C722760D19BE2A16F9139A95566C1AB132DF88354F09FC4D0314AD277062571B10D0758350F51DC22C9A73A3EEBF1283225BA3690D4EE1374CEB1487F6DDCA21A5B96067EDB61FA284AAC04091E320C8208229E708E0A1485BC5B5BC317976640FF79E380D4C4D0B26A9680DDFB5843D5C16C9A675DF3F152C146F7D08DFCF9AE0BDA2735B7BBE49E122DB89F632075066FA5528F6AA991625ED4E4382CA18A8BD92DF30699D2A9DCABBF848671C6FD78F85BC142122297096D5F4FAEBC736AE8634994E3C3C9BCBD05E49FCB8A7A1B7B02E8B2A8F4A832A31EC69099A383ACCDF3FB8A091C66477F89AF1344F3D58E00DF7F32223740F3BA7266998EA6791363CDFE3443B0C774DF3425685BFE8C6B87A186CAF50A75C7D131EE5898FAAEEEEF060F0943BE0A97A0A2C175E6F83D6EF4E9A10BF88FAE5C29451C8D353E554BFFA1FE62B82586226D3ABE11C6B6A137D3867FF808F184BB1B974E29DD9B6E5C0987E2BF1EA80D7766A86D1D4FAAE8E68ED03911752093E355B1C2C799A57EC8DF11A8FB964650C3C1FE3999157C390C0A7C3478BBB00D3C107A307CB16820EFC88FB75BF2129AC065E2B5AD3BA99A853EAE9D15A150F6F4F8E50CAD862C17D0AAD72A77824465644A7537DD0923E8273872E2C05ED7F0204708FF8B733DDFD805CE0415A46E9775291A8F9B792B08F08046D8FD1AEC810DD3B761D06487CD78039DC1656F4442214CC45AF8F94ACE7B33F51FBC3EE0F484D62E6F1C8140090B45E34BE213DC0AFAD21563C25AA6589FF65AD78A3B4F30B9C567C4674C15885F49E4280E768B873046942DF39ED877D2E1B4BE58E570A79FE7554A9773AE897E07BFA13E238CAF0474D379B7BFB623E1B5B4087D6950EFDE989B823C8506CD53A48F3FB5E465BF7BEE0213019846F02B919566BC22FF80042A37B9AB40574975DCA0D6950B052902C9C40251126454CBF9C4F89B7088DB5BFC7111AFEAB29A745480A14C812CF1106A4656A46D5DBF08A3015533A75084EB2F6F848AEFD86F260D716E9DAFE6720EAD7BAB10D1E6CA6CA5E404CA747BE913CB27F73C0CE2FCA85DC5CEBFE5546C59109B6FFB5558E38A1EE75ECA61B4654A4F06147889C9072B2BA70B57456EB4D1B42C85A10779936DAD4EB42C1FC8DDE5FF5A518F8EF869689FC99EA2BAB22DDEA95E0E359C40FE9F067CB4683DD8D8FD36E396E348868C8002B8B540EA0DE5FAFFB1954C9BCC463394856B1DD251CFC69813FF19937FD35A762917A16457A23606BAB831005AC0FBB08DC551E440B8FF2EBE958AE3C97CA9067BB0E0CA3701621CF524F8F7CF004DD71943F0FFFFF3EE14B7A64487339DD79B688CF7D5031B2DB2761300ED151EDD92811E4E166A09A9A5C1014B6027AFF79D4D82AE75DA8A9366C50AAD3EEABBC3FF0475FA81EA5CEDBA384A0BED1872EDB591FE336B38CAA4F14F0B53E0CBBB76D8ED0A25884B68ECD500C256095EB823058E49560C5A14DA3A3F0DC2BDFE6B6298AF8BD5CFC7A212BA0D848C18A1640EE55F2A2354BA0A499931A8258581E8C8170142DD19443EF5BADEAA784947CEE1642EFF0AF363031D8312B10C0BC7118B12BC7F0EBFEE77E31341E4C2DC997B6950F83FE95FAE15129738AB781A4A986760103A61C1CDB57FFF9698668FA3A5F20EB99FA8B71CF66492A8392493171EE2861055CB4B076EA41C2090899404139F6E1865F0DAC221DF182368E40D57EB3525A1C06D7ECCF514E2B8EDCAE7E092F624AA20FE7D8619525DF95925D2BA39FBB78C5884BF75DE1FE8447CA62079B8C1AFF56379EB2431A92A7380B558792E94A09350E6D54CB31A14CA28919726719718B3D8798B8FE79424764E257EE81F6877660C4A5DE2AB31103751A304ADB9A971C0244D7ECA93B40CB5AD9BF256F9F5EC0F246809BE2764780915C037A2A9A3DF93E0794430519C4E2B64140CD3D9EB9AC48972528375FF8EA1C7D501950F623A606D50FB4C734628561198B0F2CBD44D762A4B15D1A0F2C8F9C7EA154437C94924AEDF36FE527EB901688CC25EFA54CF213D655C355E97129ABFDA9F86EB1BEBBA4F19D3584FDF06403ADAE27BA15DE85D55A37807B3DB97DE85C06E82282153E272AF1140EDDE7225BF78FF811E8878C3C4D5ED6F15EE1C1DF8E89D97D1F3135823B4301C28175F9453330187D8B40E41F979C646CA19DF4AE4F3621C3B67C352CBAEDFFCFBE6B9F154E8A64459E6BA977BF46612E1BD0AFEA1A49C7576D15D2717FD31F593A0CFEA439FB7C6D9B81E4A54AE7E91854B8941F573E6A48C7275F9CA0F0726E4EB524697CB6786BD682440443F720BB15682C4C9553467C2772C29C4A2882C9E1610B8EF0B5185AA3B90BF832A515C94A25649E809647C9D439E6B824A2DDCC902DB19B41884ECD2DE837E40E1BEA5AEEA85B986B969D698808B130B53313C56FA9BE3764B546F64DC1C7DAE1315410C095DFD55E35892AAC8ADD1BB078C928A8590A5BBBAEE58EB780BA5B012570D41C9FB5E96A8F547C296AA8FF34846CA788D4D2FB0508444AD216086D993E9DC911866E0D5875903EDC548CA6038EC1A910BCF5D01677F777B92DB990F5C526D09AD76E237B9DF75733FB80FE41DCBF55B6ACB20D8D7ADD34471EA7CD9BFD486532B543A8BFB025A327FA03AFB20F97558F38BFFABA3FF514E867ECD29860D0D334AC6459E0F920211FBB00F6A2AE9ED7AE0053409A4DCEA9AD11C8A45E268B1328C5B2661BFDA59A17329C48A513A50CD39D21D1283912B03AC73088E76A9EA984FB548E3F03D821003FC85FF080E5056DC55836A160358BB5ECDAD0C8C21DC9DA72AD4D5B766FF7A30BD47E6BD5BAD806070E27A0A9FC316D34E9722684D1602C59326E93ABB090D99B983CFC6B15C86FB7FAD47014AB01AB18414DAE5FFC830FFCDAC0A5D9A1B9A23B727D8EE36A5D45EDF3F63A7A244B9242573F1CF69A34B55EDC522127C6F294A307799901854AFF24E2143EC41B93EE6A7098A03ED3B1E1D6F00DC905EF8DF7D44B5C23EBF23B7F8F83F25CA405293079C6F2D8A66DA9559E7311457244091AB56CE2D632552B70502AD52565D17989390C91D27405C32082D4B2A2B3C9711BA6F4DF896CE4D457E928574F69CDA5694197DED48C593CEAF2537F5A1046633B2D47EFC1D3A62D77BCBC9B6105EA38E9ADEFD1743BC85EE1FC04DAF893886DF8FAB2A61EE54B76F8D4FD5FD446CCBCC6174047C0B476CA49FEF61954CB63EC5B2F25AE396AB23762D84AF5F9CE367DB2710C523FF51B87ED0B4B5E5EFF9D759F9E133E42C46986AD4C087532CD464A776282B68999CDF143663629481BC1B3E0AE151128E4F9719FDAE4E1AB7EAD5BA43BF624803C490D3E9A2D3A9AE6DD350BC3E9AB248943C6FF0582FA2E79EB5571A6217F7B0E72A9A3B7BA4BE2E55241A984DFE2B8776FADDE5A1491095FFD74C245036AB31903FAC464413900A6789070AC048507863A74E5B4FFCD3D632C934878C80EF995DC2F867CE8995387624471FD605E9A94C866A79C470E155DFAD724380D2A0DED2FB2052F8CB04A983CC71C917623BB2FC74BFA876FDD576333B05BC2B9F7D0B98C061A446DF241EF51EF82A5E2ADFEE5FB3E1BBEAB3E29EF1897DC0C14B5F7585E96362EE116D164C52B89AC2E94E96AB8047E630D4A960A828E230859E284C8FC6E605BF17CD625A879E0C20F659171BF1CCBA305641DA0570EDA2E0EC67173C373BAA0672E9468D7F096D6533C733D3F7E9F6C6F332A31F656F1BE6704E0401A46FFEB7BAE6C1901505F4288B1DE48546492E15B551616FA95B7A7C27A3F5F82EA821CB2229AD926929D621B6D99AFECDC065A2A82960D63956CA00D97BEDC83AC38A46B435E4543FD9627FF6974379ADE33DA3F3F81F4AF275B1BF81297F7A27871C416965D669317C937F544B0D1A2EFF1BB55597CE1A426CBF61BABE44902627CF943CA8D06684A3C93AA01E678EBDDB4DD7AD15C2A20484A478EC1211090175ED1A3C29EC2117FE62BB1B36AE782C71568BC461238961204BB392A44F5234E07A8595EB882FE2A73F331866717FBFB2954F99DD897DB4A28D7D30E87D328D9AC320FC303C4208E8B2AD3A682091419F7621708F299D7B44EAD743B6FA832B7231A9107C3B0CC8A072294B13F5C83ADB1915856FB02E30C102FC453735F6DE2950D8D1E42196E9800AAAA4A45BD8A511294075677FCB669849C7C212F5BEF76E9409618EE0B280FB99BC17FFE69EA977B2FD680043BFAD44035620D5C83BBFC25E76ABE69D973905B851F0846B3C8043C98EC2833A839A25A4FF14306386468C4CB8C05B64BDBD15F3194A3655B2954C6B4454C93FF3D737B7C96B018EA08BC3AEE4FAB8783824372DDBB369BEDC36ECACF646775A01C421A4A51C2C8C50E329DF51C2A11B349965582CDD3BCD7D87B01C0F1792D3638650C6444A822C93465A260E8B0FD0376364CE2B85E7C522F04B9BA0BECF700CEFA4703840E7C5760415A4933F64F1A38492256B8D443C8B9757D05DF874892C1DC92B1F0E3851057B3DE597FE3711E03DDFCAA1F28FC3062DE7B24FF213B32C4EFDA1CA4EE8C2BDF825EFD54A914C5FB353DED37FC61F64A058BF1130411353C4A041A8A572E82CEE65D5CE4BCD581D3F1D4FE84D98E569BA1FB1D9924EB0DDFAF4107DA181DC9091F9C6027B37F8800ECA54FE2C0D6DA83E3601DF4CC134FD281439739680B9223C3010A1F96D88804962CEBAE2CE2F7712963F68159FCCD55F5953163677E2FA27DC71E9E578B28B61AAE8FF02C6647BECC084272FC27F1CEE73D3E327B3BCBC067EB99D4D581437C13CFECA1F6A8C69D584034CFC92932AF8AD45CC44C03A021BDF6317FE8DC68CB7A6AD4FEFC098A6DD562713625EC9A2467304A3618FA84BBA3378A9CA1A802F21DC60F802EE2FACA49CEA098F3E6AAB40F7968EE2C3271D73B2000F3549183C726929B5D4327B9966DB2CCF296E3B460E8D3DAF6E3B658F7EDD1B02EBEDEA2BB79C00C005735CA9AF0F6F89B5AFA07C33F0CD8F3D565DDC734050FE88B8A0481351F1022379C4F541D1542B4A06817852AC6722339B233AB6A548A50FB0C9D1508D96263C43453ECD305ABA236B8B50F7973BF799E6F77EFAD3F558E547FE4F33483BA33568594AEB177A64A8AC198B88FDA31EBA184EC43D96494BA800182C476B34E50105922ECF1080072A5601927A3A0E04BFDB642AA08F56C3B20CAC4C2A6EB4C5E77E0FBB537927F39E62EC212CAD29204B2BF92BCB445AF05CAC3DBCC159CF3E7552EEE2443DF017E05B798CC30F889F131EA4402027B07693C514CAFE35BF271740EA06A47AA0BFE102DC77DF871E1D46728AEFF3692A0A5AF4158421601A875CA056F6D02BF0F827141961BA3A275F8AD1E48C3ECC49EE1E04A009D097D6805F0E91E698B42E4D6FAE9D87215824F6FD857C4ED8C452B2BE88D4233AD8EC1624509350639FBC268DAEF793DD451B376E96A89A643FDEF5ABD2AA069D22F9CC0CB87EF14DE6D22A364FDBA247D1DB8095552D15A6D810F240B0BCF8A966D3D8B25CA923CFABDEBCF257FF26B84B8320C030EBFC075B4C834749EE42813EFB6A0BD55CA6A01D729E7BBB21FFBFED3D273EA081FA426A052BF12EC53B1B8C27AB13B1704364177D4BBE0783486BE9BB91985707BCA313A8626981F74FAFF09D92D87F7C680B465D091B92B11BA3CA49569222BE7E887E1DC07FDE93E0ACDB35240C7A99CEBEA8276F1663DC648B375839DF16F87CB6616B1159009BFBBD82A578449B64EFA75E833233F48C21BE5A0A9ECFD56BFF616B0F2DC1D50F5EB83FA2B5F77AD7F39792206AABD8EFA2F32A03F51F9CD88CF9C0ED3AA453F2EE8C3F905993FB0841792BC2B1A4CA34EB42F144E30FC443F19D0294B7FE9C67FE6BC88865013277B46BC8A17E83A08BFCF24C7DF83CA9943F2B73F173FB54916B144FBE6C6119022B4E7DC33250077F2501701ED9FBCB6226F210473F3857A2C8DEB2AE261E756639EF44C562531844B17B92FDC8FB1FBE45DE7B14B4829A3438D35AC6DD625CE18092B6F9A73CC0DDE2BA3963E2111A31E4F4A545F13236E3A2A317AD59EA4C78AF9FC77FCE1195514AA442A7C6E84224121417C4E0D47D8E70DACC30B24F7B36ED08D7DEED6603754F9013756D06717E7ACACB0950030ADEB31EEE90DE3D55A9695D17E533CAFF461E4CE31F3CACDA27813AC8C34B57EA2C9312E5DF2B2C2072100E8759949F6DB9DC73CE0AC348A87FAABB5841FA6120F8771A2C96F9C8E85325B239F8E820536EE6D0DAA266E2DFD802F290658CCB5695A94C2B905E029B347DC7613663EB66FE2E3F3A5731A5B47245A07F55CC086878443A35993E4B9BA4E55734016F80530825098FA9D2D5A963FD25BEE86B145AAAD9ECAE426CE95F0423C37DBB2104433D11A0E346061BA71F0988B19672D4D3DF1EC640EB745404E16AB33235B4B5A6F20E804C92B2E4BFEEF84A3169B4AB87C6111C2CA98AB09930812674C79B9C0FD6B36F783CE4C6237458B7ED32214755E2AEDEFA6261E87FC8856170FC43583D1052FF9B2AD1791A9AEB265781BD39DEFDED202CF51FBBDCBCF8F10C0673D221E8251DDD99981C51CE925F6AF378ED6A391B16E63CD2BABB611DB0911D9424D7CF229C4C712BC1A41EF63901D1562BF8E9E4EE978EDC77966AFAF916CFF0EE8A9EB1FE7DD9EDB8DE3BEC73F7BCAF8BFC67A88A2CCD4172FC27A73CE649152672167B370F39003CCCC6D4E3D153995D09F7C40D03FFC3DA45BAE8759EB995FE9F527354A5A0532BB3DFFDECC93EC79B49620A42A7AA59F8D9E8511249E226C1DC05462EA5E4A2D1946B951954C6B56E09B4C0438A020E7D668D608207954CDFFB9034D9448F0CD6B1032A34D40652F39AC4B99E3D6F00E776360E87E3246A209926C15D3B4C2A6FDBEFF02C051B61CCE37EBE067C61DC0EA8BF09363DAB2D2B8D2CCD611C27F21E0CDAD0037CFD0FA532A5AD2EFD08ACC6F06B284E9C2FEEF1D6244BB5C60B62845B50C248E53063A7B6F6F7F009121C5966C615F6C43F2094D07C23C5FAE7038FFB59D946AD21C4ECE25D3A12EB1AEE0C894C4BC5F1BFAF51D321A83D2D74E65F603AAC6D4E88A63668A53ED57C087A21ED0A3330D0038B6C73D84B829DA67CCC69F264FF7294F19A874A7B59864D5F0820F243883B9B982A44A07DBC24D9331D4D658EAE84F8D9C238282BF59F9B095742B63240A95556EE899E2352DEB5083E0BE6E6841BA23D4BDEB85BA7D13DA202E618C1FB1A01E5D79548BF857C1EA87EA66D7F048C39276D7DC161F7F62E28DE9B6335DFB5B9EDA301C2580416134324A89FF1B0682B6D995F040FDAE16E6F0074F95312D3D2B17FEF739389B2B15CAA46D5619B3C236123BB393FCD9158FF370A89AF0FB0776C71C2DFFC6ED4A93DDAE6E29B803252066C63B65C34E894AEBE3FD71464C730574065B2CA1E4609370812D0EFC9140FED5DE7AFEE921A3E5A1A1ACF1044B8F289F3FEA4848B8F016B2050AEDC8CE5115FAFC247F0AF0D85B5830890579851E4F61D44AAADECC1A3DF942707CEDC82D3185A4E994B2E69C5AF9A443BF587027292316244BB95166B4C3430284CCC4130ADB5E7D9FFE73F1D4F5562DDDA5ED8400A34CE90FAFFD712BFB2E7A858EED60FDC54F3351A9228CC9CD8D0D29C123E3CA7266B212F24152AD2FAF5651AECFF322867222B9FCD8DDB92E447FEE5ABAFA0FD396D438C217B7799780D041541A8277D84125C27E3848E548DB5CC8165D0A65D9E65999C2914876B7EA253933CF08311F976AA65599E9F581D29D496B571501F3015C87B52427306BD0AD17E8CF7E41CF72E51EB836B6F7F738BE8B93A99A99E65F39DB2B0BD4954439DF45B12A543D769E466010B2ED1AA51E24F07BE211444694EE0251182B787315F88CB646ED8BFFF85FF379A5ED0AD64821CAC1D20714C1CBC434263D1900E51D639ABE3A6A2D44136BF9C0BB54873236A09D040D49426C1A556021224F7887C338A5AAF022EFF193EFECDF3788E87481D13B126A651C92656B5270A38488623B436E7357BCB0C6B5348B1BD8505422DDCFA0F01ACDD0F8114922125A8E11CE824A5269D83EDC22BDCA7EDF90E2F63A706274B15D7A4EC5F20F86BAEED44F0323E6D421C60D80520B02F0ECEAADD5BFD45C174E6FABF94E28058BB739078D495A06BE12817A592D599030A3CE95F27BCE3AF28C44604004F0904C09312DDA387D33EDCA435D7E088120D96CA191911D02C42821D1F3906594C1502609EB34644DDDD85A648953E7AF227A60BC5513885B95776C93280314112934275411AAC1BB40EF87CF310E5EAECC736270B09090A2DFFC4CA1CE69B86976806A4BE3EEBC328C04F3825F43F764E96D76297CA4A456B3251DE006C5E49C25630FFCEA7F995D41AE0FAB786C3E236BE93E025CA8D5BB6785D116E38EB29A68279FEB462B3286D573DCE1C065DE7E020BA54AA4A7130EB63DF1AF56AC82C3069E5E00789070DA2FEFFB97F67BD77FCBED0161A3B8443F08EB2D9E4173E7814D0EEA82F577D1BE43E6260914CD618822AF14FFAD2F84868A2A5C3418D73E06C172884CEA724E438BD80A17100D1944D9DF99FA3D21C0C940F6855534FB3C91D06A96BB55D768360CA99C7B4CF84FE2744CD3FFA13C8C98ECD1A9AF01F1069B4469739720DA7FB7D93DA5A3F9AC009D94BAD21CDBC5AF7345AE4DB863896648EABCEBA6AC3DDA439E9FF16F61DA7863F01D04B21A1D584BC5028C4FAD655D81BE39746504C8FAFB63304E6AA1A6CF6E4C13BE237A88AAABD5A76436388CD7A8CA39F66811440CBC7CE2040BE9558BC616388F946D2078EE16A1F7DB53404DCDFAE99631AFE915DE0AD7EE16B0E9DB93AEEC1DF4CBDEF50439A3BA550974672CD6FAA50913405E4DA553A1B44EB34C7E9A9192B88F68C881E73CFF0B63BEC7610C71704D03F03C5233600508D6D53ADC421D1CD94D8DC1D241BAFF7F8AFC47848ABB9819E423D21E95D80ACEC2B0F6A761B4D9CDFBE519351F30DFF89D7B542DDCF3F8D8F627C75CE34E42B0138E3BA88AE947F340170BCED537000AE82E7ECAC8F58831CC79F9320DFD4C3D1B2373ED1C668E1E4A88FFAC091E15F6F6EC09AA9A7AD4A1236D81F08045B29264D8DDBDB310987FAD192E1FA16DDF01A66CD5EFD0B64C2AA67387BA9055C694123D7DE0CB78CEF37ACC577FD0396B875069BF826A0A05F228A4CC812445F749C31CA42AF308688EB1B4F50C7E032962D58575F320AD715EA842D464FA9A8E49DA695809EC04C1EBA02F343747E33FEC11ED1038C23F8F8EBB784437F7AA47C562FD447FCCCFEACD87568606FCC02F9681F88A898A9594E546FCE4661B5EA6A7E7E452911E75D2B0FE4640597679924A24B3F4C04FF4983655F1E62BDF0EBB7B537C18A1E20D5F2BDE3D8B1B99981FAAD59EB287321D7990AD24B6093A6EFB3540DF8E40D81E647253DFE1D6E9613A3082A89508B6FF482481CF9CB17BF64C34C135C9A0C22C40E89B9132DA27B5B749AE0BD40240AEBEDC645B1F9673A1A3CBEF347F5D420C81C0531865932964DFBF45E3653BE6AD3B94064B94B017DCC13119644D6DD16588DD243BA038231D983C8BA2023921849B19AF7FACE014B369D4ECA71BD5BF65B3A3BB809C45E37EC43051E801FA93FBC0690F893E1B8202F155617943A01DAF94B1FFE80C6107DD8AFE6D40AB3ADF8755D2D5EDA592EEA5E0EEF06D16A130D53086CDCD3179AECED4F401E28731212E8CF66F8DC7C0BA8D03C3DCEF10AEA7B86AAAD31D895C547E6ECC57D33F587103E434BCD05B307E7D0E447AF7CF0F3150E417B611B88E2F4A687BA55C4FC76FC50223008AEF61B7DB70E1F2F0E4AFEF705DB8384E3CE65764605E2B234370A42F6F0576A220840941CB95C7E3A86FA9F06915F46B169F93E3852EBE6E307973B70621B57465CC27AF1EB64BC3B095F5FDCB65E03B97169CEEEE0EE577F93FF284138B69FFE0BCB9D9C0F33D96A0D22135C2AC32E7D478878DF91C229D08D2711A12FBE61BE7B0BD7C574F383192B4AAF4E416B2BBB863A96A4778C1664A9E501E7027E831F42B828B579D26123C57F9EB5A471046DC619649F1515CEF54DC9BE422F8CD8CB9EBC31F22923E858609BE7C917613DC72EE3DD93A90E51803307168177AD0FBA2D74F4545C0326E505CC4041ABCD9FE60646350E07BAB221A0F1A8B15275DA9FE19ED31163C84BB0DB07C63143DA17E5A7BB9B05D639C4127E44CAFB1D2657826CE07CF17FEC5263A2EF4F6817EC89909AD9BFE580466C71F49E8DF698351E70803BE70B51E71E6DF9DF35277C918019BF3D523A441D2231E89DC2C328D30FBD66C15B88B15766CC42ABC0203F4BF660E72E843E0A8A89787C187A357B2B170F23477516840C87001DCA90940287BFA5BD938ED8EDFCA20E5207E0F83182894992426B96708899F37FA0014C6A17112908A3C563BD69CC484114CA786BB0243372E652D992E1EB80CA43F99D71F7D7560AFDC6681F3D6D211FE77CA17D1578E6ECFE45F99E0901CC188F1B5EB26B444275EDB6B6E8D031FE7358223527CADB78247AEDBA7BB762848F6D4D9FC2440156902AC5294073F9FC4D8F58C5DF1DCCC9DBC5154099C3D7F67F04BA2BA9A94D074C2A88299822FC086C8FB30855E8394F349E838D3F7BFB052F5482BC8851011A943721383E88CAF9530C78D4B20B0728798D8614CA02E7FDAFCBDA32CB23917C70AB4FD4B159C81744F3960774886B280E614B4E3C39F3584A4FD7178008B0B1991E6539C193CEE45843ACDCE2853FF9BF072A0E0BEF7A61F84856F95F4E4272121C4C4D16FD4C6D30689C1FC89B1DA5FC9FFCAED3420CAE009E99749B72CF7246C11F1951948CD7FD5AC5B9A26853933782360D082609BAFACDD8ECBFA009113EF32F775F9EF3FC5021355ACD29ADC1024C1CE0F62E3318603480E45E8EB13D81C349C1004435C500EFD90ABB5FE646FB2CAC09898B0BCB947B054249B53710917F7417130926A224340C96865B21CBAAC8EFBA56B2791A3D5BF3984B297B9C4E5DEFEE1D4E1D2FB12B813991DC6C459B858D840B709C91711C2DBB6C4A4D2047C117AC9CD356C86DA733AC0AB3CE722CB96AC16973FC99D0528AC02BBA5AADB2E2A2677C5721CA09A118D9980F51E83463FBB0CAB7A03FDF2646EF487F43AC1F38CDC8A2F8D3C6EC04241C896BCE1C3C1E5FA809AE1EA3FAEC0B2A694D26B4058644B00A92DDD1E98FE0C3B50DE19E412FDB621CEE7E58EFE220163CC513743B485DC4D321EFD8219CB62752307B1260E51AF74D357A022AE07B8651523A2C00D4860BAE1F01F7859C95BE3B7BE8A3C89BBF4D09B4455EB824912F3276D791D81749FBA5D6DFEE7C6B155825E6E39482E1F7E282326DADA70F79C0CC2888511EF35173D88B9D7151442DB9B1896AC7342C418899DF6EDB3E7B2B0B75F8DCE3FC665D0D6903A2BD05B8A0806FCF01D96A87711D70ED0A337B70E645BC9D005F9FADCA8F7818610E5982846D49494D3AC07C00528D58202361B140E84350967332F22EB863B3AA4CCFAB2687FFE68BD1C1301A67B345409169D5EDB6831C3FFD06A0C3D364F014C0D1FF20D3873D78B5C110E9EBAC60E823F9B72FE2059E3245CD1274DB521B6CB3E80E5CCB97096108776345CACB160A9DD2D1813BAC6C582AA405F3854D5ADF866A6C28AB0331D2488426539BB538C47DED3F126A5536DCC17BD956F86EBA2016FFC582EDA46D494E0E5917F2B40CF6223773822849977CFC6335E49D31CDF11F42234AFFF6A79ABF21F50DA909D1404A7BDC1BA304FC952EFD29AE47A46D734E16C6416F7CF348237E0B68AD9915269011B343EF1DFDC65B58089210F3C611E93AADE05E132128F5FFB50E36E5B11197FD4EA8EB36CE4E8815F962A251A4FA3F66E85EEC4249696B68BC7B4386D416C6AA2251E05DE3C96E16C2A2916121ED00A1E8C0326AC27FDC9D960C0A9896292A38AB8D01842FF604A46AAA9C49A0EA2799AD545008537EDC2AE63397F51791F99743F52177818DCC0453EAC68015C8053AEBF44DE6EEBFB1D7E60922E4000EC9FDB34E25EA7C022EFC47358A30EFC6592538DA6812CFB0C68CF8B318D4EF0C3DC1DDA5A640A4C502F7F0C11D3EEB765A27E7939D247299FF3AFE5CDA926A1FD07CC0CB972FFF7792E1049C05D8E7776040B13D25BE7A7874331FDA43EEE2EA8ACBAF7996F322FCDBDF3FD730EC808876E89CF4C342E8FF697826132549B2AEB14E856E67B880E5716BACDF2007FFC29B589DD29C99E66C367E1CC184E125D0A5E93BDCF5FF2742E2A844FFCFCA61C0874EB76ADBAE48F49CF78AC527A162903AD139E0EF4061E0CFCF405C9CC3AB0837A91DFF86B3A1E78EE1E570F32116A5C6C502AEE6DA2A6B9556F93FD3D7F19F6C50563677B44A6AF150D7DF817C2367B648AC1FC75BECB1BE4A735A79346446834B8AAC17F9BD10B1E73C6252B7761D717F994F9C2F5F41CE1545D6585C45DB976A77B65BFB98879F5526E2CCDC048AA54803290116A038C5B4D804C63A636D613535639AD52B3DE6BD197E2726525EC214DF2A3DCC3F33371196C2CEA1096036DBEF7F865EDEA210CB49C9701EEC949D2FC1101F83B000FB3DE43BF1124271185F53E27B41398DE9DF513F0758426D2188DF1D0FDDCC454F2391FD9EB4B6DC82D8050EFA3F13DA9613FF6887210494FB97D4074CF62166BC8CC965020CA3D7B87F9E4036102BB63CFF00EE3D4E9ACCFF2C816A66B76404511ADD0226C6971313AAC3BBA94640EA8F8D5F4CDEFAE6C925C9F92DDF6F2728C1ECF64291836C679F4F5628BB4AD10E282100E3DF6D58E3548185C8530D88A867DA697F70CD7F9CB11229F22A5C3C957490AF1350718BCDE56799C3B91303A4B879FB2943FFF70F619684369ABD6CD635A1597762D6D20662412D569219E835156333285EB4A97F06DB124D247BB305911B2C8B3EF7DA2E103A8F720B0BD525895E1CC4E270258872550D6F15EB68645BF6902A8FDDFBF03E59BF413D824EE07EB6979BDBAD8775CC8DE2005192661E236C8A9C4AEB89D6494943AD428D3E7C73409AC5AEED4ABE99B9EFEF2C1827739D2EEC943DB5F9F8B683AAD9ED80667D51C498D792D8F5F8D6AA0E6218F3B779C5910CD11AC0A758763F77B418606D7302809AB8896C14B8D1EBF3287B349DBBACD3E0FFF789079F3122EE69E8DB46B069B01C03E97F5AB2DD4954582927610BCAB5FD10A2E73DCB8EA752B981D123F5558630A17A09747909D0F5650264BC195D889ECFDBA504AF47390ECC83429FF079C7AC3316DF53ED567289CF1625CE6938EF6F5E5158929CED873C7F6E996FD6DDEB7B884A96C0EC891F70BB3C7767D258E76CC384224AB008AD4061377418B2FD8E74257F781399C9A43695EA2182BC9EBE04639BA24ABA918FCF12243E742A51374FF1C105B09F5D39D9E2E2FC20F65603DD74C4E885BF69BF6AEC34F2EB2B52F9B8E2B5B0D2803FD4F9C9D6CB01543D54F839DE73315CFB37103C306C461BF9DC901D7DFF24845FE055C1501D76BEFB7F1B090E0D5693781CEA379461FF2F5E868FE852CA5E84C5993A491B0CB0BF3E84FFF9B88663C031A04BD37773B1D34367D044E698320F4E073DAF1F8E93D2B85F15BA468551FCF8A3E0DD0F112301B4AD9BEDFF2BC36FAB85607B02DF82410BD9ADB5F3CE1459413773652FBC16ECE61374BB803D22B2431AF7E772FCCEA4C81631B8EAF55807F1C2B384E7760B04C587EAB724CF3DA445947998802ABB5EDA3D7947B8AE91372AE1BB4DC531E49F52EC2D49399DAC73BA104388B3DAB963DA591DAB602ADFE745B4B449CD79F172014A93252AD736A981DA0D05294F0EE7C04940C59506D0F31EE91205CC1C86FBE9773A90FF3EAAF48EB9B55191B123AAB3AF22B3ECDD4BEC7446E3FAC8863F38689291863A557F292BA855E776BFB3CF0B82EF3038EC798A960E8A7F31EA6724118BE7FBD081D4937DA1819C5EEBC22ED90112E16F992308E2997AA7EA422E5BDCDE8D3FEB93915F7EE8C9BF681E135FA4BE336112A77D223A100ACAFEF5F67E20F8132305BDA8D90718D877FD3315509FD455BE75C2DF7014A4489B9A1DA2A31A119AAF5E18EDFE537B07D7F8EF810CE3E861993FF4D1E39E404721430BCC8C6FAB95D789DDA656FBB9B3D45D70B800D41A2AA392DFE616E7A199044DFE20C68844FCDF15430CF79FAA1D228A1F929636B41FF3320BE47A39B5F3BA87EEAAD859BCB1851A45415F65CA972ABAB3B6B85ED2D5B4C6B68995A81B9AB42B611C8B55DFF72C4DC625A6916D7249310EE98C14007A6F4774B78CF34FC1E690D72ADF31F47B7C5DDD23494D844B0BE363C770EFF4A74B23B0716FD9F0DECB787DB1FF9A7B82B313322B24CE7A9D5A10A42F8C3544450A6A5241B2859A3BBEF6D9FD894BF8AE94AB7B24FBE3F561584E03A08DB617C73AA44BED9D9586384A00E82320F991215EEA4EB2F54F622A6F54D1BC7EFAE3D3D4BE25B06BE0680BCDBD07C455553C9755E3625BD4E8A0F9438A533204F9ED0B350FC52396A6A396DDBD0E53A9C3632ADFF7A8BFF5065559E5532FE9CF26647F506715F80358767BA25990E50D9F381EFE238045AAC38512FA9BC7590C1A45B73B0D764BC6AE03D6B715863A25F81223AF19A69694C995B9E9A9276517A0249375D941837B0CC990E9E932191B1EE75EF6D097DB862A485EAF59CE628F16877B4B614F6DE9A5A2E707A1002353FFF3F33CC8669BB42072574EB7CEADE6BD1767FC841E7380D665627A0B0889BDC4233C4CFC325F9A3A51D9E5FEEB5AAA3304A6694C2F260E365616964F7CCF079C8D8D8989938D9591B34D649C9394914D83237DE6518A92765893E254684FDE40B140868DFFB33D1DE4A7F2090C94353B152B7878287C8C82DCC8F23DAB1F2390AF1B17759F061DD4C2765B4521464588E2DE9056D6040784917CAF83A52026133F381C9891FA46D48468C08FD5DE72AB5089CA9CB84A9E8D346F14694BD2A399C26013DF04163E67EF5F29A0628333BD71731247CD1AD6A9F9DA50A868FFB0FF5E288F0BE4C40C6DC94142591E7070876223DBDD172D32167A688612BA3DD24A1293A9E5CD3593D7F832FB1AF51B29730514358F488A7ADEDAFC4133FE6CAA3A32BC420F7F64EC39FB3FE10C1691537E74BBE0010D7C6D5E15A933D6490E9C05BD57C5AA254D8CE40AE129CE434C266C99C91D6BCF925CE6B6E0D64C97148EED7FDC25255AC60C0D0F2F79B8C834981130B991E5AFBC8F67C30C92DA5ACF13B3C5C12B70E22763CA2F661365232BE09BD6ACC8D4D7D425C9E13497ACDAC4777F5F1F702CF4C41AC34759F63C7871C5D3B287B8A0489F7C9C6A614B92FF543B92BFCCB9D94641ECF3B4E1AE7D541389FC63027635F1AE6B9EF3F4A942909ED8B5C4B5853E91A7CDBC5E01489F9C09A78180B01987B02F5B616005AB49BF3BD683AAA27A4C8ABAE50D724FABF915DECCDD950B329AF7BFBF2E98DC305128FE28C25D4BD928A38FC4309280DC42070532A3E64C25023E1E261AD6444573A3668C4B982BE4AA43A4A3118D1F65AD35E5165A13DC87EB8DC63AE637C6FC9344943274D1C5F1335A6EE9FCBAE82AF2CB533FEACCA58E1322800BCA7F99D3DBBA961607EC475A9CF98744371B682FBC176338569CE8D8C805966E7CF167E31DA3F2B34ECB51390954E70223919F5C075C376D11F877EC18DCF762FEEDDF7F3A8FAA06F6A33BE26EFFE44BBD1CB8FE222344A22EBE6BD314FCF690591F5DBAB39769ABFD98EC66668457105F190C0488DC2F3765DA06D6F4877DE208919C9E7949825AA6AD6C31210BC88B9B4AE0378006F4E3A785FAC53DBD535D7DDB14AEF51216CAC9942B241B51016B07F970C1C35DD0C3679F28A67D1AC3553D94A2F2EF6AA2D74564146ED83FAE634FF4C6462DABC364955981339D1D45A8501D30A081A0086ACC40438DFAFE5BE87F124ED5C963BC1CECCD3E4767EFA0CE266E66F601481C6701112D2752C9716CAB38E3F06B403375B23DC80EC93A94EF8E22FF31EEE8548ED32A431890DE70F92D81250889759F5F097CAB394D3F26F04A7481F59288013B29CFDADD5DE2384AD84BDE0C5D8FC7F36AE4933EA56654F70702C9B996D8E2444878AB3934B428C333FFDC1462D2D6D805F7689A6ED1D530ABDB01ECDEF1EE838CE3B0809E358AD18355DC85F609E15CF01769A6437BD6E501C4541ED934C8DBE4609479AFEC9728764874AB7078E6400C8A9CFC4C8ACB2BD4DBC1354232D086BB2B14749F7AFEC11B6187AB8504353E81CCBAF0E7D132091593E5FB17043254609F15EF757DD9BA2DC57514E54DCB1DBF5E7955A51A792F98C32A061646C1792BBE312F9D7F46101EF9E52FFCE8B3BBE57F5B749F57E038683B9B56ADD3F2E029F68BA69A5CD6BE8DB8A64015DC5A6F35001057B7E00658E20AEF1B8E491EBF9A971A6C3B61696E27814567408BB563666AED064ACF073B6591FF6FCF91B9FB82A9877363E2ABCE70AAC165E93AE59C8E48E644A1650A76859ACD9216E3EBFC1DB2504AC67FD18F2C669B89862D6585A6A1754296F8209AFE6DDF749C94077ABFB963B6F6A6174DDEFFC465595E8FDB71C942BB380DCF35C052234AB80263E75BC58E75B2BE09856ED0D3FFB3DC70DAEC36FFFCCEDF7FCA91F09B643665B366116884E167A8DFB872832C734F4C8C104C7B5E1EC3F1601DB594123B34A656EBB29E7D251AB32A1A36F96A40BF2E9516BEF8C0E9CE506E3517AAA4495DFC7FEE57D3EBC0C30849BE2385E2C8EF22BB73BEC7597F2385B80FF6552F257D37A9E8A14A765FC8093A7F714D8DA32E27EB60F96B24D0B4EA715224C06AAE2DF9D397D32A2F6655819C0B34840DF921AA2F95D28A216EA70389A1B3E0192D163D8C07FAB04B53D20A076F8F9200980DE0EA0945DA27467C643D55591F117C37E6E2BA64A18DA36A74F7AC8E50D424ABA8345AF6BF2FA36AA5E45815FB280E0EBC1BE9D1827D44485C4D76A0283B5004745C5DB4814428A9A9E9F6B0660CB8D19391018310C5098C2CB592AD7A92A3E75A6D50EBCA8EC505F1660AC34873457C6541114ACAA0CCA8EFE3E3882831DB462976570C92734F91388C01937B5711F8A67481CB997691322192F24FDB79687F91846551F534789C491EFCCAF87F9D5A82F125B2A09E23EAA8B50C498B803E316A3691A7DA8D44F405E7854A0830817AEF865D85DC469ED824B20A9D4531DA4B1D531A2D3336C26C34A72F8BC90974110DCF76F8437058BF48A6F055994F3FB5F48E8DDF453C944D8183355EC4EA57B376BBECAEF8D7B48105E920D4A59C0A23DC008AB9D23F3F68924F47B1496F7259B34EA62E201244F8AF06205FD7A0E09A917517E073C089E728E5B107C351D523F58075E859B59163873B290EB94BC396B6AA0A1C2EA0113653541CB4F9BE7753FEDB4F1F7DE37A60C7092DBBFFB9215FDDFFB7BFB76C88E24B1398CAAEF5D6DAE900A5B1A5165E298BC74105EBABA43194E52673B97DD8D5CCE7FF5934FF86F989D8EDD3B25850E1BFBB36DE9587272788F0D2423B69D3CF75F0D7C3DE952F19FF13B07E04409E990C734E86C3E3A50A473E05E1A415A7B20084C68BE1BF931E616EA16CC59B57F2DCD78A459ADF5E0E04FDE9A1CE4103AD98126128D7ED2D1A7D300A12E35C2A4391025B8C6E79A215892E234A4A87F9BFE22F41469FF903EF1B359C75510444B7CB7262D455AF4034A8281BCBE456A82B145C64834167F4AE64F85AA883D83E545BBCF6FA7B0A888DBC506C436CD3885EC9E112737666B840B19DEE3DE022F02FB297195BA9907988AE6C478A4877DEB794BBF5FFEA7AFDC8D3D1A84509D85861A186FCF9A0D7E00BE88891B91CCD9D42220D434718400454594FAEF18D85E604671EE671D189B24D0309FBF60B1D65C08BF2273C7D7C20D5385B073C716C881291FC5FBF82DB4A4FD33F94A74F1F8907B4D46312896F02308424BB57FE813B40AA72E035DC6CBDBB3AE9345F69EF6A72D58BEC272A6B7DCE721C06FC96DA7D3247DE23B4BDB1EAFD43EE3032A85ABABB7B6A1772ECFBC52ADAD6161CF724CA6828FDE65FCBA414CF3958547C468B603CFB5402A4BF09CB1FB2736D8697A3E93914C1E4AE3AFBDA795FC6FF4B77880B8797B6D32DC199E80C14BFD165292836A013A68CE758884E51C2BF5185DC10B1733174E4A3FA832366D8D288B08600C76B57C15BB18F56102CAD399B97D0370A442B44DF76614B070089D90CD1AF762D5CE3A33AFA0A68AA8B9F5B6057A9B5D34A11FEF48852EF233D037C9C556FE48E12F395A4B958BE5F8BF2B6F4F5F07CCBC442DB26EC9453E8D83E01F034D8A6AA9E4D9713D2006E386E4D6BC0B344C668421D94646B03F3636342319657077DA84B9C53F17DB2F6C6713D80826D4BF474D3E1AFC85E0E74CCE124184111E060CA0F2AAB2C939CFA3D9663448E7011F75ABC6B47D0298AEF9681145FB224E18CEE4B5DF6C2FB7624208844C6707F79CB8C909D31D560A23ED9F7C5C732189818FE3B70C1AF12A857457DE6BFE772BCAD52F8B8DC27C20F87215A5BE4EC403D929629C6B3DE4108363180BBBD096F1F393653CDB79E116E816EA47B4BDA26D51B2C355BFF207ACB4A120DCC73BA9A96DCFA4BE0931FD9BA7E16AC2CE561B9D42C0B10613611B8F9B5B1E401966FCBCD224240B89D1694011BCF1C9D2C64ADA5608894DC1F15B04C23C3B9FAED3E809BB1D63D18A534AC2378A79CDFE950C97C0F74195FACB4889AFA3F23E077BBF3AF057D02B0BC1DB82899F5C70C6A23FEE40074A2DF66420ED327C4418D959C27F7919FE8EE17808BD9FDF1CA66C34E0D9F60612D4AC89EDA32D67C0209390389E5406C9B801032E562E27FFBEE610B400252ED0248B3F8C220053AD10936D160DD886AA81FD78AA172B9EFD3F4BAFF95423874F37FE8FA949810FBDC72C6AE780F2F2BBE5F60E662179B8F3F7832211F6D037F8A7C5492C53514D109118F75A7D6F21A7868D734B72A001F5F7641A3ED2188F0E040C40369C661FEFFD31DE7599DB89A412D286F7F812777C1A2274D5233C39C1EFF27100B3F16D9615461209336B9C64E009CF710EB1115E96F7CB6B0690A68DEE5FFD984E85499B782416927A4F0FA63F172F7EC69D3A68F8B11BD4C9EBAF040BCC5A1D8B8841CBD8437EEA95C01FAD7F95092E9977DBAFBF0AFD934C7E622911E136E5DB6716AB0235FF0402B64259EFB109D3462FA8E007D569EA1238742D60A1681C8A11583040E205962CF0D0CC6CAC9086CFC791BF9D6E139D4672229E59ADD76D3D6DFF7BEEB49A903CEBC713412699D133CA74DF670A729C1CC86E481ED16606C3C8DAF84DF110ABFCFFF881EC85BD23EC790D8068D69D3DB01A8CF6DABF01854773C0633DD0BB6EE1D3662D0E19D94D6D2070400A26557B3402197EC3A71BE283EBA7A42DD9AC9B3F7B1A8F44E484FE69EABFFDD0A2122C31E9D345B5112DF40435AEDA333415776848C3761B910680CB82F08A01DD31B0831B9E1216B8C9A5BF9FD112A828B6640E14D749871A3298F78BFEB579DE1D8D1470B7FB115D6FBCB5D1EF36CAE8D99F7177C38FFAA9919C96E73D8F3900B1FB5A47F7D5CD444D4845731C7BA1B44D1A6A1047AB7CF9A8CF0A23226C8F946A27280A0A425093DAEBE43DB1307D9C9BA88EAE74D100BCAADF01A2B4849B642375A091E9093165622097163EC307F88E8747AC926EA6DD65E4E7549C0F86C0B26B2118238B7375AC2F2E3037876864B85ABE0D80FAFB8F6345101C1FBE182E1E09705C4A1F94651BA616CE0D8573DE8AFC78D65EF3AFA4834A8E52558D2B6947CAC96A78588D699D36C2FFAB62D6BB5EC3E9CB0A708A68FAA653F849128E424769B9710CEA5EA5204109A151D8ED8FD1E2A90D91E50DD68C1D6F3B79E5C1709915A86BEB08481252BB9BC8FD90D4717E50E607F522CCB7413C8983103D92D23B7700B8C1FC75085A34A157EA5B2ECC8FB4434057517194AB5C30E7CA949F944F6651CBAFDB5D9BB3950AD486103318CEFF928D8BAF5624A0654F529412046959DBAE0DD3033344BF5B5275E5F2E7326509C4023754FB27B296EA268D412A7EFA8E5D0956427ED90BB124BA94CAD50B9D84EB16485C86E85F4AB079ABC943EA979478479B41EA585729B59799CE7F6DC938E7F32F60BBD15A4294E865F7B2CFD4873E4EEAF34D2AB558219621C23984973736175B87D41C5BCCD5B118FF5EE7F81FC7D3923B6B367BBACEE7D8CD0D14BDEA0939CC0843D162BA199D52BCF2E993E13EB2E88ABA8691966D221CA29717D6770783F1DCC7385CD96A67D99538B1A02A4BE291B82288072B1C6B0A28A07CF611F5FE5F62EB123B24D660380F577F67CAC452EC6D225050ABFAFFE59FFEA487AC28F3A427D82E4816D9D24E219FE1F34831897DCFECAD1940F2A16B4268A35833ED8C533387DA81D76FB79CF508D84979A035110C4DEFE0C147F06A8EED33BD57676CF7546A4C8C1E97D8139BC699F048D34A51631A11C21AF2B8F94968BED03560E8EC3E06358C9FF6C6DA1416D6A63F1EC62C59904D20D1121D75B807668F49CE11130792AC3115483CFFBCB7EF8C3363EBB8682FFDEDACDFDB9AFAC6FCE2F32864405C2CA291E9C26E26D46257CA82A78406524A7F9E77B667CAD3CDAC4E5A9F862C0DE0101DD069B834840E3DF37055B03BDF93ACC0EA6FA6873CA1870349366CE7CBD51B2FBA0A4750387D7C4CF17CD26187EA60B5CD641F11C2EC3A7509E4D91B33F7A2015C5FBC1B13C8FD43A833A3866BC5FF79CDDB3B7B57BED4A347EE8DFDEB80C18623EA811E55D5729C23F5840045CC438D62C4B83B57E9F483624BE19A0A0BED395D57F22C00940DC7A0A47F40EEF32D6129D323AD78E7B0BFA1D1E3CB22EFF0E443B643E51FE0F3D2310221DA44C52CDAE087AB569B5E2C4F4F7627D3242281423273FC246E821A5503779AA8915A92A65B5F021111BC8C12A25D3F20E8D6FA7F2CE7C4D41D29B32547DD57E8120C010FE8BE99812C8EB58FCE1D71F0982C6C14FB93B036B22F88612C138CEFF30BBE224F373A5E42DF31EE0FC2E260F062055F8BD35F68597CAB52677DBE05E9BCC86E0D35AECBFD7C4E2E5A0D0A25030B3A830954E859A83B0B138727B76214066EE1D49B697CF98776AF92FE038C0873086B31FD6ADAD421591487F38660ABC456562692A45C27FA6F9F60A0F9767873C7D776F43A2D6AF0051AD95C9255CAB37A75A8FCB3DF4A179C34A2E02221AAD4DB12E02865BB6B8126FF172B9AB85D1825E82041FD66559CFD9AD862012CA265B4F6CE64BAD6EAC58430C8674492E053094DAD57EF08B8C42DCC128E08A72609531FEDEDE1CB31F5D8B9FC5FB3AF5CB51D524664C2105EEB616BE7323A0F649B8D6A31DC92360615EAB8C480F3CF07CDA946EBE06EEA80EC10619219035562DC0F1760AF056247C882097FD687CFD5B3EF74F22DBAB5C65FF874C952E3F4AD693A8B7D99C9033097D11EFEAE5FC3D22C2C6C47A36742F910529EE93345F373A006DCFADAC880F284F545E89A130AE0E1670C299253504957E092BC2FC2ED71DEC627E5271F49A0271C9A4BD7F4DCB4EC0745352D2A28F983E47BE25A6A80CC27AA6DB3B13E56E0ACA59346C12564B6A1E39B9217CFC0443B3603A9CC01972C026F5C9DA763B7505286341D0FB376535C05307B52062B459DF1D93A464CAC9AEBD39AD93DA3714D1319A583163E51FCFB09A7A63B9FFEC5AF13B865A909BCA98BF9EE84A2A5EFEBAC370FDC48B3C0109E8CAB339FE1AD2FDED0E47E4471F6F7012ED0110D1B75C9457C551FBCF4B8AD6B6097D526F6B9C38EB8CEB87761BEF35CC069725D72857EC6A1D909C34D22D002948C6E39166F185411276A1C1DAABFE143F9E6F44F5F0D78066C2E6C3A15AD65A7BB8EB770A161DFB5DC8FEAAEE6709F434C21D8A068CA85778C574FC5AAC828E9237E40A34EE5C9CBB07A91B8F868DD4BFE5FF36F50204FCFE8F10F62ADF633A2A84371F1BC33475761ADBBFB2FE51A34585A48785E156FB6184099C8A0DE7DB95B130C9B663D6FCA1877C26FCFFA04301A471E3AC83BED0B04F0388D0487C52DB43158A6901CD6EEB35448FC9567FDA63A8224C453F0820A80FAEFDC6DB4CC72EAB9C69A4B5C608B51D239C781BD6A409A9E5712E4A220FF454AEFBF691874ABC644411F2CCF2BE3FE1F5839DDB38B0F84591A7193A5C91958363F8DC39C43D599C4E46B2D28234CBE6FFB154F8F3A3A6BE44D064379C34376FD0C4DA6F292DEEF949878DE8ECD011A356A026018D446DC08CF6A636F1310DD436586624E6702C91F96436C0B6AACA66B886FC76BB158BC4194ADB6976F8D1572CD4409038748DCA5287CECBF85CB7AFAF512523E13FB10E2290090A5AFBB74A132BFE69205F92C035CF7C4869C529A2BDEC155C4A8CB465BBEB68AA0D3008F5B09386DBF99A32E826E15C6BE4F2935E88FA9AC3E11D1C27F034F323E8D20185F7512CE0FD3FCC1FDEC0564EF1441D6C49158ADB7FAD8D0A59FBBB9A52B178ABB4689572CB866DEEC78B94E5871B4641397316A9FDD173DF9476D85EEF75DECF4B78E98F47E4F394601B5B83E0935138CF90CAC448DEF308590DE8143C5A73FE2E766F2BDBAB7B43FE78717361E69D5163BCB54AFC88B299E69C56954B9E96E380F795A26EB4C3F6C604D072C9E89084BCACAAD6DC157409E4A9AFA8BAEA680785B61F6B958857B3A3435AD02DF3BBB4577B03788420F1D7F739E90C95F4A29C96B6946541B5D6C76BA94DDA52C0E5E88EBE29A0BAC5DA55710C356ED5218EC437DD10AF2368CB9F8B7CFE323DF67E1F47C208F862730C9A8167D48717C887DFF94F197676A5AAA1F1FEFC4158C81173B4BD7369F4AC5F7D54236D5C659A4020B5F6AEF53D4BC184785792727047CE7E0F63A2A8B0AB60C2287DC2433C552F147A4A2E124339EAB764E4E71D0E02C58433B54342D518664FAA1FB3FE5F5FF7EEEE75FC134C70664AEC0F8ED6652EC486D0F241ECAD90F336E7E4140B4110F51840447D750884DF4602573BBB3C3CDD77CB378E99862BA0F96BF42F67D647D4C355C7D72ECBEA29DDFBAA2E32FFA7E77ED9844A6FA10A9E634393E22DD256746697BD7146A1F1D99DCF41D358A7DD5883DB9F4DD571C358686AA12F0C3B8CDD03922F5DF5B79E1AD745C62F03C2D59F8E572BA7553C4DF8458C7B82AD8BECCC72C98306F9FD7F83C84A59F78622ECDE25840ABA93D960C1364DF37EF7AF59CB19040B2AA14F20CD823F2FA0AF126E3A22F2B8E8922117BE2DA5EEBB8F320D7C6414891105E2F10448A2C8D7B5DB158B6A4C093AABB5075AE0842311FC3544FA5B5029BE9B76FDDD497208DE16B41F549581783E9A401BDB2D02B2C47DC88BF1B2CE800608E6A4999088BB65E7AB504FF110B4579963BADE2ACB384E8FEDD4B3FA60BE0E77203D151888E2EEC3BBE18465254A1655815083D44E7BD60F7B957D4DA224ECB071B7A56E31A20FEDC02EA4485F19B78E3A014A823271AD4482D001AC28422635923BB7C0E6405462D671CC01002EDE1207097F22154A0EF66BDC1A051B3C06146A4E84D3F1F87CAC811B4795BB1D9E0F94951DA2258850430ABA1BF7D2B972D17B5D5DD18E3686DF2A8C87463E022AB7FA5DA90A3DB748485B9C24FDEB97EB14B40BE2385A0622D25E87CDDA3D76180FFA199CF7C67ED97F542A040445E357077FA6CD9F347B4C5C782C2CBEC1BCA59DE15A771FCB26924FE86719A8B0EB714A9EE92361F950FC06CE32A18E094426A13F9BE3F7AC90E621448A7BC392CB8AFB52680BB41D70B71DFF20282334A7718DE9183D0E84409EC371B07E358D872AB51AB4D797AE13FA27083C9AABE578A23AB846AFED903B13B5CB171EF229FD6C08F0D1FBD69FDE0BA5F3720EAE08E1C7CE4E14D34D0874C4EB31D6597CEB5AA5DA7019E94057855162106EBB02CB5B4C71729CF7EB04931F3D0B11D543BD2D72F6E961D3455C5D3CAC3490A64E2E4AE15AECAC4B8BFB93618FBF036AC0B7DD1D847C463FBBD16B3D3A6DEE8BF2C2D5628B1143D525B9F56B4AC443CBB332B6DD6E3E2C14F61CE44504E8090AA38B09DCD94478E6709F2E53B994C2903E16478F9B9B755B9045A8FE6CDBDFA5751444B422CBE9F81B08670B41B3E57D099D28E6360CE6D193403EA79FA31846906E1B4CE929E5EFB2DA6A5CC04534631B48934A7BFE5B0956D32D11A64737A2BDBFFA0AB88D7DDDD577F3AB56FEE27FF25112CE02A323919DA3AC307908D632BC8F485B22CF8F25EDFBB6301D2CC748CA008F51C6603925CAF36717649B91FFD1CF79D051D77B190407014B5F7ED9FC06951456C0E9AF6DD6BCC86E59AA51734041D26086CC82537D1A44A2C47670D97B8226CADA2285CFFAD43267B79FFF96BB15D11A84307CE1FAD820589F5B00FF314A7F1A70284839392D452E72FE3CC05C0FF540BEA09F1B306B24A8CE3E357BA109C8ED1EBAED054104EB795CDAA958A9EE2533EA2696E481AEB557C46EBC5C270636ED294CD87D9B5F467383E84FB3E9479416D8BA65DD1ABB452CF4AD4175BA785E713DCFAAD78C4EE8789A8D67E637E03DD49C795E58E44BFAF92792B8074D3DDC3E33214795339F696BAB2948E2FC8DE48A6756C224CDBA516E2D7B16B43D92209846449CE505BD191FA01A44CB9A019F04E3ECF1200DD9B29D8DDC8464B82B7814366414EF8D23A9FD207651EB8DB5932AF32F8258E933E8F705F215D3E4BFAE632DE4C55745445C9DA83275ED6A52A6ABAF16EA59B467CA8E2732BB0D3D2DAACBBF4E943D54EFDEC37EBD10418BA033C53EF1A093CC15BBB21D7B458EC2213994F3123F0BEC5F198CD5EE375D591A089B71635E9A9D872A6A7802564FD694695025240A38CE6F606ED1868BBE2C24102CD7350E641B693D4C523E2296384166353AA81E02E6A67B632C7B292F4E98F03E313EFF0A2A2DC78ACA48E80467359E33147631EF3C1C9DC491A787A2B15741D8F4D5CF11FD843961304AEB08DAE449F5BC684D7279569423BD7ACAE87A8D1C3FBD5084719581761B91832FA6B76554AA9994D01428203145D04A44FF680EECA993CDC998D37264AADC3F9A754F0CE7D986ED656B58CE19DB03C0FAD3FEB620F72659DC410A703773497FAAB67B8FD59C6921BF67DA94AA43BFCF8DA09E630B7B5E16AA25CB00E45FB2FE8FEDD73C15EB955D0553742795EECF0BF97FFC0FFD40A4CFA74A24C7BCC7890AF678A088FCED1FA006907DEB3998053D917681ED611578847689464F17C76985B40E609FBB08A118747F954C5F0830EC12936FB684978F0D5FF670675DC9AFADB57549E875844D2C66F66B5BD32295DE2A5F813AA12B8B8B7D38C9BD55E71A38BA223239F72BD6DE2D41C54B6E1A4F0BBB99531D50DB5D7C25FC045C7FC479B17371DBDB8A0A31D9F3BC3417656F37E80B4F9F200F3FFD611618612711D0AC81CE08093D2AC4C067F9C5DB732DF88714EE3446922F6B4A550DFDDBC6CAC15B71FFEEB2C55BC596A2BE8A3E1DC7B7E6BF28BA74F52E153C507305D657DD1C02C61B955B81AFB6D2B6E1904EE2A3810A21942CE52CAC17AA3E88B2FA0241B6C78D959C33ACC7E5AF6E3FC0CA59EE913F1F77FA8794E46AB640F7DAFC63AB25A7474898765E6D1E1BC42D83F9BECF2692AFC706310A57F0CE9E8DD28D42F7A5178F88F1A530CE60C685369C94B7CB87110E2EFF33A6509DA667EDF29311823C0BB41CB08E0D08FCB84C855B332778C59BACF7CE4794DF04A73FD406AA9AB24414F8A075C0DE772F54386F5DFB5292F1C76A93E67185A8B27B1154488FD91D9F8D8FEF1C56529EFAC232E423FE0BDDE938A312690C362A1D9FC09B7AD35E96AF7D1A96D7F503FA3A9E8AA033A177F7ABA491C85F5E0ABD69B8E58C3BCF96FCE9AA24BF292A017EDD123F773136156287185F91A5496F0B1B66DA0B34E06882F8C1DC090CC1A683DD3218B94194A601A9E24B5B4AB01C091EC39FED6974F5B3F722487F0B9C1FEA93C5D082F7FBAB73BD49A74A2147C34EAA0576FB2BA49AA2ADFE1A4220D51DE81DE3B1FFFD5A66FFA969BF72C68F53F8BED226C058B98C69B002D2DD451B61A0B0B4052007C97C38D22CBE306CE9BB3F902E06C1225AF39B35BF18676D78683B49DD6931214638128BB93185174404D84EFBAD1A86523D0200878E3FAB493FB77DCE000988B665F260937FE830FD535CAF46D6EB92E88ADE0199A5FE6AE95F54A6C6EE2FD8C17EAA161537E837E59AEB9C00237E9829C1DEB1650B4B0097D4AF0274E9A325CE6EC576E5AABD3D4DFFEF8CFF45B6B7001420D58D81348B2F0CD2B087F80FEF3106722D9D636884F9F5E16A1C3A5428D5B756FA23B68421719680B29A31329C25C363BCEC8343E6B63DE061B2762E8E16EC29039C79993D95996494EB5B17D7F1F1AE318380F015813A659A719AE0DE509F79C43CC89DE6F2FFCC11D460DEFC1B141046A134132ABA40C2434F526D0ACD6B5AE8C958A9721F6E547D2B18CABB08DB080B64EAB3FA63E28C914872864CD2A681A022B0549E5CFA2701886C23F23075382AD398EBA4DA7CD0BC806503FF8F35D6450F59589F99A1DD257FA2EFDB119D31D1B056BADB050ABB9D3F8CCAD9164100815B2802CB77775869248ADCEBE015F34E7FCEEFB84D2A94DA556BAC2806ADA969B3245EC7302A7FF8D4F7C4EA00FF5E7C4E76FB408056CA85D94EC2FA6523BBFC4016DC1FF10FE21237B8B98B35CBB3EC188756374138742D5380C168FD8B037028C9C490928586710894C47C21D4AA2FE6C8F8FA14AC9DCA45C6C73D908B49F169776A067DEFD80E3310F206A02F9950EF7B383F919FEDFD63A0F9872EEA5473474284332219C4C56CBF56B5CCB0A5972EB8273E7AE352FE795085AC39E84BB2C4EECE57A271E536EA1780605BD30435D85BC3717B959B2EA0A48B46F12D73041AE5FA92E822F24B98B54DE2080536AB091182DCB3C161383A5CC3BEDAA41BD0E614955DF6786A51209F8752FC0EE6B88983A37CDA1A58CD113D17587C080FF8D402465B9E5B5EB27EA73EF1FE85F6600ECB0BBF66D1AE03AE1463062785DF5952A3DD4A0E50D9360C9695B8C11BB4103A42C7BBDE29C5324C3DF59F024983E5E38FD2751FF0BDEB946C924AC7F39642D96C4CF32E778806717E91C6F17D5DCA8AF1EB2ACF728D7B88F4FF530B2438BEC5DF1045029DA5649459ED6C26D06FAA24904352F04B8F81B00CBCA2BCBADD488083177C431ADD3EAB305BD7B544D5B835FB97F32D0EFC8E562417779737A5765117840750533B511C2D1C845EB23701D20B17B24925ED7FFDAA37FE22FDAD28FF609789F2A1527CF64E4B1025B4646C2F69C4448A9909668979C32ACAB825535C2091FDE73F321A2257F2BE9D2E4AFD18190CB486FC19045E91DD2CB0B7796490A24F6FE02C3631E64F455ACE28A8F28F571B83819FAB362D3167EAEC9D13083CEE4D4197141276EE544753941FEEEAD4DFA5B8F9F848844745C6CEA2D06EF0384C40ED656FCA61A2812F92B75C01C9442753AC62662D54A513268C2B92EC8DFB3B0200A7826B09A3BC517E69E57C7454AB84136955D55DDB98244351D065745FBB7C6E6B57738CC33AED07D8262A249D21196010D206ED95AE14AC44AFB28FD12650DA8CDBFE2B9998EC4CD5F8D6ECC7F6B4DE01B56AB037753E4D4E71972F26857D6A47DECDEBD02E282BC8F3C412D0744B33D215815685421F9C8B8D32DD7FE90D828FBF18DE6334C859B65C47FAB0D65D383EAA8A8E1960D446DFF3C656D390A93FC8E677940E3C0C38FB3CED4D8B61C7BAD568B497F7D796FB8DD08BB15034A8D820835B8059E842BAD77FE8A21B30D08713F9BC291C4437467E866712C7D6BDA1B79C59BD06A76BF8346181118E77D32BE2A59B06B1577CE8A4972E99689E9B50B320A8E6868B463ACC1E4B6C0655346D81740396AEF08551D0A2E65902F2602B0A923C68DC324B8C2BB6DD00C8BA34D0986DAB1EBDF23B24E0EE3D5F65F9871D0FBA36B275570DAD285382D87DF1D519773F6A3A38645F1EC968A52C225803021D9036CB22A62C63DBEC370BDF4DCF6F0C9D264EBB8C5FCF2CC227C35E0D1B7AE35151D332303934F284284B346EC62E11AC15E5A375D2B7791A5F7511C3D190FE56C23D4DEA3F44706CD936C1FA82E393EE43E298C057B3BE1C541F3681C37021B55D7D20742A461A3ECFA9F40341B1F7C480C495C30B6FC4D0CC40A4BD99AC2E69D67B4E816EB1B476A64F33E8EC2104DF871421A35497E603C22E6D77E2BBA0D27D4901C4F29D965B956C0900FD551073266B086AB8F12A25EB7E6C71C19F45CC50B05C57BD0A00F5C315C11558FC044A4C4EE4B5569597C8CB8B5EBE4C2A9A166E12F7354DCB6F4E49915C2332963F9533EA9AE9D92F022D812C8ADD817EA6295479E26EC793EE6CB6190D88D8CE6E00CF7BA8B648774C024AE83B9C72640557E272AA07A5F90732959CCC90C06FFF7509AB0F707C5859BCD50E8FCAD8E8421204C9EC5849DF6DD7FDA4FC3C0B42B1587C647BB915E422FBDF1DD8189E4480A3C84D67C1B7E91DC7E67AB449F4EE4F12976EA664670FCA04EEAC68048A000840F4151BC46C71B1B18465C661E3E9721E61213027C017C043D10770B16401DF01F58F307F226A78D6FA66DCE54F894BB08F28C031AD96529C322366C0C435DDA13229315EB73C5792C718148DBF618ED682940D88069C2E231D50145853666B3814F26F1337867DA7EF70260D5CB06D4BCE1ED46C5F9777B84E9EAFA14453CE8231A4670ADAD44EABB5BFDFE81D4F701CDA4866E2ADC4D2A7D2090EE4A842524777F79C6D1D78673F7C331437DAC030814D60FB348FCF3203927805FE5B6C43F7EC39F775EAAE8EDEAC1D8193FEC53ECEC9450D11340568DA6C11B4291BE3331364DC3FC59C3140A27FFBEA108315CD172DD90F2A82A2BECE34535F5E061B99EF5F1D8A960047378380F26748843FD583810B4189B64818194204EB8B90B63EA144A6FDAD29B19ACBADC5B124E729030C0126BBBAC2992ECD7D287D84CB5A4DB7B0EC786A457720F46394067643ACEE4F7558E49B65808938563FF7C64FAE2DC27341ED4CE0FA25700A9DCE18D73C2D438111EA759C67F0A53F10E04BF666FED6E2D65E431B059FFB38A0C3EBA4D42AA0B0B3E0FD496E611CFAC20564D641825D4F6479AEED7D4CE748D01B82C365ECFED9614B941DA30B04C0B59F6DED51A25A024AAF5DB5668EA63596BEA2C3B9287E0CB95EE8F898FE975F462F2C7FD883C22F1D4D8B811C5DBB9BB4748F44B3BF81F5B9315525C8A3F300C8CA5D02F2CF78011DB9CA10AFEF1C7133675457F551748F5B3D4EB3AED6E35708D533373455549AE4B9D924FC64AC0FA347D3CE816377C3807F8C37BFFDC095A27E22942A9ADC05DE792CE95F5E0102CAFE1A5DCC3AFCA931310F935C1C37CFEE2773F8D3C98CD39E6F1D48F1BFBD134827773AF3AC7313ADDFD313F2A716F35E036F595CC393012E6976F3FBF4D6AE303A138D3BD34FF5EC19E9C5B1CA10303BB81CB94738ED9C8056ECCC5CB0ECF4B7F1F15548F73FDCF019B5267F2A3BC050E5413D75E360FA6EBEA88200D990840162735DDB424A98993E3043E21BC64B154A8285798177E151431A15F21F1EE8B77DD46ED1DC82F5BBE65D18C25E5B95F56098F6638D2A8B25BE520AFCECE72291664DE487216792650AF8D8642E2F46A6E8556205A5E453C9A8D25EDE845EEAE5FECAC83511CD89A626BA3DA67DA84C3F50FA60C8D8F0FD304503BD45E66E4827FB6C3A949E0FA3FD236837596E98D756CF3D2F2F7566C96F20CA1193AE1A922BEA9A1351E9B40093D938D17674B799401087F83948B109078F65CC84AFE74E2A6D9C5C83092F0B9F7EE30321F35FD4CC813C1EF4F42C18240C3F240D873B095AE28937FAD19B546631E6BE60E597408BB7F9719E940A04A1F6D0C01F8B5328E88FAC44693899CC07E3C7C8576F3C1E7F865DA1E0D7A33282C2C866B34719FCBEF57B51189133151C3AADCE59CA8E8089FBAF41E608EAE7030FA26A914E8BAD7A1A967516F4B91CDBB30EF0FCF1B7333F1A5CABB2621E5D2845AFC351EB13E84A2A66C9C9083CD66037F328A62B5F577253EB5E4EA7B3DD7EF91506A83339A4B90AB2AE64542D67A455B46557AF08736B7E6F4CDFA5F8496C8B1694A650932C560CE7D598AF7FC17880EDD283A0BC381DE60EBEEFB7E47537F4F1D35D02A3168E5CFFF46CE7EB7EDF0B6F7FAFAAAD076D7D7C26F0A040332CCCE0CDC1F7B3C20DD812465442FCF3E4F0EEDD01E6CD17695C3E6EB0A2161A2BB7B1FCE3EFED1540B3CAE4B5C7E98DEF3F9C4068BF0506DBEA5942D82DCA6CD0B5509142BCFF95071D2D8E0972175E0528806AE14D02ADFD116CDA0B78DDABE8D19278AD023347AE0982A4B832BA20C781C3A13DD7557AD0E15D642EF22B1328F112F6BBFC0378D5370D142527C538190C10CA96CC7954CA2377C60985477C68866AE2CBD5A5549B069A0BD2659CC16C8910003E332D484D32AB7BAA06AA93EA271E5307C4CD62961934344ED8E6D7903C62FCC2B42E535E948D98DEC5372C146F9E78D3184AA0E719286A7F03E841BE071C6DEAF6A684332C9CB27A3386D025CACDB6D37B54E1EEE698FB621D510A4A295EE6359DFE27DFCAA8E169FC6A73C580CD4668FDD467E6F9FAED5DBA13CEA79B9C2300BEBF81D00717E72C63DDB1AFA4196FB08BBA20C47B679528B46F54DFB926DA24935ACA1F4830678225BFB2A069D3178223AFDE8FBD9BB5027C668FD6D513AE4C0D3D07030B2F7B47BE6550D09D59F58C00887A5D7746E978F7233866AD7541CC003243B5AE131A43E4F7883313E9F17D542964FFB7188767B7266E1AEB6445913867E8EF43D380047F32A0220E44213E97B9374A1202B1D1FF7F65034EE82C1F942E81ABC9E7B9C1B327C8554210C53759A07E296DD7E2CBD7C8E6DE06AF4F83B25608A96F4D90D068A0E54F246DB2614638F995B055E9BFB9529B0FBBCEF15FAD0E98AF724AF30F1ABE40D2C186E7FC54D00C479FDB8460051F29C6D4125DF2D064AA5ACB40DDA3B4FD882E285E530ABCEFDCDE8442BF98F622D898B322F426788F72B3DAE28BC3119E6C173D93C376CDF2FE808235F09E73C329417F0F098D3A8DED920F8C51E4E27BC5A501D66B1CCAA19F84238368E83606735F974D03733C73DD1092541E543731037ABD7AE5A92779581F460351529647663DCD5C90558592CDFD9F381A34FA711383B82E37469FB2C12CAA1B009A390CAD765D5BF129AE59170A19778C5D5889298B3EE5C38E7706253D277DE255A0B891E9BA05D172A792440347385F390249F22C32E5266B5F795D441C15176849109E1C55B5425E42A1B68A408E96CB83BF1E3E42CAEB27F563764D2EA3F846DE01DD57CF66A236C8C2DF956F1D50BB8CB5DB6A2234856DC017CC39DDDF607B51F86140D05ABE6C54C2038DCC287959C74784D0A7A49D0C6298C395FB20C26834CA8339CB93CD68D0F79125ECBCF4DD5ED538DF340D04290F7FE6E7713A24B6C2D502EA966F218AD305F4791AE628CB6E9D7A04527C2FFA455A7F449903425047A73DBE8F24691387B5BDC5DA7FC73E0DB2EEDD9A45B92CE620CF09D59DA3DC20EE415E5E09B340DE350FAC7210117B249D4B0FB4BBFFFFB76C399751164E3BEE7F861B9E48D2D79E16EB0964F5DACE851DAB1C42630AEDB2AB62877DC9CEE71FAC1D7968D034FB0CE6ECA664D064AC862C369DC56B1119D8E7A6B114A377F71D67F2837D97A56EB9DD8D4F7D72E94DA997F5B8531BED4F866963D263C634435A25A3E3EFDEB4D4B14619E899F420CF2C5BC66763F2B67DD60F02B0F47CD1ACECE89C5191EA35604A9A054CEA677128213BF3D3CD1D159500C55C01508CB75E946BF47B493773F2CAEC11CDBB956150754BF1B77391B7628B1EF42BBB208520A6A507FCF70830DB1AD3AE9B406A407D22576051F4D7D2F319813C109CDAF811EF1A0F8D916BF41AA522B735BAB0284A4537B61C6E8A628125584D91F41689A0CA56BB5C6551C1D1B6FC3FC32E048F5D67E2EC2AF5C159FFF571EEF80781DAAF192F0FEE57812D11EB9F0A2DB8D35D57B4FD85B836C5BA870544CDE46D52D41B99FB48D6A6CA53821100A1764C669504C8C9A94A7F42B9F06860CECE1A522ECA7E267CE208976EE45F2F11C54446318CE961791F788DDC907F7C7F861F7B0AF59308A9A92B7B22D9C045F20BC9CF9600A59F8616D11CB28F083D91D10AADCD0A952F26003657BDDED622BD1D44738063B89EF9222068EE700F84447489D84849B87DBD7A1B30F52A39B0D26A2CACAF30597D149DACE9649C170ABF3A0DC01E19000BD2B8A29A410FFEEF9D1188E0F451E6E8E7B7CEC9E405D87D83B0C4CDD6788A9852A63E565A9B47C0662E7CA364E809A03545D1BB2B53557CCB835284DACDA9EEF509F6375235EF20311DD52C9D8AB4CF129921DB4D51D7326CE61492204A1D81B111ACFE6271C705A621A590F9551B89D137A4BE0D6E7234A0306F271748C2086F124E3FE8BC8D06717875535A3D615F7FE15123D092F9EE0228C55D6D3BCDEA2705823164EB7A95210341AA46D54B271E75D8E869A6A3F41C1D84C41D01271E9A4F4487F54932FCE5B54103EE76E3B4D3088C8B2A1B13BF969578B097B58485D0999D977D02E979D820B42E06969F1073FBD9BC8BB1AB382CB2BEB7D1A713F11AA38D05E7A749A41FCD0DFD686DAF36AC56EE0243BBF0E6CD02CD04955903718C005A0D4300FDD05134C26C083507F08680568680AF3F6A9314DD109C1DC9084458D7101069B8471C6A19FFAEC1876C0470E83EFDE27C34131C2C2DE0D846A0357C3CB0E405A6F814B1B40BECF2B5A3B89FF0D0B489EF4BAA81A1F017B22A0537797216FE6642102C242915B78FA0C253523F5CC09C675AE45C4138EF126500F766455F471166F30AD91C04562041830A6E6CE6C1015DDCD20906028EB80BA3980CBC36B936A6236BA0583CE4BCCDDDCBC9B4008AA54E3C800407C571C1055D0E5BDA03028782C88C8F1B423097F0E5644FA5E9EABC7C921188B639881A8F21B811FAA08E8E1118A7BA0E603FB5C61712A52FE8A7613095831BD2443495D2693184974370BB5BD31088E164C6371E57BD5064EF5461AF1F7FEC28AECD8F67A54BD3CFD1F18BD6ECAFE586347B2AE1B1A5F9391B930A3140021ED318FC04CD0F205CAD70E5C23439464254EEF3593BCE8BE3E579B017476AAD54ADB042F5E6FA66101E5FBC96DB706B57692ABDBC487916232CD0DA8E92F22F724639DEB3F227D2292E97F228524BC5FD3EEE85BDCD6956A4E1F8BA12C3AC3A56699A87C6917AABC1D7B45081FAC461694A30D1C2B73EB0D6D0746219A62A7179760539C0E0D197F47420070869A02332A10B400E622C99CF624A18B5D1DDC311E74973A3C4D7171A26D2AF87D8EBEFB5F5C252FC74A104F2E68C05EEAA3BE6357FE49896FFE8A2C6852BDEDCBDB67E74D985A305830AC68B2EC3950BCD5BD245F6012DF0FD9B4F8F990239CB625E807E01E308FF9FCF10AC4A353A221334149920C1CECE8C3C5F8AF8E9D566B7DFBCEE67EB151E5EFD3C977062B9DBD37BBC72D0A537AE9E5BB9E77717BB1BC30B8CA9C244263E9E635DB5EAA5AFE2BC64A5649C5D933CD36C243339D3D9C1E757C401FA69E0C845984551C43644292E062B295EA654A05454BB3BD46A9214E312F02CFB0DFD648A92563224EB309B33B72F486EE6F934D0EEC2C08AACC4CAACC2AA9E5A36CBD84E212F8DEBAA5EDFA8F00FE5A76F70F4D96DDFFAAB55BAF77DFB9A5D96ADFCEAA87DB73DFB9DB76C51F853FB6F37F9FC554618A09AB2B03B8C1C85BA0056E8C99F586F3FD2216D4E64D9DA69D74FFB6BC869F9BF435F594F81059A86D286C994BBE3430C682D3B221737C4006B708429E55B48053452090B7B50841C07E5D9589A86C8351A8EF8C5E15637956B00B26425A3E7C4182FCB231A431F412E3977062B5C3E36AC7B385DB0E4859D2D6D32420C693B0DD219ABC63D935996189650D2A558F54ABB1CB35688F081072467FAD1EA8E5631C7BA5311C70FD402F9A40078440BC8D3220AB484665A464A2B28D22A4AB4864EAC073CC0B49FE314E82652E4AD5A2E2529C849DA869833C180E8D9C1E3D2480863B1E39C80FD473CDB7E530EA3BC1125332B4D0A7BF5C59990BAC6A3B92108C434327524738D1594E51E2BB2122BB30AABB21AAB2FF839313853786AC506ED8D00CDFA83743088134E4E142E591D62BA7BE25AB54571FE309AADB442DB9792F245E1D7F02629BABD12FB0DA7430CA809C8D5ABC9254CDA7062961F96E300CBE84C8ADC99CC86084B81E2905C20072EE6DA4D58AAC598D2628CBDA13C0130251094D440F15DF0E6333292D32DEB69F15176810C398CEDA75ADC8EC99A5677CC0914606A3E89CCB404236028C49E14256A57D6121E0FD80BA58868DEEC69EF8B5D7B10B28F5E439C247EE62A9B9D7890EE0B8F57604335A8AF7B596070068B15C4140FD54B23B34CAB694B7EC2103B10BA3063FCA44A23343739C02B9F21273C91F3014719C8A787383F18A1901400332D224F4B28D0329A690529ADA2486B28D13A3A137E4E32547960C7393932D2FD73966E84DD9F763A0DC0832581D04543ADD3B6AF226732291C74D63A9790452B99550CDA9D87A06C2BF357A1982C763825AADBDACC7F099C606D2567A4DE27AA90EA3B9BFD4C03A99A65495D424971C29CB1B266B4B40AC47F29F3A2B7854A9074F7751A359B276C279B119E85D34EECA0ED4161CC48F583446F8CD10F2F4A5FBCFE5D17EF7FF5E95BAC3BF2FC0B370B775D7EFEE607DC7CFBC91BFDF96EE9BD5B56FC0869919D979901D40DAD7369FC9F3D9D86A663DFD61FE4B56D6BAB769A9AD93D33DD5509F7B21289FA5642706F7DFB83DBCCAAF5FB83ABDF1FC7CC52786A516B37ABFAA6E1F74D1DCAFEA4D3E7B67FF4F6FBD37B7A09CB5FB9E6DE258FBFD4C0F6DAF0CCD37F35463CF0C67C7FF8F00D9A19C94D380615AB10F7E9C3769B1A2DC69E19A79B9D2976EF2384FFCC08BF6066E4B8F03F62900E3BE2C4E38F9DC52A6F282B1AFA476260854DD04BF345A376F805D2F1D8332934DBC92A7729ED658DB990C5CE39F9CF4D6193243E0C1A41DE62A3C8B34A53F52E88D8DA30DFA478DF19501DEABED6A028C49423AB81B03706B223A5FC61C23934FDDAFF5813C6166267C12120D1383133E2B46A8E5FF46333DD8B46F6FF7FF810D5D0DAEF76443378B8F7CEDB9E7C247EB050CE1B2EC34C5F5CD39CFA375238A4A843054E514F6B6A9B169EA0CA9BE3CB9A331E1473E1F11297FA1BA0906DA32B45E38308C8E2CD74289A05D89B084F48C5BCAFC181487B0D5750526C788457EA868D3F30864D4468C337FCC0F9C050009093B7E007F661152F67837A3C1504C7D50ACAE0BD9F39AC356D21B69614670F0F4CF73001EBE40AB50B5D2C6FADB455C7D6867DA7392897924A4DE477A8EAAB369D0262FC480C38D12A250B5AFA63523833E2D823C9A7F5067BA1A17873DA0CE26E722F82515257263B86D407E8F6ED28040FFAC0A83652B50EB18FA2F1D18468E668349A184D8A70DED483D81C129333A83AB5D42B5928746A977669DFEB02CE4EED0FB7D6AE12CD9A3DEB287BD609E8592742B54E5B7FEF0C00B82E65D490EB8053A5CE07D5985C3516A62E6BE7E76C148C4D1732D8A088D574063C17ECDB9000E4ECE3C1200D4457AEAD60F76746C7CD861365A0079E4492D648D58CE48FF71F535AFB1DD1EDC137A271463C9DA108601CE60C01E14C16FA29B5B2723477D1244121F2F126AE48378BE4CA0CC992C2C38258D6EE20EBB4208DB64846563C16777355357571B0351101283CA0E949E73DE487703907D38C3D0713D2A9EA2F8FE78F5B51C397118BCE454CFDB145C9C772422A40E8A891F6024D74A3C6818E6FF27C70C30D1F98300AC618BCC845E740CA57E98228A5DC63910C90281BF77B4B1A61B6010AD44DC3718E49044805B77A0B793EE47206270194D8F5ACDFBE15487639822A82DF0827C7D8465AAF95C548417D870B97E187905A7831C25C5E5E64B8D729A9F14D3ED20EC3974A6A5956FB22335AE82A82FF71EDCA4B0ED8630FD18035BE38C44E9940ED0D402069605DD0A1335C1268B9C81E399ECDBCC010AA2604C289F7D12928BF5B6A66FB342D33B30E2A500AE1DCC1F421DFBC51160A1EAAFA5FEB238302C3A38D5D2A9099928B4C175D0F05313B8F066CFC0A33E96864E03EC42374C6F3334004AC250FF139E277BEBBFA38CCF724EBA89CAA1593AD96BB3CE02B9611D8BF7E411670115354B307A3FFAB9F88B9693356B51FD996C770133B5A49082AEAFD3B890EAF453B16EB14469C40379B42CAEE79CBDFC4E72F99AE798731172998B7DFBDD16A1170ECA886311CFCCE776DFB97CFDDA977C237152303884761ECFFFAF5571789DE4821E8C4417B9190C099F51FDA6610B07A0259FF5C5C19822C7A0AC629AD17E83C107728AD5186963BFF9F51AD30F2ED5E0DAB4A32CB417694E59F66F02C87F48792B34FDE22F9CCFC0BD4FBB6B08FCC864E86072F463BE5A91F1B609541A7997028BFBF394D66C1A59051331EAF51A9AC65B4955D68B893B8499CAFA1A018A521CA3AFDC1C944DF7A93411B3997E40E07D11AC11622A4BF2D654F1ACE914734A39F1FBD6C139AE4D1AB54812A2494206165B09F9BD082268CB106889F8861986917737574773FA9C0FAED87B9693AC2A209A05A5584B162797065D21942FAE11003F80B410A816D64B9B4A7A819E119323B36F760226DF9B5237EEF4D8FBE73D3FF89CB984DD0E513815E5CAB094E235B0901E43B7AA24A3BFB94C7BC41A19FF91F1F979C0682B2FE7581703C3124845502626458AE2874D6E4ABFE7F1EDABFCD7DEB7DBF197DD081E4B4372A83A8DED7D807420448F5DFE47989DA4B714D5F64DFDF3EAD149734549CE58482921631F743962D48DEB2C16F71F41D0AEF1E132FF2AD70073A8A00BDE646E6B4F76760319CC4589D12AE9EC891FCD72B98C76B85308B0CFE260AEB210DC734453167DAACC8EECB4AFB1B1AE438B62E436997541FB3C3F034DBE916C36ACA069CE9E4CBB812EACCC2C011D5D8CFAA03D966969C9149FC023FF9C62DF9AEFD17FAE500311D13E11FF1DD8917ADBA9FDD92DCAADA886E4C1FBB76AA52B0C8DF4726F403116D71903D478C881C49EB06D4C8198F69830E1E6F0179D399837EA4F76C27EA41F7ACD6E39730D0B5E76AA5B3F35BDCEFC9F66DC7356C7A07F5B0938C84A82299D6FC7F66145F8E3B48E78C3F1A2F772C4FE441CB6CB3F0B338E63DD197D0ABAD28D0D8DD2083FCD8746CBD28CCCC51AD40CA93FCFDF0B14720F4AE4D9C8C7C5B8AED546AF278A4A41680DDBB6AAB05CDDCD3E1D14C5FA66E595E1E5F321262DE6FF51BD10D13CF92471DFDD670370966BAC0CFCF655CC022D7C65CC2A44EA8C14E6507F65226B5D82365265AA3E57544E45465DA729AFDE333B1CC9DCFE103BB79FE49890CDE1662ACA2FEBA1E42412F63D75978211512A9AFD552145B11789E1C204141BFC70B583E1F96F6C370942081FB56C60C3024708CC41F56505BAE968F4B20CA01D6AC2C5442CB8D9E28472F396153AD91B8DB049E1C4084CB5E6A7825CE9B9CE70EE8EE2684E2FD6BD9FC836DCF3BB422E3FF4B052358F0848A0757834A60FC9D4860B83EC284D25AB4C05D92FFAF40FC0125D9C6BBB176A1703E33A9E4B52814DF6DBE7D2F27A9D01A49C50188281C894648654F88FB640BA3E2823B6A008E3A2EE25559CD8F1F8FEBAFA7418339F2CA936A1B7057082F2FFB8D978AF2D1DFDD241ED111ED7A3615C90B70E572349B05788BC67CDF373F5BA436CE2DE70DB6F1DAE30E2D385827E90C3F546DD832203224774114476CE1684A0E910145C8DCCCBF700CBFCFEB682AA4BF2DBBC4A4426EB59C934AB277F89E3FC813D6A6E7E5C4B0CDD8D473B475B59562BB13D510C07E62F3945916BF4A50176D219B56948C0A6B906954AB0FCB166C05DFC515DC7440F7188581F0D37660E59F3C50134FEFCBF696BBB4C7B0E068391A7BB31D8F28E6B2CD4FAF1B6E7EB6B151A0308AEACEBF4D9AAF78685478CDBF09E84FBC4F19C2703A47A9CCE2DD5049F644AC4A81FF5C3A3B7F913DC108746F10517511AC1AAFBD13B967EE5FA7BD6B5285A1650CF03120600EF1B040A9FEC9756032710B54DA76418E07D1AA7190A53582732F33D804CA151FF152B39C0331531835F81B845CC8F6A11FAEFCFB142A4E3C330E1D6D1335211A609F942CF925D773C4A92421DB961BC9ED34BBB5DC09EFC996B4C2A6A77618E00FB4AC77130BF160734D79F9E3A3E4ADEB6DF7C5F0A60D86BA591202E6CE9D1E3F2123EF1028D78D38439DE0D41B9A781CC7D4AC5E3E500676C2EC70FA22DDF1D73631B09B0FB4D04E2BFFFF0F3E79F4D1F056517EA31AFDADC8880B05490800D7DE2C59511390B51ADA6757786329FBE6F338FA503F8847D67E66A5D0624003B80E620399F1870E5FAF9A75598210392D6306B45285A72D726F9DF83E1190952CC7C75A5142430E2053051649B4AD0256DF2C96E094AFD19FAA5580A37848FA4D87D84BE7C45D0F8427EE854FF67E561AC3FD76CC0E62500AEF396042271FC2B5475E58AE50939D286CDB0015065C30F0F6B64C89CB4B46FC9DDB573A4B78B906D4837B0735FC974BEB380A4424947C4EC8BEFC0D981F4B57BF9D6AD5F8DA9258B57F927495AC7D61C128F144E899BA9759CC8A1A53F128D8CED34D33E13E352F0C7CEDBB817BEE2B46A6265EC81173A7BD7BA8302F75A6E9197A3659AFABB837497C0DA091898741DEA835A3F85818E58829922BE933C9D24014046AF432D256C074A90857F589831840BFE956FF721FBF6220A3DAE1DFDEACA98FB65866A6D38917C1E1D060AE2184CF50598425070574B1ABF7925278F58022C5757E23C7111FCB206114546434A6847ED6C673520B983A52B0FA700C151BD5BD7DA4AE9CB4D2E390718AB1A83C8543D92036787FC732AB04E15028CB093EBF575D3834BFDCB99B80A32E234904BADA02FB47AF76E385E8B01462ADD630F3F69BFEBC03D28E3C296AC57D78ED734E7B034D428D483FD9F32477FAAF782C3AEFD9AB97D0182EFFE6F4E61067392EBFDE391E600F20457BC98716D34429145B79CAE324F177664FF577BE91F4CDDBE5006CEC0A0422BFA99516B2A5A895217893501A956CBA74A8625079465B5D9CB0F7058811E5ED9F6691ABD72A7624C97F402D1382EF7BE5701752DF9E8A100D48277A103AD00DFA07FEEF0A3871A639964E246EDE0C5F3D36BC0889B97D1F32063AED381137FC182061D34F05DE10607B33C8E7398A8240DFAD1C13E5B4D8C8E8E0A9C8D108AA9E768550316552ED2C6234FABB46B45D91BB983B573FE77FFCFF8F79C132DF3871768A0DD06DEEC031BAF7173B8D9AF56DDCED592631B4965B11917BDCC8A1AECE1FBB3AE10E481A372471CE255692114C35FD5EB75981BC786BC09B4F5C6C8BEF0E89C83919DECFD3F0E21D6296E1F60887D88A9143D8DAFCECD9A7F33920A021A7B769EEC42EDF23467916D4608434F0892561F20F10E9C3640191444C1E05C414315940141093054458315940DC1693057C375940B4129305C440315940F4179305C489315940641793054473315940441B9305C4E7315940DC1993057C3759402C229305C4EB315940841D9305C416122A60D0F94B4B5FA48479BD358B93453AD8B07064BCA2186E47DDB6324780640523FAEE86EDDB2990EB488A97EEF56F7224BD140433244D8E58B4EC837D5E21BECB05F347B46AAF141337AA1A88E4C3C5EF0B5168B058A2F7A87F2CB639EEC31E7DC6E68C3CEB964ED50E38722C2ABF8E1F26DF420780F410D8A4E9F3D303015792B54C1FD570C9CBFE140BC39DB7E90A26102F375A5F088836D28E8E5C2D17D51F33594D6A08466673918D4260EAFF5BF0F6A4D43C22D105EFA6D6407C6BFDB3796DFDFBE7B2872F6532E382BFB50FB8DFBFCA581C2CCB5C06DBC6F32FDB7765253291ED1E5730FEE0A728026BF4292DE036B4186D9EC944AD883C2B3AC120A3806CFBC81418FBA93AF1AF12270AFCC6AEB727C8954F287656129175A36264F27780206B31620E4A4CD6A3BC20E9BF40BE0EE809F2061DFF72AD7D4366D260D16EAE8EE8F8EFFDD93926FE0414AC4AF266BAF8658B66A592B368CA87A802EF88DC1DAEDB20D8B30DEF1A049A3277C93903B670CC54857444CF4033D8FC4561C81A1A69402F07CECF372BABC4453D0D96BADDEFD5204E44B1D561C02CA31C54B52AE9BF1573A6C02D8AF7EB1BF782B832B5408B51DEB2AD80FA8D5E1DAA3D9BD4F16DFB619341E64A0E886D54657F3F51C6395EB268C551ADB9C2E395725324A230A612DFF99DE45061AF0BDA48C315C6CAEB0AFC7C495ABC545E68A8DED0934B0A95B545C3D02F44362B3B151BC79FEA2D53B41A838C83BFDDEDD6E9CB936D05F9A119EA6D2629D82C11B807CBDBA49C33F5A9EFFC462CC5A8555024173785A7D1592EC7E7A8279208FB80EB2454EA296306FDD9CB8AD96D1B05E27EC46E6B5355562B7DEFBAE8E5436616BA7666A3BEEB9DF347C098357AAE2DA766F4FC0DE3F93F30E55A96E146E400E1C7195E420C6B7C9104D80D11CF91DECD75A139DBE8CF72A5B66B4041293F82F107157CA023D18E3B21DB9D85223D5F2602E35483B24872868997CE8BA4D7703429248697FB51B647C47BC5AFF9A6C03562EB5473C7E50E7173AF3E29EBD6716BA73627133D2026491443BE2CDB3C59B0451DD6CF6CFFDC46F519409E006A7CEF2969009FFD1023DA600BCD8762EC976D88E3A4A04E441BC5C7C1B59238FF268AC4D7BEFDCFC07F67B9EB483D50EE1002E8F120C388C1C435E8A35245E3B002FE42B3CF7ED580B0C35C579AAC339C3E2D0460E74ED390F74C87396C439F78CBA630252087C857E3AD23FC2A415BC9D6B22395223F31F00C940A816F841D2194F4885A40D2BB5DF9B7B4A75C2F3F5644BA54AEF04F6C62986B3E722D7C8FEBEE20D326B2A52148AD21A066EED0109830D9AE708E85825C04A500D069FD9FD1D46FD44E78DA2EB0778D650C3CF50B4B65250763D4B180C4FFCFD3C642BB7C04301502EA9A185CDE441C38C67F0F7F48CDBB3C3273B00093815D4FCE8065BD2C016BB1D58646AA38AD330F82016314F6E2357C511CA69647E8921478C32FF81BE305DD89184C29EA4E85ADEB6E40F4CF16B2CBA742FCA00C4FF66933E22BCA080B2EA4D2EF7A2709617BB526BC1F09EDB4CBB6194E5B8715610A272D8E0EC0D7AA4ACAC2EAD54493072BE07ED05A5DE66310EC92B5B519EBF970158DF84EAF118E7EF0FD0D5B0317B0A6998FFEE1776EB59B57FD2FA64C11CB4974C91306647E8FF0DDF0CEA48B76880A8F2A960C570A962FD51721C2711C7A93D6E1740D0A0A34BDC581D48643913D5C2B2207FEA3DC72037AB14F2AB1D668A3CCA20020CF21C3699F01523F17F2BA6705B6CB75336F94146DA133197C559F6B1DF059BAEA3C4F948658769AC551E5227C922C6021F403287C2A8861487F0759FE181BCFCE4D3A7E0821FE2FF09A384C739629241DAC45DC24851F1D91349E6BCD80A1B01CE0589106C5FD9BE42CEBBAFF54E4206DA78D69AE081164F66E157FAF4212B0035390B960DAC1961700DF352143C124A421F80D968E2B8854232EA8B03CF4A17BFE8F54931D620AFACE3EE3DE28263F7DC2C25FEA07E74E99364B6123CF6EF56CFC9055FE69DC899A62DC76323D9DDCC899F10EEB10F8766797967B3B392E666CCE11EE9897DBEA4FEC920405A65301039AFFE16AC07422CBC355EAA6B6462638906B34BE8C3B2659DC1E3EE7EAD1157C58EBC8FA9F243A4F90BA5E4AF0026A7301183C73185C7DF0F84B661D0E5770A0F94F24CE8D02EA9FBBB287FF71CFB2AF448D8C70C29FA2D1C55446034EAD0817166DBDB1CCB75F6C0B636CCB8AB67809477F8B8B45113CC443C8B483C82F4B350CF14A629E0A2A07859C1CDDD382C940983C468D6ED8D1256974E9E4621EB0EEE5A2B6B7AA50BFDBD98FD54D2D9A6284BC3192403C279C5B22E252C2D82966735DBDC9FF7DB134CE3D1433C5618961E95698E6362C21872FCC82B039AB3D72DC85DCD54A650DAB4DE3D607956CA01703D3A952E5C89BE3CBD5CAA33118BBDA7F05F2D1DAE5BD3ED97C01F7725673A89581BB8D47BC29C65AC11C0AD3A9F07AB4A4ED58F4EC88ADCD9C0A9D81D5E14C7E842760E096F5DC148AD3E0E0F8474956C97E305086AF64958CCE95B6656C44D5D35987C64FB2CFD2DBD77BB46238B7EF932DDC40B5C768E6FFF50FB3F27F9FFDD8265DAB36197CA92033B496613D964B23DB2EE73BA0FA93A9E3FFDEF1D6A5E18F6211475617092EAAE3082E679CF09EC28D39A5E30360D13F6B17257E30CE88081FA738AA1FF6CCF50B2EEAF8B62D02A806CBC10FE891BD263824D953DF1C9BD2A15D4BAD19A5DB571DEF37ACBC8539CAED549A0E7E1EA7194C8651C05501B247B230A7E4F7084634DBE1B1E985893A8B9AEE799647E3AD5496FA52FCF5172120BEE9B9A6FF476D08E104D546C5F5B47649F71DD1BBC30E07F23989E2794665E08951FE63667F4464B5F831015DFA80BA0A4C2FCEF8B7823EB3227D28DE632A91D63B46EE9F7FBEE76DCF71F37F9CD8C429BD7022FC4C8FC422F8BAF6F372BD8AB65CF199E795920C59918ECE8213BF85E9EA4D22A98E96E5381F03B2B934200D93D359C97B9FF512243E3DF11124FBDBB12DA7049BDF77B0F6FDCA3BADE623E85B36080FE32DEF7DAD0670A2A895471E63CBEF9F09F4FF21B86394CBADE7E0E1235C86A53A2BB59511C874C08A8398622B11E59B02EF44A9A5381D8037FA08CB273C86DA420B47EA3BE00E4601583C2E884E19979DDEA34ADA8EDA9CF97D0CDCED5F48C69FA3A6248F7A533A9A0125A976A1188AD95D7DDFEC875CB5D0E960C46A44F4E19C58946801A4BE8341D3426B1C122EA85FED59BDA6508A8ED0F894BA1CEC2CC7F81FB3B91BEC0B08EECD2CBE74ABE685D62AC1DA4E183444E663EC22EFF353AA35136E84A14EA7B87B57333EC86137C9BD37710DADE9CFCF0281B869C9648EB5AC226CC15F42BF1546F4C7C5806A3649A35A85FC6082298287744F87ABF34D8046EC7F7EADEF6FC993D4EC01DBCE9816DE0D2F3F62E892EEEAF0CF91C3E6AB0AEF422EB24BBA320157C40AE1A105A57ADBEF094C6E36D5453601C671023D6EBB37C0FE44F3B2EE7428D0A0AD95FC42E6DABBD60F435D842D105E585DAC5FF3F7346C6AAC99B3A5DCD3B27B6208EE5BD48B6223676B7AB24AAA23F0E89105F097B9B297DEB2EB1615878B87A1D3D6411E27F983D740B171103D25C4E38D4341147644E1A6F1E133232C31EEE161EA8D6C375F90779B16C888B92D74EFB74688D366844D4E4DBD9A8BF4D23FB5CBCCC7E3E68ED3A10DE8C8962C76F3BBC5E44931183E8A66957AD63A2AB03264A95906146EDA88D60DD7B7F4E6DCF3FE73BED64F577F07415F2D14E1E340B674671C49692E1DE4790768F0E760004FA7236DBC00308A7CA94A832410C0ABF729C9453CDB2E3F137CC5516075F5BF88DE9AF65F9C826CD3C6766452D93F20BA908857E2A7379B2666DF7A159FAE39CB1FF84A4F83EB353D5E35FE4B65FB9A2E70CE15E51D53107281828EAA9E97FE00E9A7136661A6A0B7D02E50EE3BEA0D75E23C2CFB1F37B844396EA282547A9141DA4E4698089DF75CF6041EE9D28F492CCC25612FCB23E3DF32856832EA4C2718CE11F1CFB734FB865C40494EC856E785FA95D21709038334D72B117708333FEA4B0DD6DEAFF22CF8FC65013C9D31FE9E02322150AEE58DC5950ED953BCB025308C4BCA08C31AA721D1FCC6B4DDB15E75C5FDD3C16380C51858F826F33A65A441A26D72E398751AFE46E50AF7CA210A08D6D1F51A3FE11FFFEDD8896FE6688647F2ABFAA57E027AAF6B129526866D3150B0BEB50020E0B88FED871A746C5B8E224B0E7B8FABD7CE68C03AE4412CB2B62CD63E1EFA893E690C8CBF78C9946C528380C9D9A2F1C3CDA8537AE676F00E4302EC8623D123A1A9629477EBBFA9825569B71251A320E51B7FE536618CD09D13730D366BC4FAD3FED62DD81A00995BC4319CFC06A312E5170DA22C9C2B6417DA597431B1CB7D685F209D4AC25238A5E7310854B567E302E9C468DEE089E96C6734A381D9AF83C2358AFB7592385E9BEE8490ECB642BB50A5544D27083408BDB3D8717D4BD1D6F74390D9D559A813CC200B33D712E1A19C6119D8B9B3F789EACA6FD6D59B5FE07381E83F6F725D2228C8BEB8C9ADF3044A0467ECC56D8DBF910FCA8285731E45A61C71DEE13D5E4090817E41D8680E2512C29B0805D10A8A8BC3EE18565DCBFDC2F485BABA2002E0EAD7C00DDEFFC38D38B61DE5E72F928E28C3A6AFD5F635D437203FD8E97E18E32BD240227BF3870758EAA364974F62637750268DF22DC6CEFFDECABEC111B8931D602C23F0567A3C1759CEB0987D640954243BA700574B6D0A79609DF1C21B5493D4D0A30CF0DFD20174DABF3B97B9E62D104E208670ABCA78171F4CBB75EBA02B474B56240796AAECEA0B6F72F45DF25233967ABE474E9F551ACCB888345F28685530267E2102FAE74E394FD8C2AEC71D31C5D9B862D2E1BFCBC2239E4B635B4F4E1BE65E4A2D0E051C7A48A667BC923FFF459B5562C497A4BF60AFB4C12FEFADC873D7177FC3AAE108445DFE80FC051419C800A7F9A6D82A718DAAAA487FE95D426CE037B7BB460C318D35900EB826A82504563F2C0938C77A63EF6F6D6C44A7BF088738C753859B47E8735EA1896F5A27770388D91F2EABA549D32FDA397B70256B72C8D9CAC3C99D0436D76ECA331A69612E40F2194AF75285E3B8D461499DD8ECD176B5C22CC59724282E38369FF4FBF84230906A17854F8D0A767ED9DFCB5175D1465065F3B25DBF17D2E38BB019E727137D05BC3C8F78F93231A4FE6ED0CF156E8B3E6DC1AB310EE12CF0D3C4EEEF864DC3180392CEAE0BA7C7C3F62868C45B3D5F14463293A0587EE7CF07F091B9FF1169164D07B618769EE83364428AA2D49CBD6B6087DC886070C439F2BBA92A10989FDB122B81F34E71A4B4C1B94DE6D3E640D8F6D5C84773636DD4A0EAF1EF58E4542A13AE06A08E9D2481EC087A701F0B97D8554E4A41E7E0ACE072E63FA095E5006AFA69101B50A498E0E59AC21463EBA39C00FC77DA4CC0DCF8001B6A39830E57AF4B12B43939D04BFF1B96DE9DB365BDAB702DED7F0786753E57CA672387C8148047B2680F230E80D12677F1DF99065D9F5F2A004BBA63ED94EA56849F78F0FCA082F956D4C7B581962CB532EEA7AFE7F248D572F117496AA743472D24BDF8862D0EBAA34AAF0FE240FC30E35DBED39BE3799F305EADF4EFD20A630DAE9B6C4CE1FCCD8CF350A01B5F8086E859535847C31E27F0333E476D577C14A9B9B1F626AA6BA19AE5BD10974887C0175859F20E4439A877952838840FD5B5037CFE310CEF190FE08D8D824491809650921ED407BA631014A15A090A9946888EB1081148A3817A14F75DDA372F4D37AB0B44273F28768EA0F02AB2B1BF025541CC85F7CAA12277845E995F207A478268D7570DC3F50EC297EAADF5C1AB26486FA1C091943FFFB15C312F317B3DEB246CD626D3BBED03A8A19BBB1864CCE24FC6DD10F00FA8A0072460EDC4A4D0ED1F6A5F8816D187FA1196D00399A6A6B780C052FF79AA28D3F5430B1D6C0E6AAA91132AF0413B23B603A0A51A32772C1BE1FC175AC965B142C323FE5E4FCC2345D5A11B5D4AF368F29EEF9E78C1C82D0B1EF0D0B31342DA2CD7D9736E062D4F878283577CC7AAC23A7E6D2D35D147509FF55B28F0E741B996E8E0578EFD40A3DD1747E28F4CC6F21B93A1125CAA676DB967D296AB0A429141E0B3F65001A3E790152B57F868EF5333C6DC4390D0307536C7C855AD1663A28590104E0C1D1904C000E832C691D245259145062859F0892A84D75046847666101103C99712C879F96F1A3F5411F5EFD1CCFD97C12E5C9E0933C861D4A477BA6149D8E077D67CE8B298FBBA0A96BC236BD6F117C9B16C1E28F83714F41B2DDF6AF24B09D690C983390A9A5B0B5BEC028B39846FB7A3E4EC5F8FDBA5BB345AEF4477DA1FC178D67FF6AA23DC39D35AB36662D602484727236723442241320150C3920650FCD03016E0666050B2D39455175393F46451329756B333F5361532F366D536323151679535F662123765F2B434F660639693B7143761C80EF87F20FAB672747565886755EC591828CC62F1667AFF37FDBBBA32418C1519E511F24371571FCD5F898D1875CABAA281354B9D66324692DFD5215181381BA0F659B45F36EB84378228CDBCD4AF2607799023AC6E384708721CDEDB6786E9BA26F6160DDCC5672AB2E3BCD79E141703849747F5083B24E68718D3F715482BCB5D7B3F21CF83443E96D609550024F121951FC9812091986ADD763A29FFE0F6CC41056D898019082E988D1C075A299B71D675C43AEAE6563C27492C7D3F2B2A5B6AA723B2C0394A632C8AABC85532357E072D06AD019FC7FC3FB00094182EA0F8E20FE33D5FC47497D024FD2947EE25A42C1251D9F436CA9BE67588E8F556DE8904859410D061B2884DA3B335E86D8E93A4726E35F286B91AD544F49F8B154AAED15262B917204AF54E9E6DBA638E51E8C44F7B972C7F1B82E72ADEF5A6BAC8D77C2A41C3BAB34CDD7C80F72DB163C2C2BFCB509F18AA96213F831EBA32F02CD6B3E87B5326B8023EF5F8A4DBEC7774DAC6D3BA6EA6AF7C642698185631316A34CEB40CEC73A4509F974C8F44FDDDCEE86F0D6DFDF8994DE4F08F0331C64C2A707555557E346F57A58341FC100F211A68D8147940B782FDF52E113C0E4DD040F94F8E53D6E320E146BB6404C1ECB52A03C4F867F1B7D43D6366F7BE20497EE0295788E539A6526A100A09CEE62638F15A7580350BEFD519B1F2CC79A26A6B0F133619F0BF90D0F741E077F547DEA027E9BB62D117273E18729074554E48FB973C0BE7278DE99B3DB17AB718997EBF074E8594D086E4DF13BA9C584B01E19B6B2262D80C9022631B9D09D86B570E1CA45DC95B10315435AD8812D2D1F6DCF171FF24FDAB08EDC953F8A7EA9D2A3A9AF9FBD47BFF98A63E3F31F7C18A814C1186D3A3ED8FECD7A382423EDA8AE684DCF295A38DF8D8845A1F3D0E1DD53350CA2009966EE64CFD4D4CA002D29D725AD4AEBFCC1A85B6C2169B4BEF148D41155DF65C3F9873056EFF193B57EC40D86AFDB47FF808014D28F4324B29A44ED5A8EE1BF53F944BBEE4FF362D8D2FC7886C9C1AD767B740F18784EFE17098018A05375BB86759D7BC560A06ED8F1E6D9C5C684F167B513A91C2859F09F7915584E1373A1DFCAA5C99D73BC8DED57539113A01A84783AD41985504DD013AE0640EC136D7B709797F08913F35C1AA60EA298FCB29EFE2FBD23A2D2ADCA728E7D234454DCB30F41FA2DCAAA2A85164D711377FB0B418A813467178835347EA3B521DA280DD4254914B7C177D5957C276634EF677ACCEB18C3AB643ABD55A87497C217D07200A7F501191567C27D34DAC132D04FC788537CEB7C609F7B98868427C389A086E4E01591028972D2038CBB80A9E65080A8D7F5D9F5C0A563280D73633B6E0D2A4029CAFEF07EE20C9D490499FD68402E91DEB9FD7DFF923BA53AC5E9EB4E00E00D4774CA051E2FEF4046B562DA6758F575B111EE746EDF17A0814066B4FE9CB13B6B82D7FED6C044CC48052E6A0FF7AA0CB334DFDBF67E33AEF7B3A946D20BEC9DF7ED58D78BEF54C7FD9C7F4295CCC39CF7C25387BD1C9C6ECBDFF573E8BC5A7CA29BD45ACB32669039F41C2B68AC9CC5B0A97A7B659F86F1E994AAE6012BDA9B4CF9FA1D4DC6C13BE3B123798F7193950C54AD20C06A16DE5DB72E2F20FA6859880CAD32DA0B8FDAD734125A9D8BF93CE6B6BFBEAFF4B83C62C870AEB15FEA6B493A69D4AC8A0E4BAB11231A97160216DD34DADB79725E8155B6F209CB0A6445A193B5EF04AF8994984C8902C744B9E060F6F3CF2957D89D4CDA5BCEB697074B7955FCFD74E5F4CA3049269C153D6C0456ABC2B2EC8CFE009820025CB9FD93709C8AC1AA80C4A9DC5EE5525171A7B46735C4F9545591D1B63745B00B9A5D427E81AAE3994E3B28F7B027899BB41AE790A2F9840BF05E65B5D09137A25AB031BDFEC1A6F4D5B4FB079C26CC42E5F41A03243EA4349825C4715F64DD31BB38FC40FA5F594B5D4F9FE0BE492161BFAA8F51C6FEC59549545975A9966E1C547E78977782BED68BD1986689BAE011BAEAAA848AE67FF907360CCFCB3726912F3ECCF5DA532B91C088893B4F53032CB34AFBF1D36369A7329F1BBF485EC46D1707E3848B485DFF10F5A4F45F4161C6C2C10B4DEA78E8D32607345C9E50E964B05DE817C1CD548BA9F4207BE78DD018F93D9A6D53F80C75D57E4F28359344E86FE09C9C42BC275FD54359028BCCE2DA2BF0BAA8F7C78E343C403194E3A3561C8DE3F63A0401BBFC07E49DEC5FCCD360804447270F26728CB4C33753C134BFA60C2A3D41185E9FAF4C6C7CC94D9F87996D90545B487A73BA337551C6607154F502B78230715FB875F39EA0FA2620362A75DEADF78EB989688ABED3B442D67CFCA36CAD3496DABA733C45EC2B199F22EECC18A0EADB02A684EE2B580E03942CE4C0E568EB6207DAAD165F6C3F6C3312E9C44114A85BA20CAD8E09735491B0CD16C443AB84DCF3D67C103EA677F8ED011672267E3902C701A7A2F80518D22ACACE7F6800E00397D370D484465E19174FC58BF53EEF641944713449A2CDDAA5DF631C20558C84550B40CB5151712EA92C526C38281C4BED0C4FF47CE547F89BD5A00BBBDB52703431A9756843E44A45CE435F400CA29A97A8D01C59E2C2BD47042AA78F854D4724B0B8FE60B85DD18E80F813D86CE08801E1920C91EACDF90BD10FE8B814AC0EE54A51598035A8D0F62D3976140462C8806C9279027E1081D383176C1516FE3204378BED3BFFED4B6678E16DD001A2115C458DADBBD69B09CAAFB3C0E94523E27CF5F8C67D9853BB5AF9D561C8A068D2D2FEA78CDF9FAABC4AA5925CED501615C55431617CE120166929DA80FA62E16D828186E9F6CFA0EF7C387F4222C26788E9EF314781068765A54CD2E44AD659932D276919C1915AB9F6C72EDBC8116CE60EC18008F9A91A5454DEFDA0A07410470B1545BD5CDA2734C40C071AEA0C97C316245B38962A1B8C091F78B8D997DAD3EF100F71C7BB915E83B8217AFB31FF9478BF1D0642AFAABBAB5B04E98E65DDD7CA198B4D0C703C189467E869278186D15C7D06FC5C824C62435E6474E2F315B6DAFF74F6BB7B7ADF17B75E48852BD9F66E4464FA21D9921E1DE3A6A80C8EFB349E7C8FD294534C4CBDFF64369CFB67FE1E607AA06986CDA87FE5695B1252D01DDA03FF3BC0153B4789DAD66B03DC6ACBF1F553D25E5D1392AFE61CF18CB65581A0B375112C33BC7FA712ADBA694476CCDDB72F1DED4F05B91FA4E549568A0E5ADEB7BBABC1AAE99EB1991B5F5FEEFFF724CE08F3BB40A9EE1E147ECC6B6190135BF641418E23D0F54556EDF4197925778433A843E771DF006054D0C7043B213BAC0ADA004834690BFE8051D945BA544367C2B0561080C72B7DEDFA7810A433830AD82C3EE9C7D6FC1546E2EF42F760AD36FC3DAA004DFA454C5D4417BB6CA35160D0CE97A400CD7EB198416837A59FE8A100D34979638D14D29A057494619289CFD20C835AA3C802D42DDE59E9D2826434372054A983C38E04B10381D4D10A9FEC3CF77E4A747084D8B55BF5A358A5E3B5B137D23E280F2390E2518EEE5CBD446ABFDD1BB11B4AD52555DBA2D7AFAA3744BD5BF719747870B75F071425008D5B05F587CF8FFF067AF7631DEAD6796BFB4AB99FD60D7DD6B2A2B45B3C9339A406E86F5FBF18B4C69C5038E638119553F804979FEB769E5FD0963E90749EF0B2EF97F5E717D239CC26B47B3A948FB000FBF121C0E4C7A3B4CA4853317D4D18EF88714834938EC3C9D43DB01969BD3BEC62AE8F5A1460D97B1A8AE6C36D31CC0B5D013446FF4AA2EC7F79022050AEE8BFED9F0783089A7E8FB5B3289F668D6EBA1D3A2D29E4C9A93FF6997DED81730ECAFF8FCF6B6E6AD1566DEF84C3661AE7564D0101872769D7087A70ED87C297FD5C150B2DE4D2E00FDBDFB48AFC16B819770C8EB0FFB389202D80D56B2966945B04640F3F3AE600C77ACB2FA8ABB1BF3A6A046736D14B39342DF9896FE00A844B28B64F7E17C778EB7AB2CF068FCA0A2D7161586C7856765FE554E6E83948DA9CC254044E0D8A0729BE4A51BE4ED02F1D89DB6B6EA3F2DAFAF4FABDB28B19CF1E6F65507B48D18429E7BC5B34288FFC749BE8E6423B38F1A04F0E5092FA536C9B883A100A5DD7F5776599848532DB818718A25B3C16FADBF628F361FA160E6E42D4BAEA400C4BDCB77C904D89087658376144B0434B18A991F3E8DE8F2B848A862EE2BB4C71A650E1F29AE50484681CAA8DD4014790BBCD9993F7A8F076AE57FCD3E66D8E3CF5D59B3CF1F8D16FA0A6AFBE9C3F7DAECD23A95A1227D3B02C5947ED2EDE517F5F1EE2A5D2D15278962397DA0C256E7F8863DBFA38CC8FF14927102655D6925AE5C9FE87119EDD1ABF1C60C1D19950D8172D903A82A40944DE8A50D156031F80BC42D583D1CF7329E1C4704F14C2B7FDD7DA4A989A2C720441904D487E611AA9A8C431050A09AC12E168199A7209FFA562808810777A9ADDF8B44DCF9A91EDE0F96F7390F470B7111DD118506A2809DD64F95D261C33237203815DB92AFC288526E517959D5835A37954188020BE265CC4B145165F78F5C802834330A39A6876D7ECA155269B895466F931057E0B18E66AE6693221E586012926C05D95EC92F17F31118651B89B2409755809F5EF756298187934A4F27C761A46F6DC1FB3CEBC063C67DF3CA6E3D1A01F9F71AB2DDAB3A76972E9198D321F436641A2621FB8E563F18D88FD8FFDB1929D5A515680679D254C76CBBFB9EF1B1833D5BBAB9BD4D1EC2FF027419493FD4C55494ADE15539E0A150250FE4775EB66406C7AC896368CFE3BC0CEF22B25A16A3D742A05C79EB06FD99D0B22F0C0808983D434B232FEB00007982F085868AF92E1F480E1C78C009E6CDC140C085173C71DD15D9E885882AE3F0EFFAA568C1B7D6F9308155CFABB470DB411C4220EDF900D5D1EA99829F03D27CFC36B3391276ACF42E998CD08364F473F857D312373A1702E5CA9E44FA06A1458B048F80D8CE517BC3466880B0117FD32750269FB3AFFBC916E7DB98081B66264DE4EC574332753D21B0324034CE37951C307994CD844D166D450B0CFEAB40DA595F06F5F04FE31DDBD8C98677A14EAF4AB4BED22BAAC152A40693B737A5F65B52080A49FA18152352EC60A70C02412D78A924236B9BA102E487479D9E3F522886485412C0C59D3A98AD30FDCD6678C28C973EED8778B5AE5FF00053328CAC790A6D05D6E5CBD53E5D7FEA977422E748382BA34306116A4AF59CF9BC6F6CAF77D22D305E76DBAAAE81EF0AFA3B54AB047D33271D1EC1BFA8E52B3F8F77CF33D0F6FBE10BC93F5C926E7C5DDF5229E05349B464853B42AB92F1A8C4D02A13565826FFD45AFA12714D3556D320F0A4CE623CA67829C3FEC3F29809887CE84C907B5B318F407EEED23C6ED0DF856F1AEA803B623E4B73A54C55138B40D09420B2A2328F4247A4E1EC81131C4A95A418E9D698E4F71F692F38B5C4CF8801398056E8B0584DE58186395B595A3A0CA4E33B4CAB00FEE3DFDB99DC38846FC4AAC32D9C4EC8E829181437B189833745A4312D329A2C9FCEE5A8334F613B47A33DD1D65F62D3E1AB2F012D8469F6F00B1D69A6BE2007DAF5612828A294E4D0BD9B51B0D2294FD78D3DA07A56361F614F9213E7B419C7B395D2B16FAF22B408D2E27D427113852FA22794047D31D4CBDE7731111E5A92EA2ED6ACB05E9E4AD47310544617E85E99E92EFE6D303BE3D9BAEBC6675711F4DB42234F17536D191C9B2632E8C34CB866F153CEC4384509C0059C42080C83A120840042105142302499620C4DB22829901C7EC536EE1D401D3560DD45A52317B07317541D99994167858EFC93A301DDF8BD180AF00D4CF2DE0B03E8217CF42DEEE0E39824E3F9F0B86FE5D269F15E403739759B8731C1BF88E18267F6F08B59F8252AD405E5AE7E066F02CF2EA4DE213D043E97FBD6FD946A18FDBAA6F97DF430CBE6BABF791FE109EE798AC695DDF6540BDF844E974C83D584D5ADDC51EF2BD7AD3B094ABECC4B4FB85A3D00032AD3AA0D46B337E2D39B002D0EC3E2F1512FA85DC1187F9682D32BAF14B1E6B2E1E352E1A9AA9727077C1161153CB3875FD441CEC29328C5C7A8C5805E447CF87786CEDD121D65FAD00272E3D706E76A56B34F699B9CF422C49757215A2CA6C58F5F906E6D684D7A1C3F39C02064E137437817DFF7775199114E11646C6CCF60A0670AFC581386BA031A7FF59FCCD472CA080C7466F1C1D357B350FFCC4A965100ADC99BDEABCE173EF5EC6FAD5E0550DAABEE9B94671B2B2A88BD14B022D8D0095D70F4AD39D70C1A8A4290759F9EF5FA9D8E8E6287380A264B59FCF16273D00365AF505933E2ADD0E8B1D604BD1708ECCE3DE0B41DC1623DBD045E0DEF324DEE9189A4870522EE1D65B80AD6960E198F738D06A30FDA1AE68EE293C779F47CE835865E51DA554B03385CBF94088178F51C1E8CA2AEF085C8B7EE701F8B78C73DD3AD4864FCE6ACEF2B976080593D90C9BC95B563CE75FF9751F5A68DF1D96A56525C19FD2E4FF19EB43C6C4D69DEFEADB186D7A29DEE16D088476B991A0EF746892BA319C4FD21B7E01A648116B4C452AE14CF7BBA089352966EA9CAE8748E2CABEDEFEE804390F67B564B30C6AD6769BF772EDC92A9165A10CED8091C7CB77310087AA491F260F2C41AD2D17C61EEABBB8C5938ED8238AFD549C38A5BAFCA07A5041AD068B6AF50DCA2B74250739FA065E86D09FEE1DB93F7B95047E8F78BC4AFFBDFA14C0B0C9FE44559FC19D9EF809A157D1A5E9111E963FB253AAB85F199C7DCE306D9BA501AEB40BDD2C8D2B38815FB76144C0557B14115FB08DC39F6989F22337C9408F1F97FE183FA386DBCD0A22B2522D9337B1EC184E9817310C58B372ABD80FD963D0196A797A56398F901AD7EBC09C762423B2BE70C59C0BCF6EEBECD097A054D2FADF9AEFC725CEF2AA4B353D1FE66B655206D6F045C898F50BD841F7BEF1033D5C49B3A15E7D537C0FF0B09FD0D8599EC286ABF4E196EA3F6E52FB14DCCA37D0FDD9F72F461C3882FD914B70E7838AB10A5F4C5566F070313DE97E1A3681BD65375DF9C9B3552DF859A100D74EA2439FBBFB48E14D0C1D2E4CFD66C63C99814B98B900AE0D05CD4E0BF825F01717371C65A50A303F4FF05E6B161E6782F1E99543652E550AC7438293D587746B891191028D7B2AB18A6C44B61526E1F2FBB206A9A2C6CB91F5093E1965DE71E83A4E322F7CACDB682CF9D975696F855937F1FE93B8BDC3349B6CD02ADA486B78A081915286D9C5C9CD8F480FD8CA84F069ACF83040C584F529790A264271C7FC848F86827EDBA0BA0CD4413DA651BA87D8813D4D6FDA698FD8BF899EF7CAC5A52B28026F5259270E86C2E7B23515CBDE6F12F7ECB8A1FC7DBCD6FB1F7FD2B39834B342A37C513A70D891818C12CCFAF4DB5C1464DD67E6A0F321B3F06BE84242BCA41F8298BCD3B570CA3FED6C2FA0988D11541EB559C1B34A60AA4A9346E28F8317F4013BE04E2F0FED5337B5D4503BE5C7B115FE1571D9966EFFD1B3A23D949EEF90DA28BE43BC03187673434514ACF23C337C15FF03448041D68CC1B50EF85BEB07058591DCA4E1F537D1AA196E1977704A945A91AE16FE476935A273CD75E28B8DE5DFB2BAC9E9D19BCF862B5DA7EB8B21B748463FA64A025374F5E48B0C97D66742ADC4EE9A9BF017EBF2DC15A9494244D34C7FD3452B8F3197387AF319BBD9383F929898F828383858DCDC89491D18891D58831F54E66232356463316330E46532E4E7673332323634E56365323D01B855976FF6D21FD6C8F8511E1ED3857557E8C6CF4D7B4FA842F1043E314E60DB7B7B93640DA2BA1182F5E772B2301574A07F87CBF8C95DF5ADB936A5761EC04AF81A5BEF67AA01065AF3DD0C56EBA32C0504E56696871C2B489C2AA10E9EF22BBC44441A1017947E0FB0B9DE4D4DE2DAD29482C33B86B659367E9512901486F38D23FA092537A92F77B8D6189171AB8D0898FE563722EB19C9293EC20AF877DB6730E6A172437D77FE1E7BC0ACE9761393BA080E274C6EF810119F5C5FC1DB2FDC7D224863C816BE357D694422F6EA0A8A61CD7996AEAABFC3BE2507CB561A1C6CDB285E2C2DF494B65E9EFC83EF3B738EF11A282B36540B1AAC245D1860CF1ECFFF3F709A3F04A1F2A80044792A5489EF907729E937002A2A8A4445F85F17C2D1591C82908F8482497CDB7CB6BB7B97F70071F0A1E07C1E4CB6BE6E61EFD1AE001DDE14BA2997F82C132DF8C8E8DAAD7C27EB3D7DFF9CF2B36E4E56613E2899FAB117672B21B2542B247B7C36742031CA5A15FE67A0D5B947B487AAAB490A140E51216F2397A8846CFB22F296D5552C72E5B4EC11D6253090FC9B836E3B1515B2347F658C4CFD13DC24F581103B2480A56F4FE7978CF4C952CB49067BBD6557112DA97F1FA505BDF9AB52AE64F136F321073CF26730A41F472FFDFC4523434CF908CC57D2717E1668F828F1BCD4B1636D9687F96FDE486CC82D83A644A85497853AE35739F3504C242663AFC3A09AA43565A9E288F113A3FF3E51BB2AB451A0B5B58EEA70EDE69EE8E38A6EDE4357FD31B7BE221ABEDDE7F85EE43F377733097947B54D03D96F32B6276B51812B321A06C35D88D5BC557445970471F7906D826574DFE787B5239039D1250FDAC5847E5E351707DEDD595FDF8894212AED853034DEA891C501A84AA9B303104C1A0CA9EC57B10B7E9D0B364FF2252A8FA1185DCBA12C6BF4A190B77F28D7798ACA2266B1E9C19226C8DC026CDD7FA3FA94DB64C8055671183B9301D7597FDB7BEFCE7E4FE402E54BEAA17FFA6BDCA4E1F6A9E5F15559CCA07050C867252445FD8956F44CC64C3D31C0A8E0C1E2B19509B0E446D0164CB63130F2EAF5EDB79EF6138710F1D68E301F163B9E782C8DC8D6EF960B7BF32CB007F11BC9345C2650B633263E3FF7EDE7846FAD29ACFABB577B1E7D2EC969C4CDAE5761EAB1DCD2AFEDC10BECDB164D6CD5776156B929F6DD815E947B2C41887D455051134E8260FD4550374EA18DC3D0324050225C2C528FAAEAAF8EBF4D2F7690CC59F9E88698BFE221438FCAB34B47AFEBDBB40EE361F0835F17707E9C39A718E8EFEE591ED369892DCD5D51F9EA6ADEF6812CF665A5622861E22C28495FCEC4D7B42DDBC9F052627268E249620C3E5D25ABC29A4E72FD8214F01597F47448C71F46026664702212EB08CF95BF4F6712E8EEB49B137BF41DE5343BC0AE0B55C3A63A09FE32D49B9C646917FF6AB027683F47E1583EA0C6F852BECBE1689C45FDF01DF06A3EBB4F97B716B1C53B30BBE935386623048700AF2F58ECE3D766C5477B1AD460672CDB3D9833918851A68D4FEA34EFED3204A1B01A0C0FFF7EC3F499F4CCB312F6B460BA5D01044E7441A8EA4B3A98FF67C65C718436BC5A5FF3CB4D5839C13FA03B28D411CD46B983F83BBF9865685102A0504830B91FE8F7C3379D6DFEDB2975C0A6801AD6DBE733C0D0B3FFB6ED41E8DB64FDF4FB5416B5E6CF93B5978E48214D41EFB1CFBC3F95FB1671A1673411D2AA34648C9219EAFC9C75A81FD93703E17D2BF22DF6AB6CE2ADB355FE14F18476FB67299C74E26AA989BF5E4452EBFAF017EABC0B1101764D95780316C691B7AC1ED6FB91C9B372ED1BD0CD933FAD15076D4399A43C470E5878E7F63EB87CC64D31888C1A1B2BE8CDC6569B6BF462269121CCA130774616E23339770AFB5CDCDAA907E2BB8EF0C386206F62A280E518514C2ADC7278EB4900CC10AB5BC51257094CE68483BD4FAD7A55F47F5FB7B6E2471DED44527A25EB7DC0B985237CD2592DC8C63481A55932E0CDE2D2D137A995D25BAB83ADB2721D00ECDA5FD86A2F2CEBD6E623338FF85AA7E3955BC8035DB7890629C3C5BA32671A8FA993308517F3DE01FB3E51EE74376BBF4885967AB12D8AFED92CF8707CE5DE4B898889949CA6D52217774BFECEA71D20CBA42ECF2B637D4EB15D0E0C2AB14321697615527CBA3110A699A3A4BE9C9B1CD936FC3ABB002B6D437578631F679EFDF8873295D5E2B75F411C32577DB48F0D10DC71991C1A237E28F323D1788290F4F0B24F22E80FC051F0BEC94C20C31C6BB91049F9E03404766009A36040A1BC5858A41FF137FD73E9A0703811EB0658C7BE943A965A1B05311EBF528216DD122C282D1B1480FE8C3C042D62F2056D7E3C2820B57ADCC9FDFB116304E46F7855A5235265264B49030A399ACEB5E8A1C1DD6D03A10DC51A58545944DE3B3FFBBC3780673FA3EB80AAEA9E8958540F290FEAE0485846AE99C0CFC39EFBE59F07BBFD36DA17BCA7451F47835F16F5E01597FA02ABC01E012631BF79BB3609D62673DEBC4CF867BF1BF3DFD877ABC30E1E6C50BFD09E65517145EFA7CF24B5E0E1543EE30DE52D27485E492FD8D51B8CF409F315DC2C48A6CC4DB7788846C40A132E3CECD40CC050A84A7239C52F2D132487B16DD45D708BFE1695C68AFFFF50DA297FF7C99FB5EBCBC1CC0A0EAA70743488FDB13FAC34FCD2BD2B957DE25A980AF809AA099A3A0397301E4A2F016990F61A31DDFC5FC625B80DF51E7EF1C03424FEED7334994F9AC3F004ACABDC2E5B7B6B571F3111219E796D4F9C2C8BA2823890D02958D9B1C0DCCF7A5201C7A864E9AFBD534E356AB9608B91EC1C74B76DCB0452C8C515A31BA025958207BFC1925B82C313150BD79469F52A66A6B918369CD6D80737DFD5A834C5D30F73B74436DEF1795357562AE8DB3F60759182ED7846C65E95AD92F0DDACD58F4526C54E6B79C1335415BDF498F51C03DD0E69B9E8E450C0236D8F7B6FC501A7D92DFB7B8877BFFADE722C1D61FA2D50F06F497ED8E32027A7E1C8B175D5CE91E1DB5FCFB15D611F286103DC90F5B2DCEAF033013BCD142DC95A096FE5EFFB3183655E08CE5AC7BAB608515902C6CFA2D9160DFF40BB13B0E2D711DAA78C251C01081CFA868E67D2D2DF2C1A519D5EEE561BC5A0A215CBFBE593E84E9CA19F600C832F8455A32C7BACA07BBD97E810F85FAEEE90AF63840FCCBA45B938E9422F777456EFD9C21062F4D7D3A7CA005D86ADA2D76908AAB558504AC44E839F21B539DC72DCAD9EDC0493449545EC1E17399FB8AE9D98E39CFF068DD6BAE454881D1AD0A341EE7AB36C196C52805254FFA4523AB5A8076BDA67D5FEF02A593F57E667A8845BD7E79A64C2D88FBD82E7FD6E82C36FAF04DFB0101754A6EDA3BCF05E7E7ECA7866A19183DB73A259D4F7525B2311626F52A47B78F91D3A0E68DB2700803705F25D7E495ACD661ECF21CFB8F21A2268E873E4E870DA23FA032F323AAC591A5C915011D2B19D02ACE2035687E52C9EF2D211E5E7FDA7354736E243BC7E78296AAA08F862E284B011E440363D2C577EB01EA15BFFBEDB46F83CFC0C033F4B3D67A42CBACDDD580EF8DB7411CAAAA1B28A5B46F887265103D9BADB85CC54F949815B7BDDE6F2D1753B9487D37AA421440E638F5C7D667FF77A7D92ACC9946C3D397685BB3DA5148AEA5874562AA43ED27107DFA3EB4F3F215471893C94AA9CC1E78C20C3AF0619ACB9EBF64D896C64E6A54EFAF4976B4D84AB7704A13F3661FB418822300473278F84EA0F6DF556E543AE2366618B9820BE787FE680F19FCCBFDD8E9D7590A9E92C91CEFCEEA7BBF929B3356D51932FCB7C92CE0328B2B8BFCAACDCA53FFD6B674D2741CC07A32AFF6282391D3D0B862E1877DBF1566326C9305110597CB15D23CEDB4B3BFF9304A9F3EDE9D23D992E9E09F12E3FE69EAC8BE9C4A8B1F15E2F2CBBFBAE35D42F3E3011E64FA3E9E2A0654D8FB63ED808370BB1D64CA82F27A4C919ECEB9F72DB10D3932F7D2E3CD00FAB0924FCB5D48FBDC8505E78B44B49C618CED0F2F76418E02A72D9AA2B56CBC0F33AEEEB3D8A3774893B3F61392AD635C75A62F3A700CD47CACE89BEA5A00DCFECEE69F7D26226597A0AA93E465EEA471D7EF49CC7EA0DF0109FA6A9C61AA136194FB98A2E886928348BBF54E3D38EF8E4AAD59B9A32AF315B6574557E42DD408A91C1A48A360BDA157C3F5BAA0892CD273F04470B5A91C7F50CCD53E25568816E43C9618D0D9DEACDD0E093BCA076C47F7ECD6DE0C44F9F20681A05282C83CDE7E3452AE57FE691F6E75C63BF5ED4B74A61CAFA4C4037943520F457CFC00C06BD1B18A9791AE0E348B5AD687F636CC926B33317C24AE5659CCE4BAEBCC65B57FA8966554C5EAFADD4E21BCEF7ACAB721F5D7676B4DCA2AF0E99DC58E4DAFBD65D8381BAD6B3A239D3DB81FBB81265CEF7229B317B5C654132537112E6D94D51931A6BFD0A266EF6215148152106AE82C37219A4730F30755B8C612A47D018CB36B6F15BE11128C2CF94B478A0D4134B0230007DEFB92DD12F0254BA489A1CF9E158B6F19F52DCBBE8329F36B6882EA142084717FCB6A271A592A29C42582D878894DE61A1544FA9CFFBD50752BD5628937091010BE1ADEBE2ADA65938A49EC335FE5766D369354F7756309AE9F5CD09F235CBD79DAB9B3BAFCEA96AB2443C8B21FBCC7015438878372D4E3DD781830A89F6D7F75089BE032B49DB449EB08F8E10184C081C4E8B477E4F39C71802AC7284905A5EC03737957790F5B9A3151931B490B1C671D4AC4DC73EA1C42604AC6E4D79A5E6C651D299E43F0A3D207FABEC0D5BC0F500D069BB67BBD2B4566F8E356A1340DFB4301C1259B49EC84D1885321FF418405542A151E2962308DE6D049C7BC40C5CD4D44005767A8516054E9BA32B58846D287025F2ECFC621EC3AC74FB64A7E482D3B85B9D660C2CFA752D898427305AF3AED0ACEF57C6786E704C3554B81DB082DB880C885652C0AD76E0768FE042160ED9924C461E45148FE4B7C7E9163084395442908127E7A171C02E0BA60842B6A791D962312D121F93538730953BB7EFC621C6E05A7FF6F075004F969DD8F485718A307CBC05DF29498245AC278D19D71F54FEAED32660D7359C523DBD01195F81DCA50FABE5F782C30ED806BB7FE156EB102ACFCDD073AF4F957A309F33EB30D12B1CAE406439A91DF54E47BD970EB7F447129755310F1750B7F348B7D55C52AD0C587B0C9E01F7A2303669197106915C2B868D16B2666792EEFBFCC61C6A5E81FBDE3B8B68397A887D57DEFF6B87201577F2731C6332F2B002F29230233883FFED76CC85A82818DC9DCCDA252741524E5FBCB1192DDA18668C5E113699E2656F8CF273A970C4AB4370EFB4A02E8535A953E881947D0DEE861E696286079F47BC7494488AA40EDC840E9BCE52606AA3080360E69FFCBEA7C8D540D93461235132E31596F30BC78C5294185BE7F5CB087CFE2AB633B7489998ED1AE802BA95DA1E4C04830C82820B4C7DC756C20007D4EA092364747DC6A4F25D2B1DE4A4DAA4E6288DD7778DF1648E08C535330E816068D1DCA5A936C02874318E9AA9D688F3C87D7A851D65A066D5500BCEF5709E1A1AEC33E4D50F3CD50757672E9EC3C9C4B0CCC924A0C074317A063ECC1BA47B19BD93BCBED68F10FFAA5B19839F533ACD1CBB4CB93351C84783C56366EEA30CDCF4C1691C5A3B14A5B7942FCEC11C80C67CE2A65DF0C07FC4A82862C17DCC16860889E9C2DF2DF3122E2A5C9ED2919E1902FBA476E3AA59115A66B61A3886BD7C880DFE9C2AF6C255BAC64F11734DB05D20D077B06FBA053E1748533E8A021F218E7E22AA613785EEC5C6C3C5CCF545E478233C6BFCDC216390D6CE2DDD595855F29A34CB0D48F4A6AC2D415707F6797C2D7E049536E6C94A070838180D293418759F164D0130F7563087C62FEA5AC2D551ACC17FA0BEEABFBEB1A4D0E206BE4CBCC09890594006D0A5A698B16FAE344F8C81C23CD083169504A58D4C199FE09F9EF761B629E9F5C6C85128ECEBD6B6AABF91EFFBDAB451D4412C9F60967107963541D8E397E6D7A7C57A964E88FDE15A15874ACC5605A600160B0C1A29B3B43B67EFF2BF3C32A635EEF159ADC0BDDC07A45E8D47450A50F29C157A649F3BF1E8E7F05ACF94B9DD15D3017E8675396D0326DFEC1F51DC5B4AFD28729EAC32FDDFC36671B61803A7365AE5906CAAA91525FE6D5C2900D3BD513DE1947D4B7E64B339DB8A79049233A48418D59BA1BEA04E6CB1743403955AB06C07629FBA2159788812AE90049FB06F8AA36B58768376687F2C6ECD0A7878475353B437D1C473D0FB1AE37D38CE877679A0E355F7517FCFF3FC1C84AB8C7D4418B7F7DD17DDAE9717BD1CB0BBB072CAC4982DFFAC18390612C9D1CFCBE6F6F1AB43E41D26F031BCE7884933990D980BFFF391F3B51E646E6826025B432FC981152023FCCE746AE592D39BCC45231E9F26BD630401C693CAB6F312DAE92BC25E3AB586324FC9191F3D6EF8139F033611C6F171472DBB60E730E5CCB834C5EE0F98705126B724F4AA80968AB11D7E6AB12E2895D13C75AD1F0DA9B29404E66611F93E1ADD9D11F83DE0C538E66452F8F4BBC2D223014C9FD6965B4517A7DCEAB9D882859BE034D74617A088F297068F1733FEFDFDBAEE5C6FFB1C14DB32265D7DFD3929B07FBB368FE8FFC39860022722D8E1C93F184867119F41D4B5822DF9E449C4ED34981E2E02C269512144E966B77AE7387C81F9DDB6EAFCA21A64EDB6C5DBC44C608600AF6FC64D132EEBCF93D0069EFC0CC84E50E3A286ACA9615476601F7797AB7E63BDF0D7FD6DF6E8F99E4FA9B6FA3E900E1C9F6A3E039D42175499481E2AB0022304C9BE69737F1FFD235D842CA93F1246C9C4A9EF73A5ECD986CE4D1028192BC550D8C5D4BD5BE90A7FFE992DC3F194197B7ACFE79EC36163065CDE66D59497CDA1FB95AF8B74F9CF81ABBCA57C278AD06CF21193A5737C4EAB1C0BE156DEAAD90F816FB46B4E19B4660D42FEF81E45107537ED4C14E8EB9756F936F21875EC5A613F9A1FEDF3D63543E37AA9B8DE7D674712908AAE82728B929A8D5001324542246D4676008218DBE2D5812A754A88C4554986AA2CBDB17D4E4A2D006A8E99C06328DA66372A06EA2C624AE3F28D4EB9A9E5248F0226C07FF43C8E494377E55494855B1554071DC1E9043E1B4F7419CBE0CC3E5237421FBF59E5D58DBAD624C67EBB336C40A19FF88BC0B7A0FC0B4D64D384A4B87AB4BBB105141FEE68B156FC6378A484E10B26885E6FE19124C9F08E037CAEFB1898C505952565CDF30900DAB5A43633CDB53BE32A43D9EE92257480EFD73F3054A4E5CCA0764AA4DE10EA2B7BB146906CCA4D44B768B5C99B356A52F448F55DFF53345A29CB65C5290E75BB025ABA2F3EAA37D2090C9E1A545FA7B60F9AF0333D6F220AF31ABFB47895C8C882C66107DDCC5321B973FE2B70DF985A460004FB0D42D4D7F1C67C2B80B7B2B85DD7A99F1DFF10A501084C6AA9A2B9149A598662FC3C43274970123E9A69E33FD5E48AE49737844B3F4EC85F59D48552574E60AE5E3120DF5835E1D9A017B6C35E6D2206C68264ABF8383034661E9664893E5114B142815BC428DF6100EB96CA5CFAEE5FBD071FFCDCDE4167481EC5BDCD69B5B916B02DC961740B3700F938245F0796C0F2225E588DB93093538F933960FFA85FA595DFB99859F4B8CE3A5C723CA47C7D20E268CA031EFFCE388B127D47A6F40D8949D9025362114FC17F1CC665C994558F2C7F1888ADFECA69EB07252D68AE8D02E221799F202EE1FCAC966FB87EC802E612369773710530321D270390FEDE76ACF3155FD0BF6BCDD3B750FC0CD425E707AC9AE583E9CD916F135588AA1B9A128A53A4403D3E38EC79E627BBFFDF637960795E86A2570070B3A9D837E754A9317F89C173D03D1F5E07D033B3CAC2514DEE53AF0C4B712DC774E746F362CDD7B227DA453DE82484345EBF004CD9D3C4B85A5B3FE20ECB48A6747242E26B6E50AA796BAC78137ED4A7E698286C52C682BECB9FF059CC7C07F1BE9CFFC70BA59435516B5705CC4FC1808C98447875D8A1508AEBFE912A5928C145C17D9569B8B0BEDC7C958EAB288F35D65E20CB1A6E2DD1D2F64253C2234DFDDC935CDAC0E32689EC2D0C5561C4BD4A23C02B26CBFBC7974640A7AC8A5FB0247CBC205FE558088E66229374D4A8F37FDD7549872ADC0B0B882B130D086332A11C18861890F78A0545C869BBFA8B9EE260D342D6175783C8F0534DDAD732834D491571BEDEFE9E70EE8E7B8D2EDB2B3ABF46DDF0EF6B6310D0EAD7BA1435942BAD632D0A48D20521B9DDD170D07B2135F9724FE970B6565A720BFBBF701C69B9824BD3A91F434EFD49D3AC5A404D991B9338179626EC43FA52610133842C7F73DAB8B6A3376E98DB771290AA4550D8200121EFB2B6E3A183A453AE8F34EA81794F06482D3F8116A7987D2CF5CFBBB5640C07F10628CA792FA86CE740C8549A3277BE6884F0D259DC1CF4026BD349F48C2DF81C35A8614178862124F263C5CAADEB346104BC1540A1D87F8DF8C82F4F7A04AF0CD0F4A03AAF6ACB2926E3CBCBAE785A903BA53DEB69FFA722E1C797EE0032C81A228C6A7D9D0029A0CDA13DF947D21054FDCC6229611C1639186FF21E68B2DD477C1809AA190FA581789190A66A703A4C3674A01ACA4C0F48C39482289CC8F6532EF4946E740BE91710512E1B918B825CCEA550EC30E4864ED05B3DC0F6620655DFD94982E532D26E6DAA2546BA5D78A3EF3B87235248C2C68683862CAD962DFF715568C57573296942718A02194F2A7B44A1B336D2ADB97D9805A46FD04046F076A28FEA947229A4A4EA3AF442987DA346EBFCD274E65B09F1F47227E0B6F63D299B23953E655003DE784CDB96941440546740DDD6A4D97A93AA833B498F14B5639C7168F7E6A72A530481FC9E57349964E270EC8A6E624CD82A4DBF5050C919093B564CAC772490B004969D64334B14673092CFAB74D5DB4EECCF6C4EB226115C93AB70331E868AFBE7620757D8D547DFD2AA2BA0D86424B87E5B8005933E3C4EC55A8972246EE9069204E7C124E4711585FE3FB9430085370E175BA0251A412BAAA34FC93EF84727F0D5A7AD4E40EBE4F6C10971073E734347A0806719EE577664930B79E935303726C4E530DA5A08E92D6FEC0495D4E355B12C3219100B2F0023AECFC08B78642D3BEAEB95D0947B26762D27B2E2134F3F3A46FEA549787D536EE5993D9EB65AE94D794D8DFA029B523D6371125E290E66F5282CAAF11801616AB51104C4238F3DCE9B947C1989978EB040406FCAD7189B37160D421C2CCECA44CCF97ECD5302477730D7AF1DBC56A3209F85BEB7B8A01BB9AD6CB06F7FC2AE921A249E93F16C0A6FEABB51408D057AFC6B572105B2718B7D6819CDB168066C67F4B18AE84D1C121FD37BD1F81065A2F7FB5E4DBE7CD6BE2F4FE6D547AFAB7BE3D0AA6611B7EF116830EB88AA803A259E81CBBCF2EA267628E6221E11380C213E0564F32EC236AF9C6F39FCDE4D2E9FC1A59A792483EAF8F02D8041CD5555E38D4A7200F9C90480FF64ADB0D7043684C50EFF9893B76BEF7C3D5927C0553F340A1D8F55B7EC33EFD2CAE92DEB43BDB9C0DBC4887275E6F1E3D08D5738028BD32E77BDFE22BDD44FC7C2A19F9A9916D85A7F410B14F4F07E7AF0A519BE9EC41353004C494A18D5D5E4C948D06B01F9C774931C37C28886FD4F9905828A8587F37885BE06567289B5EE26FCEAA493C44E293D804157923F9E437EDF262D4F155C6541ED46E759675100C4079F6109A6661648BE95F8D1FF5590FA69FE7256281247738FD9708F65F55EE0144AB48C186630AC9789B27DA9FFFEF774677FBE4478D1859174CC9654ABFBABF9D02EA2C0D11C5B48B62384310E60122C54F6004C56BA626CEDBECE26DE197A340F4CFF4F852E0DB28B6599C716CA5A8BD0B78F50129F0CD66C0FCDE5722AC3E99EF2CD2431BD93637A48F3CDEEF2792BE48DF006AA6F54FFEFC37122FFAE6A08D682F7B3C09461AC557F083B5284AB58BC72FEBE732BD1AF00BF9B7798ED005B55EDAF8DEBF2D12F97693F7EE822555CD01D7DDFFFB83A737496B7F543B04AA3AAAC1335866675F58AB56EB3298BEEAEFA852254E53BFB6EB50F31951B5F6C18C0576898BEA601891F6CC8430E3FADDCC6029D20E5113F992130B13514DFD4FA211B046780811059A03FF6FE9F138FE132D5F8B993C866FA0E507DA828CF050DF47293264C28753F90E09A5941FE84AA69FD977FD139881C82A9973A7CCC102FC87B04B842C25CBC8726033B296A415694DDA90B6A41D694F3A108144938EA413E94CBA90AEA09B60DA0B650BC3E9BEF073C090E9DF4257406A49CC3D9722535C056B9CBB3884121E4855CA0CE80920B16414E0141ED4A87920094FB3D100108D5610EC095D60AABEC9876B3A0BE947FABCE7899C44D28DF42409D36C44DA917E44354D20ED497736FC16AC82B75232A31761CF7D41A64879CDC46E2299E132D260B9FB574132BC6780742701D36C3CCD6822EB3496DB2F2F5917A619DE736D487BD2A35395C40FBD0E9772895C84AF596069D46D0BE28AEFCB0482082D891844462801423321088D00A125D2524983D8082540682604C11120B4448427FD035980EF1B708C72D90CBC69D2A7D86509D3C89A4E14F64EF76988048822CB2A7FB36DC2A3B6FF64713BE770F2F85FC91BC76276A866D3E5A399FF0BFA7092267D5F5CEB291E751B52EFE36E2FE0D7F31E8352C63C4665DCB49F33B8B5BDDF51F8C3AC69C1A391A00E341850F5767ADCDBBE86129810296174D98770568F7E089AEF845573FD9464B204E8E77D45B21F9A8417C3FF12C09F980A6EC4E911666E7A2E15EA6D82B063AB9DDB6238F812BA22793019E588839844208CA84926F45FA28E7FC37AF79798891009A175161A1FA135115E7722605FA8970ED1843B5207B885CF67432D7E4EBA03B4EA220C1322544CF87F0BDEF5AB1A1B8368CB7338880C82253C11094F44C21391F044243C11094F44C21391F044243C11090F44FD7E205BC3030EE12FB2CF5A3483F8A28B4A076195F05AA20AABE664C65E1A0DF251CE06518F522D2F174FBA6C08D39883709E943F08F9BB6F4F294EC2666D48E04C32A23391F96098FF7413EBC577C945E7E0E31BDBF9B2F1CD54B6953C5A2A727326214D6AA7F680BE68124D5A880BAFE34D924B9150D4EA733013F7C6035715DAB91263BDAB09D71D507F8B8757948C69ADEDD28187C7A35514E14B58323700756F9EA1AE0757382E49D4A41C27819FC8541346B38037CADA11E5E2A3E36B0FFA8D9703EF8B6E76FB17F2D1C1980EE5CF0A16F4547D00956A3D34E02DCD9990C14097673AABA13D552E3F53312A240B1EFCA473DCB32B87B3983BC3B31280F062115A90B6D36C932E54A60852FA8F37EFA4464D38092895D9D75B887C9565F7EA31E37D824CDF1996878B3B71C625A19AD87A1F198766C12A119C103A103B89027A10A6CD342E2C3A121A6F4D28A2D5EE5B14EA2F382F9B8924D33E65A95907330003F4D6CF67191DCBC015E970144764CE9DB7233BDEE62630D432F22893EB25882E98898DEDD456C8330DDFA1AB65403CE0ABC516391B1D09934C156A391E7A0700FED4E4B610BAB36A20619EA9F63BFF809C764734AE60AC603EA0168CCBA709C4FC613191AD3D4056592E1677CF1E08E4ACCBC34D5C64ADE4C755A2881CD7EE999CFB61FAABEB327F902755C7AC933EA1ECC42E705F04AE40131852D585DD0735B44DCE17B79D6DC362AFECC49995AF7195AE571F5B27C82509D9958F7687DD72475F88EDA5DB1F4DA1A55577FA60697117761ACF666CDD4D1164A58980AD8E96B1C899A8702900BD625D80291346D45FFAEC07509AEA897648D027CEC7502A7121377A6BC9883D606173BBF1AFBC84D1D6CA5C14E1BCE9988436E90514405A437AE390942B9C3FC0E82FB9E06623630D1C7D72DE61538D9C9D094FD94DD58087C2AAB731D1C621933AAC138266A2D14FADC45D7D3CA348C016B355FECB81B464CDA6F76E5B8B8885941AA50FD18DE156FC9C388EE7A1C1B4019A0FBF5832A6C40C873DDBBCE067B7E14D6550EFB70E6BE4F7CF641F6ACF9F38654A1018FF1CE7B1F26CC78F8587C5E155B9BE4A43D7CFB248802CB28C487016E6F12CDD266C51A2D65A6DF9BB8DA131D4463F36AF0D74242B4EA51C23CABE4B9FEC00DAEAB97CB745645CE48A5E31B2CB30A4BF1795E2F1DE59E588B6242CADA0234B7BA0CD476E3CD9A0D3EDEBD8744EDB60EA99431B88C7CA5DF929DE0AC9E8DDFA4FCD44BD5CEAD26F176BF74FC2915F1E18B85990DC051104D628662D03C50B44D9BC4F1A88B41F3BBF3B8E0DEADCFF5CE15CFED187F4F7C2F5501C7B0A1F7A45FF87EBFA427A4DDFBED26CA2D8F902D3F2E1AA3A57FD1D4DFB1B8088EBE45408339CC207561217211F8ACE2B9D75C56FC20BB23782243377B8CBADE65725EAD2982FCCE579A7E84459E9CD05DD2709D5B24C066846A03A25D88F0FE27C0C64390DBF8AFFFE8D6052BE5C9CAF2F8A2DB2E89C25EC3A02A476D5D42377BD0265B59B1551EBA29B8A1262BBD8B3A744968D4497FB6423BFF41DDD682683EE6D35B0261F29708217E47211A5847CFB13126BD588C7CF07E81AB813FFDCDAC6FC43305DE3D6DE6A18D85A91CB2DF5BDA8975F56037D3E01A291353AC1B46B6B28296935CC5E0F2AE7DAADC59F0B0E49A99FCFEF43AF8EE3530899660BB0ADB68DB65976B8789797594F008F3B5CE477E494E59B8D1414D7DA44787B092E1DFD036A5983E8C2EFE094CFCE20CFAD042201DB2055427E5826AEEFD930C82010D665518BA28C657E3DE7B6C0EEC9C24C9C5E8726CEF707FB3FAAF5AC2B6E447AB4CD10ACE5F388C217D3D218BE17BCF988076BF7285520B9376F17DECCBA3407D29E1C9046A094A069913E766BCF1FCD3C5CC922F333AE9D74021CF7918715BF973544514BBB5C52BED644F81F735FA4C7D036381F6C622D4197C9A6A6F9C64655CE29AF3F7EBF20CA71C9D7F9EFA1E610C3A0C434561765D3A33F4E6BB2692E82C6AD7C2AABB520AACE5D0EC58B5168D0D1E8BC04C3152720AEE9C125BB61B2487D52B57E56D29311E1EB24E3D0904962E1D65F3A5DDCC2D75E529D32F59B50B6EEF8ED3E4728ECEE0624F39B87C4B26777DA828A614246200DB65314A1F6B66CF3F7AF134DA24B18D55AEB1A2B32FE94D8F58FF32D399FD31DC88989F86F61D1F94BF94C88A016301FD31A2D2BB4BD649EFD035851AB6B015122A3A70A4DA35177890C272582FE10A18EF44B2CF1ED5602807A35BE22F04978A2B140579127E8E4099845D422E175E27C8DE6ADDB596472F3B1FE4C7BC3B9243FABECF3AEC3086D28F5FCECC38AFBDA2D46640856BBB284454E9466278F5616AC45ECB3661223BEBC329790B08B5BFA9B9A18B829EAACF149683DA96D1F5C61F28E1A3EB4CF9B1695C44C58690ABA5D3B13EAA8CE01670096B0E5B09ACD118EE6800839D739D29733D8D65F34780250FD1CB9CE3E6EFF8E7B795B2A6459D17467262ED9ACFF7F4253465B9B286B0AB4BCA62A273F74A68318A9814E04263300D5DF0AD796FA07873828EA0151AFA4F897E2C86AAC7F64F5E241586B6F8719AAED83403887687831118DA34A087475379B742D73360F1484A1A91792F8EC724C3F205F80BCBABBDAAFD76081521BEA3EE10D908978F5EE02AA4314F0D380F033D6A60EFB541DA99CFF471A23D07DBB44FF953FC824E7915B95252C08A882CBFEBA6C63EA3AD72EFC713400D64F6F00289CFF67E5555D35078358F39084F90BE990E7B40830935CFDC35E2F421CABD88DA4E51BB9F58BB0360DF4888A772E33DB044B97091BF8478ED788EF4864C4F4BC3429E64E02CAFFC3F0DCDF014A6AB1717B52539E02FCBF990703159877CC591652F64B21FCC35406FEAB0A795DE0971AFB2AAAF2857FDB995115DF240B74D0D3A477BA114DAA030870AF1C3D2FC2F7EEAEA09EA02F4BCB267C45B7D2E89CEC6D3F8647A28A94D30F05B00FE12B9125C04D5EFCFFABF9C54ADA36D114F386786ED88468F00D90B4997A210D353DBB41D11B219F73811887A420E7B9A0F327A2464CA34701B79A4BB84772B9CDE7273D5A045238F3C09B24EE28D1E2E87F1AAC99CDFDF29599351856B82D110FFB3F587F5623285C2A8B93D42F17CC5D10B11FD340CAD786FE5CC9BE3239C369DD7FEE33F967BE37805BF2E7759A28C568DD38B1FA657DDD808866B7AA0576FD2FCC08250DC11655F76068B032CB78DFF07CD1359B462B8F26B42A434E2BCEF157881887CF78E4B154DCBA17963145AB4CA354A3511737FAB3B108799567328B85F30AD5D8CBAD94491531A5128EF2BCADCBB0076E348C3779DDB36EC2B8E98BD3FD1721870DCC6792D5AE953C7EEF24D84914D0D05626E2D2EAA092D97D912B54362CEF45EDD71587F3603D4FD47DE93B624B0E34624BE2D2A3C119ADF957A2DCC80887BACFD7418162810B1E5E62E0E368D9746F6F04D5E5F3E647204BCEC3722861D5A7231DDE2962A117EFDA99859CE3315D1F3E303B1905AAA084254FD22D00A30BFE53D76D9A0C17E9CA0670A6A4032A6418496DAB8FBEA21ED4D04D9E3300837348A1D1BC342E8EC63F945F283E9286118C5F335AACBC435AEE74B6866D931D0858DACC10A31444D9B07045CD58F126C4BD8D9E5D99D2FE5545D9AB08E9EF8DFC32BBBCE99FA61FF1F19AD43B87AA3B8C75E2A15A3AA65FC003E436C5CADFC5F80A80208562276A9F7EF382A38A8E85E07B6A4E279FA7F6F39F63F1F0A873F2C38D7923A9F2FE93AD48EFFE3ED04A72FC69ADF9E71FB62EB328DF893763D99D51FB98AF9EB3C44E1AD245A58B972AB39B941C0AA95A36AF4AC13E3210333542971C21A3F19B2E64F8D77FDE131509D95E1A82764320FB4939B6B48814C8287128FF335181935355A81BF9A3926F3CED97603803E631B386B42BBBA2F777E4FC10DEE29B7ECD92FAAFC3AB01903FC75174B36EBA5BF63F83877E8479F6E5BE9971C035EA62AF7E3B9DE7111EAD914A78416698B548FE82FCDDCC9FC6F0D3FB21917F992A0F6BADD6BB5C77230ED1DE3B1EB0FF111ED0D0730DB6A4C748F497AF6962C24BFE09AE77252F9C59504330D3C4B0BC2EE33E9F9E35D7EFD0F3196540566E1EEE3556B56ED7B51964552026612B2EFF76878BEDC324A49B776442ACEA7E97CD5E7F5D6D747EB102592EB681F535BDCC67104A1C05D2F3453B208E11D57A5FF733AAB67C5F3ACAF2AD2BA65C112EB852F2B426BCA8829A3EFEE4F22A02C302BA58D8E8370C68732DCC5ADDE310313F96859E8207FCC2BFC7D299FCF4070EDBF7A808EE22D780556F45E4F7C8C333F3F6A1A556AD179CEB71EF6812AE2A0F7D806E57EB0F1FAD4683EC17BAF8E1CB159E72096449FB01BE7B9FA5B9DBB9D662747B4C204BFB50C6487BCB0DE6C15EEF51F477686AE8EC4C1306649FF0ABF145C8B4BFE0C6184F9F3AE333F9DE569BF1FC81C67C99BD4B11BEEFEA17A84A32CDFCBE42A266571BEB30C837598E841E2D10B9C17E84807F945056289ADEAD087F093CC5C1404024527BEF7712CAA1F8121F45FED4257A47CC0EEB6661DF22D1D47A203158933AD068FD0B3E8E80F719D15638676A7A9C20CB77F8DA88F7D8C8631243B299634F7B17F4ABB2A8155A818D8C3A9C4D5FB3D18DF1D2FD5E5960899A6E8DCECC7EF4EE9A59AB09DD774524A290132C958439E95E3E92E371A8714F1545832B445B7B4CA0FE9C32BC26DEC8463D6DBD7AC7912BAA444417A321D076B6973370F9FE10BEA37D2067EF89AC9E4AFC59DBFEF721CCDC8DAB858400BF7AE5F68248449A4DF1597AEB9518FF2372DD3BF976B88DCE066B43861135742067AECFF660AA3AB8E528BF3FE9A5D3D139869960CC2F0107F24E087E01EDA8B04442D170D7BF397B049D5A707128A70AAC8358912459F97CA46B0E7A0437C19DFF42AB60CC9F7E83C8415ABAA22B8263D62FFFE73B6DF2EEF2D8DFB1BD4D54E180B02771F71BF2CDF2CC80DE6FEEEE3C4807C803A8672CE38E5B9697452FA71CA8CCCAFC0F49821C5C55AD6F2AF8A4660CC69C14A4EEE7507478382AD7A7756DE8FE94A9C839C4782E1ED9B052F88278E38FC4C3FF892DB1023B7F22D361F94647B43B641853E80E44BFA24747AC6CFD4EC51C562DAAE0DD89E9E92693481B65EA972052D905F42B2C3BCCFFCE062A0C9926AE2C7CD1AFFCD142EA4469D25F06C73EB3B85E4188BBDF1C5C0B2F924FA6A36462314757E5E03FD079AF0307FABEC5C43969534B5D96CCFF98FBC90074E39FD092CDCBAA0794EACE16F92AF3DE04BDB44BF88A756BD89D05E37EF71BF99258510E4B1C617F5F4CB836932A40548D5A34BDCA7430C78D6E411BD3172EF1160223A0B539BFBFE8260614ADE97A907C00ED7F49F1B3CEC3503F8544CE1AF79A474765ED8D814D4B695C06AE1B821F9AF44ECB74617C81A08FDA7FAFF2B7528DC3DD76E6A4E021D6F87DE33A72769FF8B6AE9052E5B986C8996DCC49ADBB96362B6716A2AD440DC36D2E4B8E046995D7C4E2498E52B02B65D41006B4F91D84740BE516DA2D8C5B58B7706EE1DD22B845748BE416D92D8A5B54B7686ED1DD62B8C5748BE516DB2D0EB738DDE2728BDB2D1EB778DD02DDE2739BDF4DE02E8BB693C9268B4FE4444194444538E241D4999E872A445BA313A2275EC440BC890FF1257EC49F041023092441467F8FDC3680414B6D3968B022B990013F79EA1C175526244B925192E5DBA7B6D944610EFE16FCA4AC43B5901040DE7ECCC781132BD51F4C5F161102E93CA8145A11B7D6FFD53B1C3787051BA40C340AE9FEA6D109FA9DC10337AF17B54AB2DA586CF836C5151F13589D7386D316241F86FA28E445FD2F02CC68716D5B6EF8EB14543E451F65AC86590C31E4E2CDD6BD2F3DFE79F993031877F1588DC1F86713A6F73FEECF0D40B35DF5CD6469AF75B63528F78CBA7E6D459A88C74762760C28FE27690C9A970990872B9E68B9C13035133E2BD72E22FFC96BF0694A15FDD931E18BA55E5227260B5043E15A8DA01DE139CB5B292F4D136D9277AB993185B71CB13B6F6BCFF5EA6E0448BC7FEE21497FFDF7EB7EF1F3E5DAD93B5102831FF2DCA6DCC9E68FFB1305747EE8F599005424F89C91B46E09F497BB516B509AE37E680874B3903E86E28403CE91DF7E6486F2FB2D2F204E00CFCBE43CB52812F1B9BFFD45260B7A81FD03B3815C20DE0B392C7569832BA11F309E310540253DD7491042B564472C82C55BA8E448CFB7521CCB5A35A0D04AF80344831AC8713408B59FB13B1E463A4F71D9989344F30A366321A9852D29225F6E03ECCABFECD578170BCBA946D5E95D82A0EBA52E21F22835374754223BA7618163000E44D96A7A4E985CEABB5AF3D47DBDB550E3FB04FC5E7A125BA7892ECD2A9D6D0662F91E2B9A5AC63805888FA5AEF8A799EA43E0567E937E5AD31E146EF281A14A81BF905C9DD711BB8D7A356E0B28BCB03BAEEE53D2E473EE71AF65C055AF3DFBEF81564B40F679C811CCD28CDB5980ACA9C6FB84F03E525C299C88EF4B2DEF4BA63250037E87E9F6037EDD8C70CC8AB1F51DDA3DF3C52761C3E4C3BB8ED13A737EE903B8C120AAEBC11C874E702BE3478858E3D35E93BF968BF33AECDD1E9635E7F8C20404AFDD540C4418097C31D2801B514DB1C072EF7A9BAEAF2578D9E8BD56A798A3069251E351371C193C0C87BE6B0240718096E87F0D92CE800E07E87D21045C4240016391D312AD44078556898F992246E8471E02008BD9A1EAE74D2EF3BB3EDEF2EC3E1CCB1B0D2B7B197CB8122D99EC341969D51E8F12B1E283B8F65FA496E4A1165F8A8B5DAFAF6F520A796F1C96A842381D31065A3851494A16F7A69549F73C3187A7605B40E8D2B277F305E105C0243F6E5A43FB800143CBBD4B19564B69FE698A32C6CFB8389687CDAB7D2240087C09C5ED49CE791303051F396D620A401A05C90B807A2C0F7FFBD4CD65259A8753A971D24576AF559C63F35A7BCF34C5CFFA027F482784573180161E9EB9BBBF63BC7DDFFC5D1C2FED349D6201DE852FC9F6735C227E53C42259D6E8DBE51D9BB10F34D9436211F2960B2B72BA31075D01905EBE71E6E02F35CA283EE1E0CF8F4D124B6FD128706020A925530E3DAC0327E0C23C4B70CD0F3C276BD07B88C48B1CD464502C0BBCCF705856325004313A5295D00DD3A7F1A32C57AEDEECE38F8850D9C056841BBB0A24E8AF4FAB235D9909B0053A529E57D4F8F45EDC9EA34DF0C2C2F4EBF7F8E9F869D9010C7DA536554BE88575810DCC28205555C17CD14D8B8CB4EC9E5AB02FEAA3B99C140DD5C1668251FA1F8428F97714853838E2F9D4F785C7D219E688F2B144E8A7D923BA95AE5479C31A4A45F48828E22F669188780D56A9A666F3C4D7B1FB5D062ABD2A4B0457DF41144C473E8652B49DB49A55A9673526CB21EC978C8E115629F65518E0F0A05170CA849651E125F64C061E94BC3892EA8D2190EE3CFCC1AB11B02CA933D2B1262204A38DC7D3FAB9D98AF493336347DC9E7BB148587CFCFBABA60B12C0131EDD7251E8C578C25140D507C402938A858F1EB13A9F85D169292E515AA4693CF9DBDE8E9590085BED3E106AACE9FAA5F530D1C8D130A622C25520F0F6CC980189EE2016399D380D0EBAB2CF39FAF9D101DE8A846769D345C421B3AC9BE85AB9DD97E924CE5735A9529E8857AC8F7B9B0FBD0FD3F9A50CBA907AD9F6D76E91660F55E77E3D53D5ECF48467E88AB773270CA1895FD8362EBF5073722B80F7763401666C48FE91440622099779CBC0656DB9BC330057E9DDE3C977C2500202CFDF7CEDC536D794550825EBDE099B24301EE4EA7C7DFF88B13D582D1EDBC8D97D60620BEC3FF5FE09FAC3CBCF052446CBD34E480896587A1E9130FE76F9C113FC1843FA68E27A665606B3AEEF672D7171BB6C7303941D115930EB5F9616436929943065BF38C5D0C46F88A08DCE61D91B61F2486F9AF91941F1E1EBFF243EB7E09BDD61799878D0B4FD14D3C7E22E3B163579301EE818AFDF3D90B32A251C103420550D7DBC42D02538D524A565D57751AA8DA207C0C688F74C12A3696494C8A6D09CCA2D6F5209FF4AE9C94D883221985E443700C66725527804995772A408A9D9CFED6C51E7707884AF8AC2A17FE3C871F4C47207F4C7EC8421C8B1973E35C411529FE02B7D5126B36AB783E030AB74E8DAB78B376F23A031E50C72408511D0CF165D7FF598946540645D0EBAFB23B3B9FB4AF77319C9801CB6FF3CFE9FD0404A621547207D5A19A976036B9E519518B6A34F9076B92851824E16A3A74565556103D719B3D5B7B40CD03B10051E19677670A7EAF07660ADA3CEACAE8765E83A90FEBE383F1D2AAF230DA986E78376D635F1F87571EA2A199DE3A3F5391972F31367BD281D20D9E5474A0CFFEB1EE6DBB471F97D89C014694743F0065D599567C1CD4BF18946A74B8B35A89D360C07B51223DE934F1173691AF7CCE485B93A914AE0DBE36E71ECC935DDC5F0C3C02B045A154080C688BD1C709D916A32A578BFADA5C732D5BCA06312DF1E61BF8A60D0181AB20FC08F2DA470696B4F8BFF0F10F3B1CD5B1FC9B66F5E0813D02008D79656CF60276A832945E7C3F5B638D117E0EF8544343C77E3CC7D5C66CDBDC22AE971531F71E2676174227347FDBBD1CF3FC765199F557560827D08747909D09C8C8FA66CCB4D6878B432D8028DAA3A472BEF6888897D0E8FEE3F43524367A928B26A154FDE9B117DD9AB14D8C9DA3F5F3E833DC33ADDFA0E6CFE8BE56BA622E29F000FE2184FCDC500E77A617A88F7A5B25FFEB522B87BC69F32AAA12777F4123481F4E0E367D8CBF81361FBA664A7DA9FE28A674EE0381EF459DC15D6CFE5BEB8C82FE31EBB874A5379536ABF19B495A28D1E4BADDF364A38E6C4680A8A9E93ECF5BE03F5054C09B1C69F8D5BF75F0B500B44E62F860F1FE853DD09D1CB7BA7D3CC8E872A89C87FB7E51EC2E70B6C08FBFD284536CB6B40BE7AEF02AD4AC922E06C96E537965FE73931C511636A4761264B41AE0C8A85992DC7D737F8E420F8E006003DC6FD39CFC19D1101FE660C4608F172234FF2A1CAEDC6523BC7ED34B8B6EEBC8D17AC5FD14E954B9C2F1D5B4A37D34C9A5576AA21FF4A8985F2FD874F8E33AA9AFF43DB37713DC0D72A40A64B09A7DD13E1FF395CDD7B5EDA5E13C9673772B8C7FB7D465007919FD10B6CFB5E8543F93D5D1F7F6671CEDCF7846808867E7BEB66516DB3E66E3248EE9D5190FBF7D7514752BDC8D4EAAFA41501B2B2392124435F6D98F46D6531F10E1DE826AF2384FB269472C78900C211229862FC431A7A8816E76467DBDC063F7DF55C74FB2C5938B7C7B7CC88A324E69A6D2A0B72B2B78C3B9D15B4D93AD3D5EF8D4B6C6462713DB7EBA6EE7A7C3520921CDA86D715F60943F72777BF97383FA0E330A31E41C3FFB0B4F3F451736D9737F03773E5F2F99B78E785ECC0A014CEB061BC899541CDFBBCA700D1CB66290B00C934239FB9FF73DD034906A86F8541C9B1AD41D4C3D0C442E90D7A12C8440EF631BC86E22530D3EA0BF47F20FD9F4D7F16ACE998842EE43F9EDF980D30C6BFE36C8214B9559681510E3034BBD7397D431FE439F712AA46DD6CAD64DDF8D097D74F1C57C1EB610285A249C0179A1797F0A217A589A367B1599D0897476FC57E2B7D8B2090AA3B720195BF5A97B35B09796ECDAD6213FE6689572D8DBADDDE7E8AF5774886104A8675960DE7C8C65FF354FCC7C6535598D5E6CBC2FCC308FC0AC1307EA8C61C3072888F95F8921860C71088B607EABD1CC5F5F2AEE52ED3FFB034587CAD9169D57E0113B6B0A39DF09E0891E5AFB248C5DB068597A8A21979EC579209AE7FE01A5802D44923E1896C4D6B9B443CD248C6B5F8A84A3BF49F85A3A476FCB3D83634CC5D5618B72F13C3BD61420A381A703ECD86670D71DF77F7E66A5FC5A0784ABBBDCB62409EEAEADA5513661A6B29BE84C8CAC3AFD639C18C2BBE9B36B29EA08289A6A70A53E65F1203074CF375498294B0DB158C2966694088CFDE8B92F60BEACF527F88158066B7634E7FF499CDF1A403ADD09D27E3D35154C59EB4E9F6E9B926A84132F5BD9AB614B9ECF91AE0D66908A85CB5FC51760E153162B3BE350C31864C19D65E6007D0D6E58B49F231973C6E7F4432D6DEE9162546D94AAA0A07F9AE061E0EF9843739E03AE5E5C7AA6CCC8BEB30DE1A828FADFDFD82046B934CF0C0A2BADD2954D7BE00D00D64AA0086756666CEEAE94DB6D7DD6FFD37BAD0B867C881EAA38D5F16B8DC0D273CA7E5EB95C8307F426CFA3596B07C1E07ADE50D18FAFE1B7A0C2F7521AC390AD223AFF632FD4C9C195F4CDF098B10EE9C372DAF85A60B26389E7E8F6E61DBB2AA82715B1D2A615AB967DA4DE589B22D39B213BFE52B7EA2AAB584A678C9E8FBBFC31D841E806A23A91EFE710704A83F3258AFDBBF9B177F38311084D864768B00293F2D8463B9417EADB35DD59F122341DFF6A9638180E7308133682B23B515A726317C8A8D53479C01604507191C7CD5B1E4A00A34A19DDEB1FE2EB55814BAB3BECBF8793363C819D9D27DC58932487188F1F2A29CEBE3AC30BB5E6FFE2454AEA100E9EF8BFCC944D47F607565AFBBA68BF93BB404CFC773ED69388F4854DB3B0796395084E804A07F3C8913ED8796E64783AE0F3DD82B137859C726EF7DA4245BFB17C5B6CBCD916AF67A240AF0375AA7AA0225B18707EDAE009A59A9F5FAFE194224DDC723A41114217889B10292FD2D303CF7FEA17449FD7AD8F7B1986CC8F0370CDF51A40C03CFB99D5FA460BBDD03405C93403A2EEF12BD91A4EBD2E464A848BAA4EF34BABB6A3945725145406A6E51BA829F52B5B3BC00CB798C29DEA23B6033D9DFD33D552487AD6B355ADB072B416DEEB4E596A75A0081B9BFDC6BD445229CD246FCBDF1C5088B4CB6C09A12E3AC73C1504E1F79CF3409AF54EEC0DD508603A0A9933F2BAE476506428EA33CB90EAF6AA0783122CB21E627A62DD3007DA18942EC1241D9ABAA1E5EC2A121F498C0EC835C10AA08ABE3D3658B97FB6AD80FC6E0688B58D81728F92812554D0A03875D14D3C885E357A903E2F4D8ECC0A86C4549635B2F673D1879A141DAB0DF44E76A4046EE7BD2C0574939BE84B90BCA77DADFBF66CB5679FE29F51F1627AE3A406CA876407B1D58A51CAD3C39554F91808A46E68BB18E96A1FB98A42A8494C11178CB1B5147B54DCC425F1E42D7A10C4E438562AE6A36E377C990D6B61A4832BC7AEECCDDB9D6495E50C6771288F2B438ADDE4AB096ABEDC05A779DF9AACB1804F9274D85359FF99F7B895A82A5F13FAB2369B841C90DAC2A9E5F7C2A37A164D17FD03BF912FF00B0EF163C36029FB6E068CB48307B67D13EBA66A96B23EDBBBF165BBFA359AF3861EC392304F5958219B795E2BC0A4F436BB851248E90BD2DF1B7F0A7B60D72A8EB7D8DEEF25F4856DC87956568EB75E8E837C20E40DD14FF50976D92F8F03F19EB2187FD043CE270065F88C2CAF3F1A7D36E7D12910E888B9508B50C056C0A7E20CA93B296B1BC816EFC7B9F3D39F11F6F6FC7001249A4BF1FCE0F8B57D2F37AE5E256E44F60E6629CF6E69ED3E2EAA38487753352567A13AE6F144090BBF51D68453E93C29CA920F61DCE9A53A261C7898C4232FDE7A4471961F0B4C2AB0227E9F7A307B1DA5FAB031808F68C5FC8E0AB15A009E542AFC5513DEACF39EE54372FBB64CD0EC54EE884D500249BC3E7F4BC628841DC8A5F12A9FB6165B135C83ACDFA613831C2B355C3955A18867A7B189275BEBCF6D14538279271C7EC8D67C1A3D548F6B25B5157AEECF99FF90A21B4F300DE1495E7CE468CA58D66AB6F91E3EBF4C2F8445CC8979DB24320F7AC33E21CAD1CDC2A7E5E38E4D7B0DD05718823881D7CA5F8BA9DF0701DFDB3A390A8C544C7DA5C540DBE6A6A993294F3B423C4F90177FD05BF79838E16226543DF56C411A6C16CDDA1E5A5A3EBB2CD7592EE1A3D98B4BE857929DB211E2651B11CFEF0358DE3F947A0B58B198463CCCEF137E583362CB909C7B24C25EBA8D3D566745D89B0A6F7EB7E0702866ABCC552DF108BCDA0F38DF884A3365C95AA571940941D7FEB31F1B5A363519A6291FFD1B3EA2FF61AD08925C3DBD56AA36D45C97B2A70E7A3ABBBE24A2DA23E05135E5E10A212F4137DF17BEC0E8C3689840105809251C0BF66D1AC5E9F38AC82FF140DC3276DF431BAB2B4A7C8AE8426069395A3E6320D82EFD671AFD61FE100736CFF12FE7C82F38FE77D80486E9DA969B7A547F785F3DFD8AB1ABF7BE17A2745D0EBEF3B74448950920BD448BB021B4FC3116F4D5B09B9FAAC6CFDA5F44912ECED0CD6C6281DCCEDB570775AA684DEB05E77F9EC476F45D6E56C598F94D73E250BC671B72A0745DCAA88E0A0F898573D6B0527A8A11107E3539B789E038CB60F3D073BCD9E23742B032C3FF78A88D4C475567DAE4A10179DE47B8B6264A4006490BB39FA5744E156E3F8519166F9252C09C6BF93849240FAE35F4D47DD077CDBA6D519A557BF9DF780EE1C8616715440459FAFFC7F9F9C1637B8493658EDD5DA7FD5B79E1F4510B332065E175FFC194DC360F9EF05314609E1DF2D09302C5860D372519D6FDFEF6556237E26C3C9E323F079FA02A80B73CFFAE635ABCAA0F93AECB6B3DFE8EBC76158A1CF8D1CD41F939495ACE81361B234DD93B56C157750D1ACFD7DF13B5C9DA5508E6E534257A6F5C0B1F7FD1BCECF0DC550D640E5C435389416B6E7D96A770262222FE2EC045C4406F173692E641668942C4A493C5E44F83897F15B710663663F2F538E52A382DE4C28D62F635950E85D4321506CB8CBE954DF8289C4F4C6BC793CAE2D0FA5B95FB9C722C7E5AC92AA7BA246DE1F012298BBA570EBB81083BF302D4D3D46C18373AD28043CD0AB9415C0FE66AA51C0FADF9892E70A046CEA92C9897A44EE37E122BCFC05F8AB1E3C17F3451B903AD6B3016B934E30D45463326F20A91913B4584096E8CDCA866BF065D32F6CC6C112BD0C8691C6A613BA63CF7C59CF4333F6EF3EDB42BBA07F8A3302D7D6D7DB074C2DA55795B1894BDA25F1484FB8334AACAFD5A673BEB77A3973F6C93BDC1F746E5825FB197CBF801504F39C9E4307EA1FF75CC59E55230B67FAD36FB6DCD6832EF5C1CDB9238B75F5362A723C5C9B1799C138C005B7B6F7D13F0CCDA08F02353CD50CC24ABCAA8BD071729B9E4940A1A6D7380BC66BDB13D20577DB613E690D9A9DF585C81DD5FD91CC14597364004DDE50840979130871707FC70F13E97329DF8F6DA6AC261DE85C70166119700810065C17000C010E219680FB56273BBF9ECD2DD41CB34975D648332492271B7C4DB92D50E8456BD0DD5B56A2A93C8BB1C9F4A59FE685EBF1A63881FD69E7B6FD03D9507DCA5C6BCFC10EABFB39A8D822F3845961B4C785C842667241A88A95905D973CFE0D4826E1237282F8E0DEB95D33C3F1DE26C7DFA478527258895E2DB2A7955A8EFA1F, afterDelayedMessagesRead=1368174, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=155334257, newMessageCount=155334514 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=EBCF3C6095840B86D43A3073FB9578C70A689410CD13738F50DBB3F528138F04, afterDelayedMessagesRead=1368174, prevMessageCount=155334257, newMessageCount=155334514 ) => ( seqMessageIndex=527845, beforeAcc=351CCD0F4A0EBEC726CDC391B0C723AAB944A700B7DB48C9875C60D09D2246EC, delayedAcc=2253E066F7A7CB192F918BAEFB8B775C07204F539B399F7BAEE605D2903CE1A2, acc=F4DBEC89EF72BF296E46F98AED3D167D0476E9A9118813EF3A8C881A96E0D7D8 )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, messageDataHash=55AA4ED0099D07632D8C7FE95AE0CF78721000FD2B4C76DC6693C9B40DC58FBC ) => ( 1368193 )
          • GasRefunder.onGasSpent( refundee=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, gasUsed=173414, calldataSize=99044 ) => ( success=True )
            • ETH 0.023087395458076456 Arbitrum: Batch Submitter.CALL( )
              addSequencerL2BatchFromOrigin[SequencerInbox (ln:154)]
              File 1 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.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 ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } 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_ = _getAdmin();
                  }
                  /**
                   * @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 {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @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 ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.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.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @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) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^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 internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      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
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @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 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @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 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @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
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 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");
                      (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");
                      (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");
                      (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");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal 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
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 2 of 5: TransparentUpgradeableProxy
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)
              pragma solidity ^0.8.0;
              import "../ERC1967/ERC1967Proxy.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 ERC1967Proxy {
                  /**
                   * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
                   * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
                   */
                  constructor(
                      address _logic,
                      address admin_,
                      bytes memory _data
                  ) payable ERC1967Proxy(_logic, _data) {
                      assert(_ADMIN_SLOT == bytes32(uint256(keccak256("eip1967.proxy.admin")) - 1));
                      _changeAdmin(admin_);
                  }
                  /**
                   * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
                   */
                  modifier ifAdmin() {
                      if (msg.sender == _getAdmin()) {
                          _;
                      } 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_ = _getAdmin();
                  }
                  /**
                   * @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 {
                      _changeAdmin(newAdmin);
                  }
                  /**
                   * @dev Upgrade the implementation of the proxy.
                   *
                   * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.
                   */
                  function upgradeTo(address newImplementation) external ifAdmin {
                      _upgradeToAndCall(newImplementation, bytes(""), false);
                  }
                  /**
                   * @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 ifAdmin {
                      _upgradeToAndCall(newImplementation, data, true);
                  }
                  /**
                   * @dev Returns the current admin.
                   */
                  function _admin() internal view virtual returns (address) {
                      return _getAdmin();
                  }
                  /**
                   * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.
                   */
                  function _beforeFallback() internal virtual override {
                      require(msg.sender != _getAdmin(), "TransparentUpgradeableProxy: admin cannot fallback to proxy target");
                      super._beforeFallback();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)
              pragma solidity ^0.8.0;
              import "../Proxy.sol";
              import "./ERC1967Upgrade.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.
               */
              contract ERC1967Proxy is Proxy, ERC1967Upgrade {
                  /**
                   * @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) payable {
                      assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256("eip1967.proxy.implementation")) - 1));
                      _upgradeToAndCall(_logic, _data, false);
                  }
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _implementation() internal view virtual override returns (address impl) {
                      return ERC1967Upgrade._getImplementation();
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/Proxy.sol)
              pragma solidity ^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 internal call site, it will return directly to the external caller.
                   */
                  function _delegate(address implementation) internal virtual {
                      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
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol)
              pragma solidity ^0.8.2;
              import "../beacon/IBeacon.sol";
              import "../../interfaces/draft-IERC1822.sol";
              import "../../utils/Address.sol";
              import "../../utils/StorageSlot.sol";
              /**
               * @dev This abstract contract provides getters and event emitting update functions for
               * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
               *
               * _Available since v4.1._
               *
               * @custom:oz-upgrades-unsafe-allow delegatecall
               */
              abstract contract ERC1967Upgrade {
                  // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
                  bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;
                  /**
                   * @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 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
                  /**
                   * @dev Emitted when the implementation is upgraded.
                   */
                  event Upgraded(address indexed implementation);
                  /**
                   * @dev Returns the current implementation address.
                   */
                  function _getImplementation() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 implementation slot.
                   */
                  function _setImplementation(address newImplementation) private {
                      require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
                      StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
                  }
                  /**
                   * @dev Perform implementation upgrade
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeTo(address newImplementation) internal {
                      _setImplementation(newImplementation);
                      emit Upgraded(newImplementation);
                  }
                  /**
                   * @dev Perform implementation upgrade with additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCall(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _upgradeTo(newImplementation);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(newImplementation, data);
                      }
                  }
                  /**
                   * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
                   *
                   * Emits an {Upgraded} event.
                   */
                  function _upgradeToAndCallUUPS(
                      address newImplementation,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      // Upgrades from old implementations will perform a rollback test. This test requires the new
                      // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
                      // this special case will break upgrade paths from old UUPS implementation to new ones.
                      if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
                          _setImplementation(newImplementation);
                      } else {
                          try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                              require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
                          } catch {
                              revert("ERC1967Upgrade: new implementation is not UUPS");
                          }
                          _upgradeToAndCall(newImplementation, data, forceCall);
                      }
                  }
                  /**
                   * @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 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                  /**
                   * @dev Emitted when the admin account has changed.
                   */
                  event AdminChanged(address previousAdmin, address newAdmin);
                  /**
                   * @dev Returns the current admin.
                   */
                  function _getAdmin() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_ADMIN_SLOT).value;
                  }
                  /**
                   * @dev Stores a new address in the EIP1967 admin slot.
                   */
                  function _setAdmin(address newAdmin) private {
                      require(newAdmin != address(0), "ERC1967: new admin is the zero address");
                      StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
                  }
                  /**
                   * @dev Changes the admin of the proxy.
                   *
                   * Emits an {AdminChanged} event.
                   */
                  function _changeAdmin(address newAdmin) internal {
                      emit AdminChanged(_getAdmin(), newAdmin);
                      _setAdmin(newAdmin);
                  }
                  /**
                   * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.
                   * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
                   */
                  bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;
                  /**
                   * @dev Emitted when the beacon is upgraded.
                   */
                  event BeaconUpgraded(address indexed beacon);
                  /**
                   * @dev Returns the current beacon.
                   */
                  function _getBeacon() internal view returns (address) {
                      return StorageSlot.getAddressSlot(_BEACON_SLOT).value;
                  }
                  /**
                   * @dev Stores a new beacon in the EIP1967 beacon slot.
                   */
                  function _setBeacon(address newBeacon) private {
                      require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
                      require(
                          Address.isContract(IBeacon(newBeacon).implementation()),
                          "ERC1967: beacon implementation is not a contract"
                      );
                      StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
                  }
                  /**
                   * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
                   * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
                   *
                   * Emits a {BeaconUpgraded} event.
                   */
                  function _upgradeBeaconToAndCall(
                      address newBeacon,
                      bytes memory data,
                      bool forceCall
                  ) internal {
                      _setBeacon(newBeacon);
                      emit BeaconUpgraded(newBeacon);
                      if (data.length > 0 || forceCall) {
                          Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev This is the interface that {BeaconProxy} expects of its beacon.
               */
              interface IBeacon {
                  /**
                   * @dev Must return an address that can be used as a delegate call target.
                   *
                   * {BeaconProxy} will check that this address is a contract.
                   */
                  function implementation() external view returns (address);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified
               * proxy whose upgrades are fully controlled by the current implementation.
               */
              interface IERC1822Proxiable {
                  /**
                   * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation
                   * address.
                   *
                   * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks
                   * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this
                   * function revert if invoked through a proxy.
                   */
                  function proxiableUUID() external view returns (bytes32);
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @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
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 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");
                      (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");
                      (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");
                      (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");
                      (bool success, bytes memory returndata) = target.delegatecall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal 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
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)
              pragma solidity ^0.8.0;
              /**
               * @dev Library for reading and writing primitive types to specific storage slots.
               *
               * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
               * This library helps with reading and writing to such slots without the need for inline assembly.
               *
               * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
               *
               * Example usage to set ERC1967 implementation slot:
               * ```
               * contract ERC1967 {
               *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
               *
               *     function _getImplementation() internal view returns (address) {
               *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
               *     }
               *
               *     function _setImplementation(address newImplementation) internal {
               *         require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
               *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
               *     }
               * }
               * ```
               *
               * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._
               */
              library StorageSlot {
                  struct AddressSlot {
                      address value;
                  }
                  struct BooleanSlot {
                      bool value;
                  }
                  struct Bytes32Slot {
                      bytes32 value;
                  }
                  struct Uint256Slot {
                      uint256 value;
                  }
                  /**
                   * @dev Returns an `AddressSlot` with member `value` located at `slot`.
                   */
                  function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
                   */
                  function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
                   */
                  function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
                  /**
                   * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
                   */
                  function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
                      assembly {
                          r.slot := slot
                      }
                  }
              }
              

              File 3 of 5: 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;
                  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,
                      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;
                      }
                      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
              // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
              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() {
                      _transferOwnership(_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 {
                      _transferOwnership(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");
                      _transferOwnership(newOwner);
                  }
                  /**
                   * @dev Transfers ownership of the contract to a new account (`newOwner`).
                   * Internal function without access restriction.
                   */
                  function _transferOwnership(address newOwner) internal virtual {
                      address oldOwner = _owner;
                      _owner = newOwner;
                      emit OwnershipTransferred(oldOwner, newOwner);
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
              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 4 of 5: SequencerInbox
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {
                  AlreadyInit,
                  HadZeroInit,
                  NotOrigin,
                  DataTooLarge,
                  NotRollup,
                  DelayedBackwards,
                  DelayedTooFar,
                  ForceIncludeBlockTooSoon,
                  ForceIncludeTimeTooSoon,
                  IncorrectMessagePreimage,
                  NotBatchPoster,
                  BadSequencerNumber,
                  DataNotAuthenticated,
                  AlreadyValidDASKeyset,
                  NoSuchKeyset,
                  NotForked
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./IInbox.sol";
              import "./ISequencerInbox.sol";
              import "../rollup/IRollupLogic.sol";
              import "./Messages.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              import {GasRefundEnabled, IGasRefunder} from "../libraries/IGasRefunder.sol";
              import "../libraries/DelegateCallAware.sol";
              import {MAX_DATA_SIZE} from "../libraries/Constants.sol";
              /**
               * @title Accepts batches from the sequencer and adds them to the rollup inbox.
               * @notice Contains the inbox accumulator which is the ordering of all data and transactions to be processed by the rollup.
               * As part of submitting a batch the sequencer is also expected to include items enqueued
               * in the delayed inbox (Bridge.sol). If items in the delayed inbox are not included by a
               * sequencer within a time limit they can be force included into the rollup inbox by anyone.
               */
              contract SequencerInbox is DelegateCallAware, GasRefundEnabled, ISequencerInbox {
                  uint256 public totalDelayedMessagesRead;
                  IBridge public bridge;
                  /// @inheritdoc ISequencerInbox
                  uint256 public constant HEADER_LENGTH = 40;
                  /// @inheritdoc ISequencerInbox
                  bytes1 public constant DATA_AUTHENTICATED_FLAG = 0x40;
                  IOwnable public rollup;
                  mapping(address => bool) public isBatchPoster;
                  ISequencerInbox.MaxTimeVariation public maxTimeVariation;
                  mapping(bytes32 => DasKeySetInfo) public dasKeySetInfo;
                  modifier onlyRollupOwner() {
                      if (msg.sender != rollup.owner()) revert NotOwner(msg.sender, address(rollup));
                      _;
                  }
                  uint256 internal immutable deployTimeChainId = block.chainid;
                  function _chainIdChanged() internal view returns (bool) {
                      return deployTimeChainId != block.chainid;
                  }
                  function initialize(
                      IBridge bridge_,
                      ISequencerInbox.MaxTimeVariation calldata maxTimeVariation_
                  ) external onlyDelegated {
                      if (bridge != IBridge(address(0))) revert AlreadyInit();
                      if (bridge_ == IBridge(address(0))) revert HadZeroInit();
                      bridge = bridge_;
                      rollup = bridge_.rollup();
                      maxTimeVariation = maxTimeVariation_;
                  }
                  function getTimeBounds() internal view virtual returns (TimeBounds memory) {
                      TimeBounds memory bounds;
                      if (block.timestamp > maxTimeVariation.delaySeconds) {
                          bounds.minTimestamp = uint64(block.timestamp - maxTimeVariation.delaySeconds);
                      }
                      bounds.maxTimestamp = uint64(block.timestamp + maxTimeVariation.futureSeconds);
                      if (block.number > maxTimeVariation.delayBlocks) {
                          bounds.minBlockNumber = uint64(block.number - maxTimeVariation.delayBlocks);
                      }
                      bounds.maxBlockNumber = uint64(block.number + maxTimeVariation.futureBlocks);
                      return bounds;
                  }
                  /// @inheritdoc ISequencerInbox
                  function removeDelayAfterFork() external {
                      if (!_chainIdChanged()) revert NotForked();
                      maxTimeVariation = ISequencerInbox.MaxTimeVariation({
                          delayBlocks: 1,
                          futureBlocks: 1,
                          delaySeconds: 1,
                          futureSeconds: 1
                      });
                  }
                  /// @inheritdoc ISequencerInbox
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external {
                      if (_totalDelayedMessagesRead <= totalDelayedMessagesRead) revert DelayedBackwards();
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          l1BlockAndTime[0],
                          l1BlockAndTime[1],
                          _totalDelayedMessagesRead - 1,
                          baseFeeL1,
                          messageDataHash
                      );
                      // Can only force-include after the Sequencer-only window has expired.
                      if (l1BlockAndTime[0] + maxTimeVariation.delayBlocks >= block.number)
                          revert ForceIncludeBlockTooSoon();
                      if (l1BlockAndTime[1] + maxTimeVariation.delaySeconds >= block.timestamp)
                          revert ForceIncludeTimeTooSoon();
                      // Verify that message hash represents the last message sequence of delayed message to be included
                      bytes32 prevDelayedAcc = 0;
                      if (_totalDelayedMessagesRead > 1) {
                          prevDelayedAcc = bridge.delayedInboxAccs(_totalDelayedMessagesRead - 2);
                      }
                      if (
                          bridge.delayedInboxAccs(_totalDelayedMessagesRead - 1) !=
                          Messages.accumulateInboxMessage(prevDelayedAcc, messageHash)
                      ) revert IncorrectMessagePreimage();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formEmptyDataHash(
                          _totalDelayedMessagesRead
                      );
                      uint256 __totalDelayedMessagesRead = _totalDelayedMessagesRead;
                      uint256 prevSeqMsgCount = bridge.sequencerReportedSubMessageCount();
                      uint256 newSeqMsgCount = prevSeqMsgCount +
                          _totalDelayedMessagesRead -
                          totalDelayedMessagesRead;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash,
                              __totalDelayedMessagesRead,
                              0,
                              prevSeqMsgCount,
                              newSeqMsgCount
                          );
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.NoData
                      );
                  }
                  /// @dev Deprecated in favor of the variant specifying message counts for consistency
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(dataHash, afterDelayedMessagesRead, data.length, 0, 0);
                      if (seqMessageIndex != sequenceNumber)
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber);
                      emit SequencerBatchDelivered(
                          sequenceNumber,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external refundsGas(gasRefunder) {
                      // solhint-disable-next-line avoid-tx-origin
                      if (msg.sender != tx.origin) revert NotOrigin();
                      if (!isBatchPoster[msg.sender]) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      // Reformat the stack to prevent "Stack too deep"
                      uint256 sequenceNumber_ = sequenceNumber;
                      TimeBounds memory timeBounds_ = timeBounds;
                      bytes32 dataHash_ = dataHash;
                      uint256 dataLength = data.length;
                      uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                      uint256 prevMessageCount_ = prevMessageCount;
                      uint256 newMessageCount_ = newMessageCount;
                      (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 afterAcc
                      ) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              dataLength,
                              prevMessageCount_,
                              newMessageCount_
                          );
                      if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                          revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                      emit SequencerBatchDelivered(
                          seqMessageIndex,
                          beforeAcc,
                          afterAcc,
                          delayedAcc,
                          totalDelayedMessagesRead,
                          timeBounds_,
                          BatchDataLocation.TxInput
                      );
                  }
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external override refundsGas(gasRefunder) {
                      if (!isBatchPoster[msg.sender] && msg.sender != address(rollup)) revert NotBatchPoster();
                      (bytes32 dataHash, TimeBounds memory timeBounds) = formDataHash(
                          data,
                          afterDelayedMessagesRead
                      );
                      uint256 seqMessageIndex;
                      {
                          // Reformat the stack to prevent "Stack too deep"
                          uint256 sequenceNumber_ = sequenceNumber;
                          TimeBounds memory timeBounds_ = timeBounds;
                          bytes32 dataHash_ = dataHash;
                          uint256 afterDelayedMessagesRead_ = afterDelayedMessagesRead;
                          uint256 prevMessageCount_ = prevMessageCount;
                          uint256 newMessageCount_ = newMessageCount;
                          // we set the calldata length posted to 0 here since the caller isn't the origin
                          // of the tx, so they might have not paid tx input cost for the calldata
                          bytes32 beforeAcc;
                          bytes32 delayedAcc;
                          bytes32 afterAcc;
                          (seqMessageIndex, beforeAcc, delayedAcc, afterAcc) = addSequencerL2BatchImpl(
                              dataHash_,
                              afterDelayedMessagesRead_,
                              0,
                              prevMessageCount_,
                              newMessageCount_
                          );
                          if (seqMessageIndex != sequenceNumber_ && sequenceNumber_ != ~uint256(0))
                              revert BadSequencerNumber(seqMessageIndex, sequenceNumber_);
                          emit SequencerBatchDelivered(
                              seqMessageIndex,
                              beforeAcc,
                              afterAcc,
                              delayedAcc,
                              totalDelayedMessagesRead,
                              timeBounds_,
                              BatchDataLocation.SeparateBatchEvent
                          );
                      }
                      emit SequencerBatchData(seqMessageIndex, data);
                  }
                  modifier validateBatchData(bytes calldata data) {
                      uint256 fullDataLen = HEADER_LENGTH + data.length;
                      if (fullDataLen > MAX_DATA_SIZE) revert DataTooLarge(fullDataLen, MAX_DATA_SIZE);
                      if (data.length > 0 && (data[0] & DATA_AUTHENTICATED_FLAG) == DATA_AUTHENTICATED_FLAG) {
                          revert DataNotAuthenticated();
                      }
                      // the first byte is used to identify the type of batch data
                      // das batches expect to have the type byte set, followed by the keyset (so they should have at least 33 bytes)
                      if (data.length >= 33 && data[0] & 0x80 != 0) {
                          // we skip the first byte, then read the next 32 bytes for the keyset
                          bytes32 dasKeysetHash = bytes32(data[1:33]);
                          if (!dasKeySetInfo[dasKeysetHash].isValidKeyset) revert NoSuchKeyset(dasKeysetHash);
                      }
                      _;
                  }
                  function packHeader(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes memory, TimeBounds memory)
                  {
                      TimeBounds memory timeBounds = getTimeBounds();
                      bytes memory header = abi.encodePacked(
                          timeBounds.minTimestamp,
                          timeBounds.maxTimestamp,
                          timeBounds.minBlockNumber,
                          timeBounds.maxBlockNumber,
                          uint64(afterDelayedMessagesRead)
                      );
                      // This must always be true from the packed encoding
                      assert(header.length == HEADER_LENGTH);
                      return (header, timeBounds);
                  }
                  function formDataHash(bytes calldata data, uint256 afterDelayedMessagesRead)
                      internal
                      view
                      validateBatchData(data)
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      bytes32 dataHash = keccak256(bytes.concat(header, data));
                      return (dataHash, timeBounds);
                  }
                  function formEmptyDataHash(uint256 afterDelayedMessagesRead)
                      internal
                      view
                      returns (bytes32, TimeBounds memory)
                  {
                      (bytes memory header, TimeBounds memory timeBounds) = packHeader(afterDelayedMessagesRead);
                      return (keccak256(header), timeBounds);
                  }
                  function addSequencerL2BatchImpl(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 calldataLengthPosted,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      internal
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (afterDelayedMessagesRead < totalDelayedMessagesRead) revert DelayedBackwards();
                      if (afterDelayedMessagesRead > bridge.delayedMessageCount()) revert DelayedTooFar();
                      (seqMessageIndex, beforeAcc, delayedAcc, acc) = bridge.enqueueSequencerMessage(
                          dataHash,
                          afterDelayedMessagesRead,
                          prevMessageCount,
                          newMessageCount
                      );
                      totalDelayedMessagesRead = afterDelayedMessagesRead;
                      if (calldataLengthPosted > 0) {
                          // this msg isn't included in the current sequencer batch, but instead added to
                          // the delayed messages queue that is yet to be included
                          address batchPoster = msg.sender;
                          bytes memory spendingReportMsg = abi.encodePacked(
                              block.timestamp,
                              batchPoster,
                              dataHash,
                              seqMessageIndex,
                              block.basefee
                          );
                          uint256 msgNum = bridge.submitBatchSpendingReport(
                              batchPoster,
                              keccak256(spendingReportMsg)
                          );
                          // this is the same event used by Inbox.sol after including a message to the delayed message accumulator
                          emit InboxMessageDelivered(msgNum, spendingReportMsg);
                      }
                  }
                  function inboxAccs(uint256 index) external view returns (bytes32) {
                      return bridge.sequencerInboxAccs(index);
                  }
                  function batchCount() external view returns (uint256) {
                      return bridge.sequencerMessageCount();
                  }
                  /// @inheritdoc ISequencerInbox
                  function setMaxTimeVariation(ISequencerInbox.MaxTimeVariation memory maxTimeVariation_)
                      external
                      onlyRollupOwner
                  {
                      maxTimeVariation = maxTimeVariation_;
                      emit OwnerFunctionCalled(0);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external onlyRollupOwner {
                      isBatchPoster[addr] = isBatchPoster_;
                      emit OwnerFunctionCalled(1);
                  }
                  /// @inheritdoc ISequencerInbox
                  function setValidKeyset(bytes calldata keysetBytes) external onlyRollupOwner {
                      uint256 ksWord = uint256(keccak256(bytes.concat(hex"fe", keccak256(keysetBytes))));
                      bytes32 ksHash = bytes32(ksWord ^ (1 << 255));
                      require(keysetBytes.length < 64 * 1024, "keyset is too large");
                      if (dasKeySetInfo[ksHash].isValidKeyset) revert AlreadyValidDASKeyset(ksHash);
                      dasKeySetInfo[ksHash] = DasKeySetInfo({
                          isValidKeyset: true,
                          creationBlock: uint64(block.number)
                      });
                      emit SetValidKeyset(ksHash, keysetBytes);
                      emit OwnerFunctionCalled(2);
                  }
                  /// @inheritdoc ISequencerInbox
                  function invalidateKeysetHash(bytes32 ksHash) external onlyRollupOwner {
                      if (!dasKeySetInfo[ksHash].isValidKeyset) revert NoSuchKeyset(ksHash);
                      // we don't delete the block creation value since its used to fetch the SetValidKeyset
                      // event efficiently. The event provides the hash preimage of the key.
                      // this is still needed when syncing the chain after a keyset is invalidated.
                      dasKeySetInfo[ksHash].isValidKeyset = false;
                      emit InvalidateKeyset(ksHash);
                      emit OwnerFunctionCalled(3);
                  }
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool) {
                      return dasKeySetInfo[ksHash].isValidKeyset;
                  }
                  /// @inheritdoc ISequencerInbox
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256) {
                      DasKeySetInfo memory ksInfo = dasKeySetInfo[ksHash];
                      if (ksInfo.creationBlock == 0) revert NoSuchKeyset(ksHash);
                      return uint256(ksInfo.creationBlock);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              /// @dev Thrown when a L1 chainId fork is detected
              error L1Forked();
              /// @dev Thrown when a L1 chainId fork is not detected
              error NotForked();
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              import "./IDelayedMessageProvider.sol";
              import "./ISequencerInbox.sol";
              interface IInbox is IDelayedMessageProvider {
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method is an optimization to avoid having to emit the entirety of the messageData in a log. Instead validators are expected to be able to parse the data from the transaction's input
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2MessageFromOrigin(bytes calldata messageData) external returns (uint256);
                  /**
                   * @notice Send a generic L2 message to the chain
                   * @dev This method can be used to send any type of message that doesn't require L1 validation
                   *      This method will be disabled upon L1 fork to prevent replay attacks on L2
                   * @param messageData Data of the message being sent
                   */
                  function sendL2Message(bytes calldata messageData) external returns (uint256);
                  function sendL1FundedUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendL1FundedContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  function sendUnsignedTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  function sendContractTransaction(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendL1FundedUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendUnsignedTransactionToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (uint256);
                  /**
                   * @notice Send a message to initiate L2 withdrawal
                   * @dev This method can only be called upon L1 fork and will not alias the caller
                   *      This method will revert if not called from origin
                   */
                  function sendWithdrawEthToFork(
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      uint256 nonce,
                      uint256 value,
                      address withdrawTo
                  ) external returns (uint256);
                  /**
                   * @notice Get the L1 fee for submitting a retryable
                   * @dev This fee can be paid by funds already in the L2 aliased address or by the current message value
                   * @dev This formula may change in the future, to future proof your code query this method instead of inlining!!
                   * @param dataLength The length of the retryable's calldata, in bytes
                   * @param baseFee The block basefee when the retryable is included in the chain, if 0 current block.basefee will be used
                   */
                  function calculateRetryableSubmissionFee(uint256 dataLength, uint256 baseFee)
                      external
                      view
                      returns (uint256);
                  /**
                   * @notice Deposit eth from L1 to L2 to address of the sender if sender is an EOA, and to its aliased address if the sender is a contract
                   * @dev This does not trigger the fallback function when receiving in the L2 side.
                   *      Look into retryable tickets if you are interested in this functionality.
                   * @dev This function should not be called inside contract constructors
                   */
                  function depositEth() external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev all msg.value will deposited to callValueRefundAddress on L2
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function createRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  /**
                   * @notice Put a message in the L2 inbox that can be reexecuted for some fixed amount of time if it reverts
                   * @dev Same as createRetryableTicket, but does not guarantee that submission will succeed by requiring the needed funds
                   * come from the deposit alone, rather than falling back on the user's L2 balance
                   * @dev Advanced usage only (does not rewrite aliases for excessFeeRefundAddress and callValueRefundAddress).
                   * createRetryableTicket method is the recommended standard.
                   * @dev Gas limit and maxFeePerGas should not be set to 1 as that is used to trigger the RetryableData error
                   * @param to destination L2 contract address
                   * @param l2CallValue call value for retryable L2 message
                   * @param maxSubmissionCost Max gas deducted from user's L2 balance to cover base submission fee
                   * @param excessFeeRefundAddress gasLimit x maxFeePerGas - execution cost gets credited here on L2 balance
                   * @param callValueRefundAddress l2Callvalue gets credited here on L2 if retryable txn times out or gets cancelled
                   * @param gasLimit Max gas deducted from user's L2 balance to cover L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param maxFeePerGas price bid for L2 execution. Should not be set to 1 (magic value used to trigger the RetryableData error)
                   * @param data ABI encoded data of L2 message
                   * @return unique message number of the retryable transaction
                   */
                  function unsafeCreateRetryableTicket(
                      address to,
                      uint256 l2CallValue,
                      uint256 maxSubmissionCost,
                      address excessFeeRefundAddress,
                      address callValueRefundAddress,
                      uint256 gasLimit,
                      uint256 maxFeePerGas,
                      bytes calldata data
                  ) external payable returns (uint256);
                  // ---------- onlyRollupOrOwner functions ----------
                  /// @notice pauses all inbox functionality
                  function pause() external;
                  /// @notice unpauses all inbox functionality
                  function unpause() external;
                  // ---------- initializer ----------
                  /**
                   * @dev function to be called one time during the inbox upgrade process
                   *      this is used to fix the storage slots
                   */
                  function postUpgradeInit(IBridge _bridge) external;
                  function initialize(IBridge _bridge, ISequencerInbox _sequencerInbox) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              pragma experimental ABIEncoderV2;
              import "../libraries/IGasRefunder.sol";
              import "./IDelayedMessageProvider.sol";
              import "./IBridge.sol";
              interface ISequencerInbox is IDelayedMessageProvider {
                  struct MaxTimeVariation {
                      uint256 delayBlocks;
                      uint256 futureBlocks;
                      uint256 delaySeconds;
                      uint256 futureSeconds;
                  }
                  struct TimeBounds {
                      uint64 minTimestamp;
                      uint64 maxTimestamp;
                      uint64 minBlockNumber;
                      uint64 maxBlockNumber;
                  }
                  enum BatchDataLocation {
                      TxInput,
                      SeparateBatchEvent,
                      NoData
                  }
                  event SequencerBatchDelivered(
                      uint256 indexed batchSequenceNumber,
                      bytes32 indexed beforeAcc,
                      bytes32 indexed afterAcc,
                      bytes32 delayedAcc,
                      uint256 afterDelayedMessagesRead,
                      TimeBounds timeBounds,
                      BatchDataLocation dataLocation
                  );
                  event OwnerFunctionCalled(uint256 indexed id);
                  /// @dev a separate event that emits batch data when this isn't easily accessible in the tx.input
                  event SequencerBatchData(uint256 indexed batchSequenceNumber, bytes data);
                  /// @dev a valid keyset was added
                  event SetValidKeyset(bytes32 indexed keysetHash, bytes keysetBytes);
                  /// @dev a keyset was invalidated
                  event InvalidateKeyset(bytes32 indexed keysetHash);
                  function totalDelayedMessagesRead() external view returns (uint256);
                  function bridge() external view returns (IBridge);
                  /// @dev The size of the batch header
                  // solhint-disable-next-line func-name-mixedcase
                  function HEADER_LENGTH() external view returns (uint256);
                  /// @dev If the first batch data byte after the header has this bit set,
                  ///      the sequencer inbox has authenticated the data. Currently not used.
                  // solhint-disable-next-line func-name-mixedcase
                  function DATA_AUTHENTICATED_FLAG() external view returns (bytes1);
                  function rollup() external view returns (IOwnable);
                  function isBatchPoster(address) external view returns (bool);
                  struct DasKeySetInfo {
                      bool isValidKeyset;
                      uint64 creationBlock;
                  }
                  // https://github.com/ethereum/solidity/issues/11826
                  // function maxTimeVariation() external view returns (MaxTimeVariation calldata);
                  // function dasKeySetInfo(bytes32) external view returns (DasKeySetInfo calldata);
                  /// @notice Remove force inclusion delay after a L1 chainId fork
                  function removeDelayAfterFork() external;
                  /// @notice Force messages from the delayed inbox to be included in the chain
                  ///         Callable by any address, but message can only be force-included after maxTimeVariation.delayBlocks and
                  ///         maxTimeVariation.delaySeconds has elapsed. As part of normal behaviour the sequencer will include these
                  ///         messages so it's only necessary to call this if the sequencer is down, or not including any delayed messages.
                  /// @param _totalDelayedMessagesRead The total number of messages to read up to
                  /// @param kind The kind of the last message to be included
                  /// @param l1BlockAndTime The l1 block and the l1 timestamp of the last message to be included
                  /// @param baseFeeL1 The l1 gas price of the last message to be included
                  /// @param sender The sender of the last message to be included
                  /// @param messageDataHash The messageDataHash of the last message to be included
                  function forceInclusion(
                      uint256 _totalDelayedMessagesRead,
                      uint8 kind,
                      uint64[2] calldata l1BlockAndTime,
                      uint256 baseFeeL1,
                      address sender,
                      bytes32 messageDataHash
                  ) external;
                  function inboxAccs(uint256 index) external view returns (bytes32);
                  function batchCount() external view returns (uint256);
                  function isValidKeysetHash(bytes32 ksHash) external view returns (bool);
                  /// @notice the creation block is intended to still be available after a keyset is deleted
                  function getKeysetCreationBlock(bytes32 ksHash) external view returns (uint256);
                  // ---------- BatchPoster functions ----------
                  function addSequencerL2BatchFromOrigin(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder
                  ) external;
                  function addSequencerL2Batch(
                      uint256 sequenceNumber,
                      bytes calldata data,
                      uint256 afterDelayedMessagesRead,
                      IGasRefunder gasRefunder,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  ) external;
                  // ---------- onlyRollupOrOwner functions ----------
                  /**
                   * @notice Set max delay for sequencer inbox
                   * @param maxTimeVariation_ the maximum time variation parameters
                   */
                  function setMaxTimeVariation(MaxTimeVariation memory maxTimeVariation_) external;
                  /**
                   * @notice Updates whether an address is authorized to be a batch poster at the sequencer inbox
                   * @param addr the address
                   * @param isBatchPoster_ if the specified address should be authorized as a batch poster
                   */
                  function setIsBatchPoster(address addr, bool isBatchPoster_) external;
                  /**
                   * @notice Makes Data Availability Service keyset valid
                   * @param keysetBytes bytes of the serialized keyset
                   */
                  function setValidKeyset(bytes calldata keysetBytes) external;
                  /**
                   * @notice Invalidates a Data Availability Service keyset
                   * @param ksHash hash of the keyset
                   */
                  function invalidateKeysetHash(bytes32 ksHash) external;
                  // ---------- initializer ----------
                  function initialize(IBridge bridge_, MaxTimeVariation calldata maxTimeVariation_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./RollupLib.sol";
              import "./IRollupCore.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IOwnable.sol";
              interface IRollupUserAbs is IRollupCore, IOwnable {
                  /// @dev the user logic just validated configuration and shouldn't write to state during init
                  /// this allows the admin logic to ensure consistency on parameters.
                  function initialize(address stakeToken) external view;
                  function removeWhitelistAfterFork() external;
                  function removeWhitelistAfterValidatorAfk() external;
                  function isERC20Enabled() external view returns (bool);
                  function rejectNextNode(address stakerAddress) external;
                  function confirmNextNode(bytes32 blockHash, bytes32 sendRoot) external;
                  function stakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external;
                  function stakeOnNewNode(
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function returnOldDeposit(address stakerAddress) external;
                  function reduceDeposit(uint256 target) external;
                  function removeZombie(uint256 zombieNum, uint256 maxNodes) external;
                  function removeOldZombies(uint256 startIndex) external;
                  function requiredStake(
                      uint256 blockNumber,
                      uint64 firstUnresolvedNodeNum,
                      uint64 latestCreatedNode
                  ) external view returns (uint256);
                  function currentRequiredStake() external view returns (uint256);
                  function countStakedZombies(uint64 nodeNum) external view returns (uint256);
                  function countZombiesStakedOnChildren(uint64 nodeNum) external view returns (uint256);
                  function requireUnresolvedExists() external view;
                  function requireUnresolved(uint256 nodeNum) external view;
                  function withdrawStakerFunds() external returns (uint256);
                  function createChallenge(
                      address[2] calldata stakers,
                      uint64[2] calldata nodeNums,
                      MachineStatus[2] calldata machineStatuses,
                      GlobalState[2] calldata globalStates,
                      uint64 numBlocks,
                      bytes32 secondExecutionHash,
                      uint256[2] calldata proposedTimes,
                      bytes32[2] calldata wasmModuleRoots
                  ) external;
              }
              interface IRollupUser is IRollupUserAbs {
                  function newStakeOnExistingNode(uint64 nodeNum, bytes32 nodeHash) external payable;
                  function newStakeOnNewNode(
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external payable;
                  function addToDeposit(address stakerAddress) external payable;
              }
              interface IRollupUserERC20 is IRollupUserAbs {
                  function newStakeOnExistingNode(
                      uint256 tokenAmount,
                      uint64 nodeNum,
                      bytes32 nodeHash
                  ) external;
                  function newStakeOnNewNode(
                      uint256 tokenAmount,
                      RollupLib.Assertion calldata assertion,
                      bytes32 expectedNodeHash,
                      uint256 prevNodeInboxMaxCount
                  ) external;
                  function addToDeposit(address stakerAddress, uint256 tokenAmount) external;
              }
              interface IRollupAdmin {
                  event OwnerFunctionCalled(uint256 indexed id);
                  function initialize(Config calldata config, ContractDependencies calldata connectedContracts)
                      external;
                  /**
                   * @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 setDelayedInbox(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 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 proxy
                   * @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(uint64 newConfirmPeriod) external;
                  /**
                   * @notice Set number of extra blocks after a challenge
                   * @param newExtraTimeBlocks new number of blocks
                   */
                  function setExtraChallengeTimeBlocks(uint64 newExtraTimeBlocks) 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 logic!
                   * @param newStakeToken address of token used for staking
                   */
                  function setStakeToken(address newStakeToken) 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(
                      uint64 prevNode,
                      uint256 prevNodeInboxMaxCount,
                      RollupLib.Assertion memory assertion,
                      bytes32 expectedNodeHash
                  ) external;
                  function forceConfirmNode(
                      uint64 nodeNum,
                      bytes32 blockHash,
                      bytes32 sendRoot
                  ) external;
                  function setLoserStakeEscrow(address newLoserStakerEscrow) external;
                  /**
                   * @notice Set the proving WASM module root
                   * @param newWasmModuleRoot new module root
                   */
                  function setWasmModuleRoot(bytes32 newWasmModuleRoot) external;
                  /**
                   * @notice set a new sequencer inbox contract
                   * @param _sequencerInbox new address of sequencer inbox
                   */
                  function setSequencerInbox(address _sequencerInbox) external;
                  /**
                   * @notice set the validatorWhitelistDisabled flag
                   * @param _validatorWhitelistDisabled new value of validatorWhitelistDisabled, i.e. true = disabled
                   */
                  function setValidatorWhitelistDisabled(bool _validatorWhitelistDisabled) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IGasRefunder {
                  function onGasSpent(
                      address payable spender,
                      uint256 gasUsed,
                      uint256 calldataSize
                  ) external returns (bool success);
              }
              abstract contract GasRefundEnabled {
                  /// @dev this refunds the sender for execution costs of the tx
                  /// calldata costs are only refunded if `msg.sender == tx.origin` to guarantee the value refunded relates to charging
                  /// for the `tx.input`. this avoids a possible attack where you generate large calldata from a contract and get over-refunded
                  modifier refundsGas(IGasRefunder gasRefunder) {
                      uint256 startGasLeft = gasleft();
                      _;
                      if (address(gasRefunder) != address(0)) {
                          uint256 calldataSize;
                          assembly {
                              calldataSize := calldatasize()
                          }
                          uint256 calldataWords = (calldataSize + 31) / 32;
                          // account for the CALLDATACOPY cost of the proxy contract, including the memory expansion cost
                          startGasLeft += calldataWords * 6 + (calldataWords**2) / 512;
                          // if triggered in a contract call, the spender may be overrefunded by appending dummy data to the call
                          // so we check if it is a top level call, which would mean the sender paid calldata as part of tx.input
                          // solhint-disable-next-line avoid-tx-origin
                          if (msg.sender != tx.origin) {
                              // We can't be sure if this calldata came from the top level tx,
                              // so to be safe we tell the gas refunder there was no calldata.
                              calldataSize = 0;
                          }
                          gasRefunder.onGasSpent(payable(msg.sender), startGasLeft - gasleft(), calldataSize);
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              // 90% of Geth's 128KB tx size limit, leaving ~13KB for proving
              uint256 constant MAX_DATA_SIZE = 117964;
              uint64 constant NO_CHAL_INDEX = 0;
              // Expected seconds per block in Ethereum PoS
              uint256 constant ETH_POS_BLOCK_TIME = 12;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              interface IDelayedMessageProvider {
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  event InboxMessageDelivered(uint256 indexed messageNum, bytes data);
                  /// @dev event emitted when a inbox message is added to the Bridge's delayed accumulator
                  /// same as InboxMessageDelivered but the batch data is available in tx.input
                  event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../challenge/IChallengeManager.sol";
              import "../challenge/ChallengeLib.sol";
              import "../state/GlobalState.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/IOutbox.sol";
              import "../bridge/IInbox.sol";
              import "./IRollupEventInbox.sol";
              import "./IRollupLogic.sol";
              struct Config {
                  uint64 confirmPeriodBlocks;
                  uint64 extraChallengeTimeBlocks;
                  address stakeToken;
                  uint256 baseStake;
                  bytes32 wasmModuleRoot;
                  address owner;
                  address loserStakeEscrow;
                  uint256 chainId;
                  uint64 genesisBlockNum;
                  ISequencerInbox.MaxTimeVariation sequencerInboxMaxTimeVariation;
              }
              struct ContractDependencies {
                  IBridge bridge;
                  ISequencerInbox sequencerInbox;
                  IInbox inbox;
                  IOutbox outbox;
                  IRollupEventInbox rollupEventInbox;
                  IChallengeManager challengeManager;
                  IRollupAdmin rollupAdminLogic;
                  IRollupUser rollupUserLogic;
                  // misc contracts that are useful when interacting with the rollup
                  address validatorUtils;
                  address validatorWalletCreator;
              }
              library RollupLib {
                  using GlobalStateLib for GlobalState;
                  struct ExecutionState {
                      GlobalState globalState;
                      MachineStatus machineStatus;
                  }
                  function stateHash(ExecutionState calldata execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  /// @dev same as stateHash but expects execState in memory instead of calldata
                  function stateHashMem(ExecutionState memory execState, uint256 inboxMaxCount)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return
                          keccak256(
                              abi.encodePacked(
                                  execState.globalState.hash(),
                                  inboxMaxCount,
                                  execState.machineStatus
                              )
                          );
                  }
                  struct Assertion {
                      ExecutionState beforeState;
                      ExecutionState afterState;
                      uint64 numBlocks;
                  }
                  function executionHash(Assertion memory assertion) internal pure returns (bytes32) {
                      MachineStatus[2] memory statuses;
                      statuses[0] = assertion.beforeState.machineStatus;
                      statuses[1] = assertion.afterState.machineStatus;
                      GlobalState[2] memory globalStates;
                      globalStates[0] = assertion.beforeState.globalState;
                      globalStates[1] = assertion.afterState.globalState;
                      // TODO: benchmark how much this abstraction adds of gas overhead
                      return executionHash(statuses, globalStates, assertion.numBlocks);
                  }
                  function executionHash(
                      MachineStatus[2] memory statuses,
                      GlobalState[2] memory globalStates,
                      uint64 numBlocks
                  ) internal pure returns (bytes32) {
                      bytes32[] memory segments = new bytes32[](2);
                      segments[0] = ChallengeLib.blockStateHash(statuses[0], globalStates[0].hash());
                      segments[1] = ChallengeLib.blockStateHash(statuses[1], globalStates[1].hash());
                      return ChallengeLib.hashChallengeState(0, numBlocks, segments);
                  }
                  function challengeRootHash(
                      bytes32 execution,
                      uint256 proposedTime,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(execution, proposedTime, wasmModuleRoot));
                  }
                  function confirmHash(Assertion memory assertion) internal pure returns (bytes32) {
                      return
                          confirmHash(
                              assertion.afterState.globalState.getBlockHash(),
                              assertion.afterState.globalState.getSendRoot()
                          );
                  }
                  function confirmHash(bytes32 blockHash, bytes32 sendRoot) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(blockHash, sendRoot));
                  }
                  function nodeHash(
                      bool hasSibling,
                      bytes32 lastHash,
                      bytes32 assertionExecHash,
                      bytes32 inboxAcc,
                      bytes32 wasmModuleRoot
                  ) internal pure returns (bytes32) {
                      uint8 hasSiblingInt = hasSibling ? 1 : 0;
                      return
                          keccak256(
                              abi.encodePacked(
                                  hasSiblingInt,
                                  lastHash,
                                  assertionExecHash,
                                  inboxAcc,
                                  wasmModuleRoot
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Node.sol";
              import "./RollupLib.sol";
              interface IRollupCore {
                  struct Staker {
                      uint256 amountStaked;
                      uint64 index;
                      uint64 latestStakedNode;
                      // currentChallenge is 0 if staker is not in a challenge
                      uint64 currentChallenge;
                      bool isStaked;
                  }
                  event RollupInitialized(bytes32 machineHash, uint256 chainId);
                  event NodeCreated(
                      uint64 indexed nodeNum,
                      bytes32 indexed parentNodeHash,
                      bytes32 indexed nodeHash,
                      bytes32 executionHash,
                      RollupLib.Assertion assertion,
                      bytes32 afterInboxBatchAcc,
                      bytes32 wasmModuleRoot,
                      uint256 inboxMaxCount
                  );
                  event NodeConfirmed(uint64 indexed nodeNum, bytes32 blockHash, bytes32 sendRoot);
                  event NodeRejected(uint64 indexed nodeNum);
                  event RollupChallengeStarted(
                      uint64 indexed challengeIndex,
                      address asserter,
                      address challenger,
                      uint64 challengedNode
                  );
                  event UserStakeUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance);
                  event UserWithdrawableFundsUpdated(
                      address indexed user,
                      uint256 initialBalance,
                      uint256 finalBalance
                  );
                  function confirmPeriodBlocks() external view returns (uint64);
                  function extraChallengeTimeBlocks() external view returns (uint64);
                  function chainId() external view returns (uint256);
                  function baseStake() external view returns (uint256);
                  function wasmModuleRoot() external view returns (bytes32);
                  function bridge() external view returns (IBridge);
                  function sequencerInbox() external view returns (ISequencerInbox);
                  function outbox() external view returns (IOutbox);
                  function rollupEventInbox() external view returns (IRollupEventInbox);
                  function challengeManager() external view returns (IChallengeManager);
                  function loserStakeEscrow() external view returns (address);
                  function stakeToken() external view returns (address);
                  function minimumAssertionPeriod() external view returns (uint256);
                  function isValidator(address) external view returns (bool);
                  function validatorWhitelistDisabled() external view returns (bool);
                  /**
                   * @notice Get the Node for the given index.
                   */
                  function getNode(uint64 nodeNum) external view returns (Node memory);
                  /**
                   * @notice Check if the specified node has been staked on by the provided staker.
                   * Only accurate at the latest confirmed node and afterwards.
                   */
                  function nodeHasStaker(uint64 nodeNum, address staker) external view returns (bool);
                  /**
                   * @notice Get the address of the staker at the given index
                   * @param stakerNum Index of the staker
                   * @return Address of the staker
                   */
                  function getStakerAddress(uint64 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 (uint64);
                  /**
                   * @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 (uint64);
                  /**
                   * @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 Retrieves stored information about a requested staker
                   * @param staker Staker address to retrieve
                   * @return A structure with information about the requested staker
                   */
                  function getStaker(address staker) external view returns (Staker memory);
                  /**
                   * @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 (uint64);
                  /// @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 (uint64);
                  /// @return Index of the latest confirmed node
                  function latestConfirmed() external view returns (uint64);
                  /// @return Index of the latest rollup node created
                  function latestNodeCreated() external view returns (uint64);
                  /// @return Ethereum block that the most recent stake was created
                  function lastStakeBlock() external view returns (uint64);
                  /// @return Number of active stakers currently staked
                  function stakerCount() external view returns (uint64);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IBridge.sol";
              interface IOutbox {
                  event SendRootUpdated(bytes32 indexed outputRoot, bytes32 indexed l2BlockHash);
                  event OutBoxTransactionExecuted(
                      address indexed to,
                      address indexed l2Sender,
                      uint256 indexed zero,
                      uint256 transactionIndex
                  );
                  function rollup() external view returns (address); // the rollup contract
                  function bridge() external view returns (IBridge); // the bridge contract
                  function spent(uint256) external view returns (bytes32); // packed spent bitmap
                  function roots(bytes32) external view returns (bytes32); // maps root hashes => L2 block hash
                  // solhint-disable-next-line func-name-mixedcase
                  function OUTBOX_VERSION() external view returns (uint128); // the outbox version
                  function updateSendRoot(bytes32 sendRoot, bytes32 l2BlockHash) external;
                  /// @notice When l2ToL1Sender returns a nonzero address, the message was originated by an L2 account
                  ///         When the return value is zero, that means this is a system message
                  /// @dev the l2ToL1Sender behaves as the tx.origin, the msg.sender should be validated to protect against reentrancies
                  function l2ToL1Sender() external view returns (address);
                  /// @return l2Block return L2 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Block() external view returns (uint256);
                  /// @return l1Block return L1 block when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1EthBlock() external view returns (uint256);
                  /// @return timestamp return L2 timestamp when the L2 tx was initiated or 0 if no L2 to L1 transaction is active
                  function l2ToL1Timestamp() external view returns (uint256);
                  /// @return outputId returns the unique output identifier of the L2 to L1 tx or 0 if no L2 to L1 transaction is active
                  function l2ToL1OutputId() external view returns (bytes32);
                  /**
                   * @notice Executes a messages in an Outbox entry.
                   * @dev Reverts if dispute period hasn't expired, since the outbox entry
                   *      is only created once the rollup confirms the respective assertion.
                   * @dev it is not possible to execute any L2-to-L1 transaction which contains data
                   *      to a contract address without any code (as enforced by the Bridge contract).
                   * @param proof Merkle proof of message inclusion in send root
                   * @param index Merkle path to message
                   * @param l2Sender sender if original message (i.e., caller of ArbSys.sendTxToL1)
                   * @param to destination address for L1 contract call
                   * @param l2Block l2 block number at which sendTxToL1 call was made
                   * @param l1Block l1 block number at which sendTxToL1 call was made
                   * @param l2Timestamp l2 Timestamp at which sendTxToL1 call was made
                   * @param value wei in L1 message
                   * @param data abi-encoded L1 message data
                   */
                  function executeTransaction(
                      bytes32[] calldata proof,
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   *  @dev function used to simulate the result of a particular function call from the outbox
                   *       it is useful for things such as gas estimates. This function includes all costs except for
                   *       proof validation (which can be considered offchain as a somewhat of a fixed cost - it's
                   *       not really a fixed cost, but can be treated as so with a fixed overhead for gas estimation).
                   *       We can't include the cost of proof validation since this is intended to be used to simulate txs
                   *       that are included in yet-to-be confirmed merkle roots. The simulation entrypoint could instead pretend
                   *       to confirm a pending merkle root, but that would be less practical for integrating with tooling.
                   *       It is only possible to trigger it when the msg sender is address zero, which should be impossible
                   *       unless under simulation in an eth_call or eth_estimateGas
                   */
                  function executeTransactionSimulation(
                      uint256 index,
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external;
                  /**
                   * @param index Merkle path to message
                   * @return true if the message has been spent
                   */
                  function isSpent(uint256 index) external view returns (bool);
                  function calculateItemHash(
                      address l2Sender,
                      address to,
                      uint256 l2Block,
                      uint256 l1Block,
                      uint256 l2Timestamp,
                      uint256 value,
                      bytes calldata data
                  ) external pure returns (bytes32);
                  function calculateMerkleRoot(
                      bytes32[] memory proof,
                      uint256 path,
                      bytes32 item
                  ) external pure returns (bytes32);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../bridge/IBridge.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../osp/IOneStepProofEntry.sol";
              import "./IChallengeResultReceiver.sol";
              import "./ChallengeLib.sol";
              interface IChallengeManager {
                  enum ChallengeTerminationType {
                      TIMEOUT,
                      BLOCK_PROOF,
                      EXECUTION_PROOF,
                      CLEARED
                  }
                  event InitiatedChallenge(
                      uint64 indexed challengeIndex,
                      GlobalState startState,
                      GlobalState endState
                  );
                  event Bisected(
                      uint64 indexed challengeIndex,
                      bytes32 indexed challengeRoot,
                      uint256 challengedSegmentStart,
                      uint256 challengedSegmentLength,
                      bytes32[] chainHashes
                  );
                  event ExecutionChallengeBegun(uint64 indexed challengeIndex, uint256 blockSteps);
                  event OneStepProofCompleted(uint64 indexed challengeIndex);
                  event ChallengeEnded(uint64 indexed challengeIndex, ChallengeTerminationType kind);
                  function initialize(
                      IChallengeResultReceiver resultReceiver_,
                      ISequencerInbox sequencerInbox_,
                      IBridge bridge_,
                      IOneStepProofEntry osp_
                  ) external;
                  function createChallenge(
                      bytes32 wasmModuleRoot_,
                      MachineStatus[2] calldata startAndEndMachineStatuses_,
                      GlobalState[2] calldata startAndEndGlobalStates_,
                      uint64 numBlocks,
                      address asserter_,
                      address challenger_,
                      uint256 asserterTimeLeft_,
                      uint256 challengerTimeLeft_
                  ) external returns (uint64);
                  function challengeInfo(uint64 challengeIndex_)
                      external
                      view
                      returns (ChallengeLib.Challenge memory);
                  function currentResponder(uint64 challengeIndex) external view returns (address);
                  function isTimedOut(uint64 challengeIndex) external view returns (bool);
                  function clearChallenge(uint64 challengeIndex_) external;
                  function timeout(uint64 challengeIndex_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/GlobalState.sol";
              library ChallengeLib {
                  using MachineLib for Machine;
                  using ChallengeLib for Challenge;
                  /// @dev It's assumed that that uninitialzed challenges have mode NONE
                  enum ChallengeMode {
                      NONE,
                      BLOCK,
                      EXECUTION
                  }
                  struct Participant {
                      address addr;
                      uint256 timeLeft;
                  }
                  struct Challenge {
                      Participant current;
                      Participant next;
                      uint256 lastMoveTimestamp;
                      bytes32 wasmModuleRoot;
                      bytes32 challengeStateHash;
                      uint64 maxInboxMessages;
                      ChallengeMode mode;
                  }
                  struct SegmentSelection {
                      uint256 oldSegmentsStart;
                      uint256 oldSegmentsLength;
                      bytes32[] oldSegments;
                      uint256 challengePosition;
                  }
                  function timeUsedSinceLastMove(Challenge storage challenge) internal view returns (uint256) {
                      return block.timestamp - challenge.lastMoveTimestamp;
                  }
                  function isTimedOut(Challenge storage challenge) internal view returns (bool) {
                      return challenge.timeUsedSinceLastMove() > challenge.current.timeLeft;
                  }
                  function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot)
                      internal
                      pure
                      returns (bytes32)
                  {
                      // Start the value stack with the function call ABI for the entrypoint
                      Value[] memory startingValues = new Value[](3);
                      startingValues[0] = ValueLib.newRefNull();
                      startingValues[1] = ValueLib.newI32(0);
                      startingValues[2] = ValueLib.newI32(0);
                      ValueArray memory valuesArray = ValueArray({inner: startingValues});
                      ValueStack memory values = ValueStack({proved: valuesArray, remainingHash: 0});
                      ValueStack memory internalStack;
                      StackFrameWindow memory frameStack;
                      Machine memory mach = Machine({
                          status: MachineStatus.RUNNING,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: 0,
                          functionIdx: 0,
                          functionPc: 0,
                          modulesRoot: wasmModuleRoot
                      });
                      return mach.hash();
                  }
                  function getEndMachineHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
                  function extractChallengeSegment(SegmentSelection calldata selection)
                      internal
                      pure
                      returns (uint256 segmentStart, uint256 segmentLength)
                  {
                      uint256 oldChallengeDegree = selection.oldSegments.length - 1;
                      segmentLength = selection.oldSegmentsLength / oldChallengeDegree;
                      // Intentionally done before challengeLength is potentially added to for the final segment
                      segmentStart = selection.oldSegmentsStart + segmentLength * selection.challengePosition;
                      if (selection.challengePosition == selection.oldSegments.length - 2) {
                          segmentLength += selection.oldSegmentsLength % oldChallengeDegree;
                      }
                  }
                  function hashChallengeState(
                      uint256 segmentsStart,
                      uint256 segmentsLength,
                      bytes32[] memory segments
                  ) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked(segmentsStart, segmentsLength, segments));
                  }
                  function blockStateHash(MachineStatus status, bytes32 globalStateHash)
                      internal
                      pure
                      returns (bytes32)
                  {
                      if (status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Block state:", globalStateHash));
                      } else if (status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Block state, errored:", globalStateHash));
                      } else if (status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Block state, too far:"));
                      } else {
                          revert("BAD_BLOCK_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct GlobalState {
                  bytes32[2] bytes32Vals;
                  uint64[2] u64Vals;
              }
              library GlobalStateLib {
                  uint16 internal constant BYTES32_VALS_NUM = 2;
                  uint16 internal constant U64_VALS_NUM = 2;
                  function hash(GlobalState memory state) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Global state:",
                                  state.bytes32Vals[0],
                                  state.bytes32Vals[1],
                                  state.u64Vals[0],
                                  state.u64Vals[1]
                              )
                          );
                  }
                  function getBlockHash(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[0];
                  }
                  function getSendRoot(GlobalState memory state) internal pure returns (bytes32) {
                      return state.bytes32Vals[1];
                  }
                  function getInboxPosition(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[0];
                  }
                  function getPositionInMessage(GlobalState memory state) internal pure returns (uint64) {
                      return state.u64Vals[1];
                  }
                  function isEmpty(GlobalState calldata state) internal pure returns (bool) {
                      return (state.bytes32Vals[0] == bytes32(0) &&
                          state.bytes32Vals[1] == bytes32(0) &&
                          state.u64Vals[0] == 0 &&
                          state.u64Vals[1] == 0);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../bridge/IBridge.sol";
              interface IRollupEventInbox {
                  function bridge() external view returns (IBridge);
                  function initialize(IBridge _bridge) external;
                  function rollup() external view returns (address);
                  function rollupInitialized(uint256 chainId) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ValueStack.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              enum MachineStatus {
                  RUNNING,
                  FINISHED,
                  ERRORED,
                  TOO_FAR
              }
              struct Machine {
                  MachineStatus status;
                  ValueStack valueStack;
                  ValueStack internalStack;
                  StackFrameWindow frameStack;
                  bytes32 globalStateHash;
                  uint32 moduleIdx;
                  uint32 functionIdx;
                  uint32 functionPc;
                  bytes32 modulesRoot;
              }
              library MachineLib {
                  using StackFrameLib for StackFrameWindow;
                  using ValueStackLib for ValueStack;
                  function hash(Machine memory mach) internal pure returns (bytes32) {
                      // Warning: the non-running hashes are replicated in Challenge
                      if (mach.status == MachineStatus.RUNNING) {
                          return
                              keccak256(
                                  abi.encodePacked(
                                      "Machine running:",
                                      mach.valueStack.hash(),
                                      mach.internalStack.hash(),
                                      mach.frameStack.hash(),
                                      mach.globalStateHash,
                                      mach.moduleIdx,
                                      mach.functionIdx,
                                      mach.functionPc,
                                      mach.modulesRoot
                                  )
                              );
                      } else if (mach.status == MachineStatus.FINISHED) {
                          return keccak256(abi.encodePacked("Machine finished:", mach.globalStateHash));
                      } else if (mach.status == MachineStatus.ERRORED) {
                          return keccak256(abi.encodePacked("Machine errored:"));
                      } else if (mach.status == MachineStatus.TOO_FAR) {
                          return keccak256(abi.encodePacked("Machine too far:"));
                      } else {
                          revert("BAD_MACH_STATUS");
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./IOneStepProver.sol";
              library OneStepProofEntryLib {
                  uint256 internal constant MAX_STEPS = 1 << 43;
              }
              interface IOneStepProofEntry {
                  function proveOneStep(
                      ExecutionContext calldata execCtx,
                      uint256 machineStep,
                      bytes32 beforeHash,
                      bytes calldata proof
                  ) external view returns (bytes32 afterHash);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              interface IChallengeResultReceiver {
                  function completeChallenge(
                      uint256 challengeIndex,
                      address winner,
                      address loser
                  ) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueArray.sol";
              struct ValueStack {
                  ValueArray proved;
                  bytes32 remainingHash;
              }
              library ValueStackLib {
                  using ValueLib for Value;
                  using ValueArrayLib for ValueArray;
                  function hash(ValueStack memory stack) internal pure returns (bytes32 h) {
                      h = stack.remainingHash;
                      uint256 len = stack.proved.length();
                      for (uint256 i = 0; i < len; i++) {
                          h = keccak256(abi.encodePacked("Value stack:", stack.proved.get(i).hash(), h));
                      }
                  }
                  function peek(ValueStack memory stack) internal pure returns (Value memory) {
                      uint256 len = stack.proved.length();
                      return stack.proved.get(len - 1);
                  }
                  function pop(ValueStack memory stack) internal pure returns (Value memory) {
                      return stack.proved.pop();
                  }
                  function push(ValueStack memory stack, Value memory val) internal pure {
                      return stack.proved.push(val);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Instruction {
                  uint16 opcode;
                  uint256 argumentData;
              }
              library Instructions {
                  uint16 internal constant UNREACHABLE = 0x00;
                  uint16 internal constant NOP = 0x01;
                  uint16 internal constant RETURN = 0x0F;
                  uint16 internal constant CALL = 0x10;
                  uint16 internal constant CALL_INDIRECT = 0x11;
                  uint16 internal constant LOCAL_GET = 0x20;
                  uint16 internal constant LOCAL_SET = 0x21;
                  uint16 internal constant GLOBAL_GET = 0x23;
                  uint16 internal constant GLOBAL_SET = 0x24;
                  uint16 internal constant I32_LOAD = 0x28;
                  uint16 internal constant I64_LOAD = 0x29;
                  uint16 internal constant F32_LOAD = 0x2A;
                  uint16 internal constant F64_LOAD = 0x2B;
                  uint16 internal constant I32_LOAD8_S = 0x2C;
                  uint16 internal constant I32_LOAD8_U = 0x2D;
                  uint16 internal constant I32_LOAD16_S = 0x2E;
                  uint16 internal constant I32_LOAD16_U = 0x2F;
                  uint16 internal constant I64_LOAD8_S = 0x30;
                  uint16 internal constant I64_LOAD8_U = 0x31;
                  uint16 internal constant I64_LOAD16_S = 0x32;
                  uint16 internal constant I64_LOAD16_U = 0x33;
                  uint16 internal constant I64_LOAD32_S = 0x34;
                  uint16 internal constant I64_LOAD32_U = 0x35;
                  uint16 internal constant I32_STORE = 0x36;
                  uint16 internal constant I64_STORE = 0x37;
                  uint16 internal constant F32_STORE = 0x38;
                  uint16 internal constant F64_STORE = 0x39;
                  uint16 internal constant I32_STORE8 = 0x3A;
                  uint16 internal constant I32_STORE16 = 0x3B;
                  uint16 internal constant I64_STORE8 = 0x3C;
                  uint16 internal constant I64_STORE16 = 0x3D;
                  uint16 internal constant I64_STORE32 = 0x3E;
                  uint16 internal constant MEMORY_SIZE = 0x3F;
                  uint16 internal constant MEMORY_GROW = 0x40;
                  uint16 internal constant DROP = 0x1A;
                  uint16 internal constant SELECT = 0x1B;
                  uint16 internal constant I32_CONST = 0x41;
                  uint16 internal constant I64_CONST = 0x42;
                  uint16 internal constant F32_CONST = 0x43;
                  uint16 internal constant F64_CONST = 0x44;
                  uint16 internal constant I32_EQZ = 0x45;
                  uint16 internal constant I32_RELOP_BASE = 0x46;
                  uint16 internal constant IRELOP_EQ = 0;
                  uint16 internal constant IRELOP_NE = 1;
                  uint16 internal constant IRELOP_LT_S = 2;
                  uint16 internal constant IRELOP_LT_U = 3;
                  uint16 internal constant IRELOP_GT_S = 4;
                  uint16 internal constant IRELOP_GT_U = 5;
                  uint16 internal constant IRELOP_LE_S = 6;
                  uint16 internal constant IRELOP_LE_U = 7;
                  uint16 internal constant IRELOP_GE_S = 8;
                  uint16 internal constant IRELOP_GE_U = 9;
                  uint16 internal constant IRELOP_LAST = IRELOP_GE_U;
                  uint16 internal constant I64_EQZ = 0x50;
                  uint16 internal constant I64_RELOP_BASE = 0x51;
                  uint16 internal constant I32_UNOP_BASE = 0x67;
                  uint16 internal constant IUNOP_CLZ = 0;
                  uint16 internal constant IUNOP_CTZ = 1;
                  uint16 internal constant IUNOP_POPCNT = 2;
                  uint16 internal constant IUNOP_LAST = IUNOP_POPCNT;
                  uint16 internal constant I32_ADD = 0x6A;
                  uint16 internal constant I32_SUB = 0x6B;
                  uint16 internal constant I32_MUL = 0x6C;
                  uint16 internal constant I32_DIV_S = 0x6D;
                  uint16 internal constant I32_DIV_U = 0x6E;
                  uint16 internal constant I32_REM_S = 0x6F;
                  uint16 internal constant I32_REM_U = 0x70;
                  uint16 internal constant I32_AND = 0x71;
                  uint16 internal constant I32_OR = 0x72;
                  uint16 internal constant I32_XOR = 0x73;
                  uint16 internal constant I32_SHL = 0x74;
                  uint16 internal constant I32_SHR_S = 0x75;
                  uint16 internal constant I32_SHR_U = 0x76;
                  uint16 internal constant I32_ROTL = 0x77;
                  uint16 internal constant I32_ROTR = 0x78;
                  uint16 internal constant I64_UNOP_BASE = 0x79;
                  uint16 internal constant I64_ADD = 0x7C;
                  uint16 internal constant I64_SUB = 0x7D;
                  uint16 internal constant I64_MUL = 0x7E;
                  uint16 internal constant I64_DIV_S = 0x7F;
                  uint16 internal constant I64_DIV_U = 0x80;
                  uint16 internal constant I64_REM_S = 0x81;
                  uint16 internal constant I64_REM_U = 0x82;
                  uint16 internal constant I64_AND = 0x83;
                  uint16 internal constant I64_OR = 0x84;
                  uint16 internal constant I64_XOR = 0x85;
                  uint16 internal constant I64_SHL = 0x86;
                  uint16 internal constant I64_SHR_S = 0x87;
                  uint16 internal constant I64_SHR_U = 0x88;
                  uint16 internal constant I64_ROTL = 0x89;
                  uint16 internal constant I64_ROTR = 0x8A;
                  uint16 internal constant I32_WRAP_I64 = 0xA7;
                  uint16 internal constant I64_EXTEND_I32_S = 0xAC;
                  uint16 internal constant I64_EXTEND_I32_U = 0xAD;
                  uint16 internal constant I32_REINTERPRET_F32 = 0xBC;
                  uint16 internal constant I64_REINTERPRET_F64 = 0xBD;
                  uint16 internal constant F32_REINTERPRET_I32 = 0xBE;
                  uint16 internal constant F64_REINTERPRET_I64 = 0xBF;
                  uint16 internal constant I32_EXTEND_8S = 0xC0;
                  uint16 internal constant I32_EXTEND_16S = 0xC1;
                  uint16 internal constant I64_EXTEND_8S = 0xC2;
                  uint16 internal constant I64_EXTEND_16S = 0xC3;
                  uint16 internal constant I64_EXTEND_32S = 0xC4;
                  uint16 internal constant INIT_FRAME = 0x8002;
                  uint16 internal constant ARBITRARY_JUMP = 0x8003;
                  uint16 internal constant ARBITRARY_JUMP_IF = 0x8004;
                  uint16 internal constant MOVE_FROM_STACK_TO_INTERNAL = 0x8005;
                  uint16 internal constant MOVE_FROM_INTERNAL_TO_STACK = 0x8006;
                  uint16 internal constant DUP = 0x8008;
                  uint16 internal constant CROSS_MODULE_CALL = 0x8009;
                  uint16 internal constant CALLER_MODULE_INTERNAL_CALL = 0x800A;
                  uint16 internal constant GET_GLOBAL_STATE_BYTES32 = 0x8010;
                  uint16 internal constant SET_GLOBAL_STATE_BYTES32 = 0x8011;
                  uint16 internal constant GET_GLOBAL_STATE_U64 = 0x8012;
                  uint16 internal constant SET_GLOBAL_STATE_U64 = 0x8013;
                  uint16 internal constant READ_PRE_IMAGE = 0x8020;
                  uint16 internal constant READ_INBOX_MESSAGE = 0x8021;
                  uint16 internal constant HALT_AND_SET_FINISHED = 0x8022;
                  uint256 internal constant INBOX_INDEX_SEQUENCER = 0;
                  uint256 internal constant INBOX_INDEX_DELAYED = 1;
                  function hash(Instruction memory inst) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Instruction:", inst.opcode, inst.argumentData));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct StackFrame {
                  Value returnPc;
                  bytes32 localsMerkleRoot;
                  uint32 callerModule;
                  uint32 callerModuleInternals;
              }
              struct StackFrameWindow {
                  StackFrame[] proved;
                  bytes32 remainingHash;
              }
              library StackFrameLib {
                  using ValueLib for Value;
                  function hash(StackFrame memory frame) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Stack frame:",
                                  frame.returnPc.hash(),
                                  frame.localsMerkleRoot,
                                  frame.callerModule,
                                  frame.callerModuleInternals
                              )
                          );
                  }
                  function hash(StackFrameWindow memory window) internal pure returns (bytes32 h) {
                      h = window.remainingHash;
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          h = keccak256(abi.encodePacked("Stack frame stack:", hash(window.proved[i]), h));
                      }
                  }
                  function peek(StackFrameWindow memory window) internal pure returns (StackFrame memory) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      return window.proved[0];
                  }
                  function pop(StackFrameWindow memory window) internal pure returns (StackFrame memory frame) {
                      require(window.proved.length == 1, "BAD_WINDOW_LENGTH");
                      frame = window.proved[0];
                      window.proved = new StackFrame[](0);
                  }
                  function push(StackFrameWindow memory window, StackFrame memory frame) internal pure {
                      StackFrame[] memory newProved = new StackFrame[](window.proved.length + 1);
                      for (uint256 i = 0; i < window.proved.length; i++) {
                          newProved[i] = window.proved[i];
                      }
                      newProved[window.proved.length] = frame;
                      window.proved = newProved;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              enum ValueType {
                  I32,
                  I64,
                  F32,
                  F64,
                  REF_NULL,
                  FUNC_REF,
                  INTERNAL_REF
              }
              struct Value {
                  ValueType valueType;
                  uint256 contents;
              }
              library ValueLib {
                  function hash(Value memory val) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Value:", val.valueType, val.contents));
                  }
                  function maxValueType() internal pure returns (ValueType) {
                      return ValueType.INTERNAL_REF;
                  }
                  function assumeI32(Value memory val) internal pure returns (uint32) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I32, "NOT_I32");
                      require(uintval < (1 << 32), "BAD_I32");
                      return uint32(uintval);
                  }
                  function assumeI64(Value memory val) internal pure returns (uint64) {
                      uint256 uintval = uint256(val.contents);
                      require(val.valueType == ValueType.I64, "NOT_I64");
                      require(uintval < (1 << 64), "BAD_I64");
                      return uint64(uintval);
                  }
                  function newRefNull() internal pure returns (Value memory) {
                      return Value({valueType: ValueType.REF_NULL, contents: 0});
                  }
                  function newI32(uint32 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I32, contents: uint256(x)});
                  }
                  function newI64(uint64 x) internal pure returns (Value memory) {
                      return Value({valueType: ValueType.I64, contents: uint256(x)});
                  }
                  function newBoolean(bool x) internal pure returns (Value memory) {
                      if (x) {
                          return newI32(uint32(1));
                      } else {
                          return newI32(uint32(0));
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              struct ValueArray {
                  Value[] inner;
              }
              library ValueArrayLib {
                  function get(ValueArray memory arr, uint256 index) internal pure returns (Value memory) {
                      return arr.inner[index];
                  }
                  function set(
                      ValueArray memory arr,
                      uint256 index,
                      Value memory val
                  ) internal pure {
                      arr.inner[index] = val;
                  }
                  function length(ValueArray memory arr) internal pure returns (uint256) {
                      return arr.inner.length;
                  }
                  function push(ValueArray memory arr, Value memory val) internal pure {
                      Value[] memory newInner = new Value[](arr.inner.length + 1);
                      for (uint256 i = 0; i < arr.inner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      newInner[arr.inner.length] = val;
                      arr.inner = newInner;
                  }
                  function pop(ValueArray memory arr) internal pure returns (Value memory popped) {
                      popped = arr.inner[arr.inner.length - 1];
                      Value[] memory newInner = new Value[](arr.inner.length - 1);
                      for (uint256 i = 0; i < newInner.length; i++) {
                          newInner[i] = arr.inner[i];
                      }
                      arr.inner = newInner;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "../state/Machine.sol";
              import "../state/Module.sol";
              import "../state/Instructions.sol";
              import "../bridge/ISequencerInbox.sol";
              import "../bridge/IBridge.sol";
              struct ExecutionContext {
                  uint256 maxInboxMessagesRead;
                  IBridge bridge;
              }
              abstract contract IOneStepProver {
                  function executeOneStep(
                      ExecutionContext memory execCtx,
                      Machine calldata mach,
                      Module calldata mod,
                      Instruction calldata instruction,
                      bytes calldata proof
                  ) external view virtual returns (Machine memory result, Module memory resultMod);
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./ModuleMemory.sol";
              struct Module {
                  bytes32 globalsMerkleRoot;
                  ModuleMemory moduleMemory;
                  bytes32 tablesMerkleRoot;
                  bytes32 functionsMerkleRoot;
                  uint32 internalsOffset;
              }
              library ModuleLib {
                  using ModuleMemoryLib for ModuleMemory;
                  function hash(Module memory mod) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  "Module:",
                                  mod.globalsMerkleRoot,
                                  mod.moduleMemory.hash(),
                                  mod.tablesMerkleRoot,
                                  mod.functionsMerkleRoot,
                                  mod.internalsOffset
                              )
                          );
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./MerkleProof.sol";
              import "./Deserialize.sol";
              struct ModuleMemory {
                  uint64 size;
                  uint64 maxSize;
                  bytes32 merkleRoot;
              }
              library ModuleMemoryLib {
                  using MerkleProofLib for MerkleProof;
                  function hash(ModuleMemory memory mem) internal pure returns (bytes32) {
                      return keccak256(abi.encodePacked("Memory:", mem.size, mem.maxSize, mem.merkleRoot));
                  }
                  function proveLeaf(
                      ModuleMemory memory mem,
                      uint256 leafIdx,
                      bytes calldata proof,
                      uint256 startOffset
                  )
                      internal
                      pure
                      returns (
                          bytes32 contents,
                          uint256 offset,
                          MerkleProof memory merkle
                      )
                  {
                      offset = startOffset;
                      (contents, offset) = Deserialize.b32(proof, offset);
                      (merkle, offset) = Deserialize.merkleProof(proof, offset);
                      bytes32 recomputedRoot = merkle.computeRootFromMemory(leafIdx, contents);
                      require(recomputedRoot == mem.merkleRoot, "WRONG_MEM_ROOT");
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./Instructions.sol";
              import "./Module.sol";
              struct MerkleProof {
                  bytes32[] counterparts;
              }
              library MerkleProofLib {
                  using ModuleLib for Module;
                  using ValueLib for Value;
                  function computeRootFromValue(
                      MerkleProof memory proof,
                      uint256 index,
                      Value memory leaf
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, leaf.hash(), "Value merkle tree:");
                  }
                  function computeRootFromInstruction(
                      MerkleProof memory proof,
                      uint256 index,
                      Instruction memory inst
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, Instructions.hash(inst), "Instruction merkle tree:");
                  }
                  function computeRootFromFunction(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 codeRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Function:", codeRoot));
                      return computeRootUnsafe(proof, index, h, "Function merkle tree:");
                  }
                  function computeRootFromMemory(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 contents
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Memory leaf:", contents));
                      return computeRootUnsafe(proof, index, h, "Memory merkle tree:");
                  }
                  function computeRootFromElement(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 funcTypeHash,
                      Value memory val
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table element:", funcTypeHash, val.hash()));
                      return computeRootUnsafe(proof, index, h, "Table element merkle tree:");
                  }
                  function computeRootFromTable(
                      MerkleProof memory proof,
                      uint256 index,
                      uint8 tableType,
                      uint64 tableSize,
                      bytes32 elementsRoot
                  ) internal pure returns (bytes32) {
                      bytes32 h = keccak256(abi.encodePacked("Table:", tableType, tableSize, elementsRoot));
                      return computeRootUnsafe(proof, index, h, "Table merkle tree:");
                  }
                  function computeRootFromModule(
                      MerkleProof memory proof,
                      uint256 index,
                      Module memory mod
                  ) internal pure returns (bytes32) {
                      return computeRootUnsafe(proof, index, mod.hash(), "Module merkle tree:");
                  }
                  // WARNING: leafHash must be computed in such a way that it cannot be a non-leaf hash.
                  function computeRootUnsafe(
                      MerkleProof memory proof,
                      uint256 index,
                      bytes32 leafHash,
                      string memory prefix
                  ) internal pure returns (bytes32 h) {
                      h = leafHash;
                      for (uint256 layer = 0; layer < proof.counterparts.length; layer++) {
                          if (index & 1 == 0) {
                              h = keccak256(abi.encodePacked(prefix, h, proof.counterparts[layer]));
                          } else {
                              h = keccak256(abi.encodePacked(prefix, proof.counterparts[layer], h));
                          }
                          index >>= 1;
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import "./Value.sol";
              import "./ValueStack.sol";
              import "./Machine.sol";
              import "./Instructions.sol";
              import "./StackFrame.sol";
              import "./MerkleProof.sol";
              import "./ModuleMemory.sol";
              import "./Module.sol";
              import "./GlobalState.sol";
              library Deserialize {
                  function u8(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint8 ret, uint256 offset)
                  {
                      offset = startOffset;
                      ret = uint8(proof[offset]);
                      offset++;
                  }
                  function u16(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint16 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 16 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 32 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u64(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint64 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 64 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function u256(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (uint256 ret, uint256 offset)
                  {
                      offset = startOffset;
                      for (uint256 i = 0; i < 256 / 8; i++) {
                          ret <<= 8;
                          ret |= uint8(proof[offset]);
                          offset++;
                      }
                  }
                  function b32(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (bytes32 ret, uint256 offset)
                  {
                      offset = startOffset;
                      uint256 retInt;
                      (retInt, offset) = u256(proof, offset);
                      ret = bytes32(retInt);
                  }
                  function value(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Value memory val, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 typeInt = uint8(proof[offset]);
                      offset++;
                      require(typeInt <= uint8(ValueLib.maxValueType()), "BAD_VALUE_TYPE");
                      uint256 contents;
                      (contents, offset) = u256(proof, offset);
                      val = Value({valueType: ValueType(typeInt), contents: contents});
                  }
                  function valueStack(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ValueStack memory stack, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      uint256 provedLength;
                      (provedLength, offset) = u256(proof, offset);
                      Value[] memory proved = new Value[](provedLength);
                      for (uint256 i = 0; i < proved.length; i++) {
                          (proved[i], offset) = value(proof, offset);
                      }
                      stack = ValueStack({proved: ValueArray(proved), remainingHash: remainingHash});
                  }
                  function instruction(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Instruction memory inst, uint256 offset)
                  {
                      offset = startOffset;
                      uint16 opcode;
                      uint256 data;
                      (opcode, offset) = u16(proof, offset);
                      (data, offset) = u256(proof, offset);
                      inst = Instruction({opcode: opcode, argumentData: data});
                  }
                  function stackFrame(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrame memory window, uint256 offset)
                  {
                      offset = startOffset;
                      Value memory returnPc;
                      bytes32 localsMerkleRoot;
                      uint32 callerModule;
                      uint32 callerModuleInternals;
                      (returnPc, offset) = value(proof, offset);
                      (localsMerkleRoot, offset) = b32(proof, offset);
                      (callerModule, offset) = u32(proof, offset);
                      (callerModuleInternals, offset) = u32(proof, offset);
                      window = StackFrame({
                          returnPc: returnPc,
                          localsMerkleRoot: localsMerkleRoot,
                          callerModule: callerModule,
                          callerModuleInternals: callerModuleInternals
                      });
                  }
                  function stackFrameWindow(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (StackFrameWindow memory window, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 remainingHash;
                      (remainingHash, offset) = b32(proof, offset);
                      StackFrame[] memory proved;
                      if (proof[offset] != 0) {
                          offset++;
                          proved = new StackFrame[](1);
                          (proved[0], offset) = stackFrame(proof, offset);
                      } else {
                          offset++;
                          proved = new StackFrame[](0);
                      }
                      window = StackFrameWindow({proved: proved, remainingHash: remainingHash});
                  }
                  function moduleMemory(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (ModuleMemory memory mem, uint256 offset)
                  {
                      offset = startOffset;
                      uint64 size;
                      uint64 maxSize;
                      bytes32 root;
                      (size, offset) = u64(proof, offset);
                      (maxSize, offset) = u64(proof, offset);
                      (root, offset) = b32(proof, offset);
                      mem = ModuleMemory({size: size, maxSize: maxSize, merkleRoot: root});
                  }
                  function module(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Module memory mod, uint256 offset)
                  {
                      offset = startOffset;
                      bytes32 globalsMerkleRoot;
                      ModuleMemory memory mem;
                      bytes32 tablesMerkleRoot;
                      bytes32 functionsMerkleRoot;
                      uint32 internalsOffset;
                      (globalsMerkleRoot, offset) = b32(proof, offset);
                      (mem, offset) = moduleMemory(proof, offset);
                      (tablesMerkleRoot, offset) = b32(proof, offset);
                      (functionsMerkleRoot, offset) = b32(proof, offset);
                      (internalsOffset, offset) = u32(proof, offset);
                      mod = Module({
                          globalsMerkleRoot: globalsMerkleRoot,
                          moduleMemory: mem,
                          tablesMerkleRoot: tablesMerkleRoot,
                          functionsMerkleRoot: functionsMerkleRoot,
                          internalsOffset: internalsOffset
                      });
                  }
                  function globalState(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (GlobalState memory state, uint256 offset)
                  {
                      offset = startOffset;
                      // using constant ints for array size requires newer solidity
                      bytes32[2] memory bytes32Vals;
                      uint64[2] memory u64Vals;
                      for (uint8 i = 0; i < GlobalStateLib.BYTES32_VALS_NUM; i++) {
                          (bytes32Vals[i], offset) = b32(proof, offset);
                      }
                      for (uint8 i = 0; i < GlobalStateLib.U64_VALS_NUM; i++) {
                          (u64Vals[i], offset) = u64(proof, offset);
                      }
                      state = GlobalState({bytes32Vals: bytes32Vals, u64Vals: u64Vals});
                  }
                  function machine(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (Machine memory mach, uint256 offset)
                  {
                      offset = startOffset;
                      MachineStatus status;
                      {
                          uint8 statusU8;
                          (statusU8, offset) = u8(proof, offset);
                          if (statusU8 == 0) {
                              status = MachineStatus.RUNNING;
                          } else if (statusU8 == 1) {
                              status = MachineStatus.FINISHED;
                          } else if (statusU8 == 2) {
                              status = MachineStatus.ERRORED;
                          } else if (statusU8 == 3) {
                              status = MachineStatus.TOO_FAR;
                          } else {
                              revert("UNKNOWN_MACH_STATUS");
                          }
                      }
                      ValueStack memory values;
                      ValueStack memory internalStack;
                      bytes32 globalStateHash;
                      uint32 moduleIdx;
                      uint32 functionIdx;
                      uint32 functionPc;
                      StackFrameWindow memory frameStack;
                      bytes32 modulesRoot;
                      (values, offset) = valueStack(proof, offset);
                      (internalStack, offset) = valueStack(proof, offset);
                      (frameStack, offset) = stackFrameWindow(proof, offset);
                      (globalStateHash, offset) = b32(proof, offset);
                      (moduleIdx, offset) = u32(proof, offset);
                      (functionIdx, offset) = u32(proof, offset);
                      (functionPc, offset) = u32(proof, offset);
                      (modulesRoot, offset) = b32(proof, offset);
                      mach = Machine({
                          status: status,
                          valueStack: values,
                          internalStack: internalStack,
                          frameStack: frameStack,
                          globalStateHash: globalStateHash,
                          moduleIdx: moduleIdx,
                          functionIdx: functionIdx,
                          functionPc: functionPc,
                          modulesRoot: modulesRoot
                      });
                  }
                  function merkleProof(bytes calldata proof, uint256 startOffset)
                      internal
                      pure
                      returns (MerkleProof memory merkle, uint256 offset)
                  {
                      offset = startOffset;
                      uint8 length;
                      (length, offset) = u8(proof, offset);
                      bytes32[] memory counterparts = new bytes32[](length);
                      for (uint8 i = 0; i < length; i++) {
                          (counterparts[i], offset) = b32(proof, offset);
                      }
                      merkle = MerkleProof(counterparts);
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              struct Node {
                  // Hash of the state of the chain as of this node
                  bytes32 stateHash;
                  // Hash of the data that can be challenged
                  bytes32 challengeHash;
                  // Hash of the data that will be committed if this node is confirmed
                  bytes32 confirmData;
                  // Index of the node previous to this one
                  uint64 prevNum;
                  // Deadline at which this node can be confirmed
                  uint64 deadlineBlock;
                  // Deadline at which a child of this node can be confirmed
                  uint64 noChildConfirmedBeforeBlock;
                  // Number of stakers staked on this node. This includes real stakers and zombies
                  uint64 stakerCount;
                  // Number of stakers staked on a child node. This includes real stakers and zombies
                  uint64 childStakerCount;
                  // This value starts at zero and is set to a value when the first child is created. After that it is constant until the node is destroyed or the owner destroys pending nodes
                  uint64 firstChildBlock;
                  // The number of the latest child of this node to be created
                  uint64 latestChildNumber;
                  // The block number when this node was created
                  uint64 createdAtBlock;
                  // A hash of all the data needed to determine this node's validity, to protect against reorgs
                  bytes32 nodeHash;
              }
              /**
               * @notice Utility functions for Node
               */
              library NodeLib {
                  /**
                   * @notice Initialize a Node
                   * @param _stateHash Initial value of stateHash
                   * @param _challengeHash Initial value of challengeHash
                   * @param _confirmData Initial value of confirmData
                   * @param _prevNum Initial value of prevNum
                   * @param _deadlineBlock Initial value of deadlineBlock
                   * @param _nodeHash Initial value of nodeHash
                   */
                  function createNode(
                      bytes32 _stateHash,
                      bytes32 _challengeHash,
                      bytes32 _confirmData,
                      uint64 _prevNum,
                      uint64 _deadlineBlock,
                      bytes32 _nodeHash
                  ) internal view returns (Node memory) {
                      Node memory node;
                      node.stateHash = _stateHash;
                      node.challengeHash = _challengeHash;
                      node.confirmData = _confirmData;
                      node.prevNum = _prevNum;
                      node.deadlineBlock = _deadlineBlock;
                      node.noChildConfirmedBeforeBlock = _deadlineBlock;
                      node.createdAtBlock = uint64(block.number);
                      node.nodeHash = _nodeHash;
                      return node;
                  }
                  /**
                   * @notice Update child properties
                   * @param number The child number to set
                   */
                  function childCreated(Node storage self, uint64 number) internal {
                      if (self.firstChildBlock == 0) {
                          self.firstChildBlock = uint64(block.number);
                      }
                      self.latestChildNumber = number;
                  }
                  /**
                   * @notice Update the child confirmed deadline
                   * @param deadline The new deadline to set
                   */
                  function newChildConfirmDeadline(Node storage self, uint64 deadline) internal {
                      self.noChildConfirmedBeforeBlock = deadline;
                  }
                  /**
                   * @notice Check whether the current block number has met or passed the node's deadline
                   */
                  function requirePastDeadline(Node memory self) internal view {
                      require(block.number >= self.deadlineBlock, "BEFORE_DEADLINE");
                  }
                  /**
                   * @notice Check whether the current block number has met or passed deadline for children of this node to be confirmed
                   */
                  function requirePastChildConfirmDeadline(Node memory self) internal view {
                      require(block.number >= self.noChildConfirmedBeforeBlock, "CHILD_TOO_RECENT");
                  }
              }
              

              File 5 of 5: Bridge
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
              import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
              import {
                  NotContract,
                  NotRollupOrOwner,
                  NotDelayedInbox,
                  NotSequencerInbox,
                  NotOutbox,
                  InvalidOutboxSet,
                  BadSequencerMessageNumber
              } from "../libraries/Error.sol";
              import "./IBridge.sol";
              import "./Messages.sol";
              import "../libraries/DelegateCallAware.sol";
              import {L1MessageType_batchPostingReport} from "../libraries/MessageTypes.sol";
              /**
               * @title Staging ground for incoming and outgoing messages
               * @notice Holds the inbox accumulator for sequenced and delayed messages.
               * It is also the ETH escrow for value sent with these messages.
               * Since the escrow is held here, this contract also contains a list of allowed
               * outboxes that can make calls from here and withdraw this escrow.
               */
              contract Bridge is Initializable, DelegateCallAware, IBridge {
                  using AddressUpgradeable for address;
                  struct InOutInfo {
                      uint256 index;
                      bool allowed;
                  }
                  mapping(address => InOutInfo) private allowedDelayedInboxesMap;
                  mapping(address => InOutInfo) private allowedOutboxesMap;
                  address[] public allowedDelayedInboxList;
                  address[] public allowedOutboxList;
                  address private _activeOutbox;
                  /// @inheritdoc IBridge
                  bytes32[] public delayedInboxAccs;
                  /// @inheritdoc IBridge
                  bytes32[] public sequencerInboxAccs;
                  IOwnable public rollup;
                  address public sequencerInbox;
                  uint256 public override sequencerReportedSubMessageCount;
                  address private constant EMPTY_ACTIVEOUTBOX = address(type(uint160).max);
                  function initialize(IOwnable rollup_) external initializer onlyDelegated {
                      _activeOutbox = EMPTY_ACTIVEOUTBOX;
                      rollup = rollup_;
                  }
                  modifier onlyRollupOrOwner() {
                      if (msg.sender != address(rollup)) {
                          address rollupOwner = rollup.owner();
                          if (msg.sender != rollupOwner) {
                              revert NotRollupOrOwner(msg.sender, address(rollup), rollupOwner);
                          }
                      }
                      _;
                  }
                  /// @dev returns the address of current active Outbox, or zero if no outbox is active
                  function activeOutbox() public view returns (address) {
                      address outbox = _activeOutbox;
                      // address zero is returned if no outbox is set, but the value used in storage
                      // is non-zero to save users some gas (as storage refunds are usually maxed out)
                      // EIP-1153 would help here.
                      // we don't return `EMPTY_ACTIVEOUTBOX` to avoid a breaking change on the current api
                      if (outbox == EMPTY_ACTIVEOUTBOX) return address(0);
                      return outbox;
                  }
                  function allowedDelayedInboxes(address inbox) external view returns (bool) {
                      return allowedDelayedInboxesMap[inbox].allowed;
                  }
                  function allowedOutboxes(address outbox) external view returns (bool) {
                      return allowedOutboxesMap[outbox].allowed;
                  }
                  modifier onlySequencerInbox() {
                      if (msg.sender != sequencerInbox) revert NotSequencerInbox(msg.sender);
                      _;
                  }
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      onlySequencerInbox
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      )
                  {
                      if (
                          sequencerReportedSubMessageCount != prevMessageCount &&
                          prevMessageCount != 0 &&
                          sequencerReportedSubMessageCount != 0
                      ) {
                          revert BadSequencerMessageNumber(sequencerReportedSubMessageCount, prevMessageCount);
                      }
                      sequencerReportedSubMessageCount = newMessageCount;
                      seqMessageIndex = sequencerInboxAccs.length;
                      if (sequencerInboxAccs.length > 0) {
                          beforeAcc = sequencerInboxAccs[sequencerInboxAccs.length - 1];
                      }
                      if (afterDelayedMessagesRead > 0) {
                          delayedAcc = delayedInboxAccs[afterDelayedMessagesRead - 1];
                      }
                      acc = keccak256(abi.encodePacked(beforeAcc, dataHash, delayedAcc));
                      sequencerInboxAccs.push(acc);
                  }
                  /// @inheritdoc IBridge
                  function submitBatchSpendingReport(address sender, bytes32 messageDataHash)
                      external
                      onlySequencerInbox
                      returns (uint256)
                  {
                      return
                          addMessageToDelayedAccumulator(
                              L1MessageType_batchPostingReport,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time,
                              block.basefee,
                              messageDataHash
                          );
                  }
                  /// @inheritdoc IBridge
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256) {
                      if (!allowedDelayedInboxesMap[msg.sender].allowed) revert NotDelayedInbox(msg.sender);
                      return
                          addMessageToDelayedAccumulator(
                              kind,
                              sender,
                              uint64(block.number),
                              uint64(block.timestamp), // solhint-disable-line not-rely-on-time
                              block.basefee,
                              messageDataHash
                          );
                  }
                  function addMessageToDelayedAccumulator(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 blockTimestamp,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal returns (uint256) {
                      uint256 count = delayedInboxAccs.length;
                      bytes32 messageHash = Messages.messageHash(
                          kind,
                          sender,
                          blockNumber,
                          blockTimestamp,
                          count,
                          baseFeeL1,
                          messageDataHash
                      );
                      bytes32 prevAcc = 0;
                      if (count > 0) {
                          prevAcc = delayedInboxAccs[count - 1];
                      }
                      delayedInboxAccs.push(Messages.accumulateInboxMessage(prevAcc, messageHash));
                      emit MessageDelivered(
                          count,
                          prevAcc,
                          msg.sender,
                          kind,
                          sender,
                          messageDataHash,
                          baseFeeL1,
                          blockTimestamp
                      );
                      return count;
                  }
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData) {
                      if (!allowedOutboxesMap[msg.sender].allowed) revert NotOutbox(msg.sender);
                      if (data.length > 0 && !to.isContract()) revert NotContract(to);
                      address prevOutbox = _activeOutbox;
                      _activeOutbox = msg.sender;
                      // We set and reset active outbox around external call so activeOutbox remains valid during call
                      // We use a low level call here since we want to bubble up whether it succeeded or failed to the caller
                      // rather than reverting on failure as well as allow contract and non-contract calls
                      // solhint-disable-next-line avoid-low-level-calls
                      (success, returnData) = to.call{value: value}(data);
                      _activeOutbox = prevOutbox;
                      emit BridgeCallTriggered(msg.sender, to, value, data);
                  }
                  function setSequencerInbox(address _sequencerInbox) external onlyRollupOrOwner {
                      sequencerInbox = _sequencerInbox;
                      emit SequencerInboxUpdated(_sequencerInbox);
                  }
                  function setDelayedInbox(address inbox, bool enabled) external onlyRollupOrOwner {
                      InOutInfo storage info = allowedDelayedInboxesMap[inbox];
                      bool alreadyEnabled = info.allowed;
                      emit InboxToggle(inbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedDelayedInboxesMap[inbox] = InOutInfo(allowedDelayedInboxList.length, true);
                          allowedDelayedInboxList.push(inbox);
                      } else {
                          allowedDelayedInboxList[info.index] = allowedDelayedInboxList[
                              allowedDelayedInboxList.length - 1
                          ];
                          allowedDelayedInboxesMap[allowedDelayedInboxList[info.index]].index = info.index;
                          allowedDelayedInboxList.pop();
                          delete allowedDelayedInboxesMap[inbox];
                      }
                  }
                  function setOutbox(address outbox, bool enabled) external onlyRollupOrOwner {
                      if (outbox == EMPTY_ACTIVEOUTBOX) revert InvalidOutboxSet(outbox);
                      InOutInfo storage info = allowedOutboxesMap[outbox];
                      bool alreadyEnabled = info.allowed;
                      emit OutboxToggle(outbox, enabled);
                      if ((alreadyEnabled && enabled) || (!alreadyEnabled && !enabled)) {
                          return;
                      }
                      if (enabled) {
                          allowedOutboxesMap[outbox] = InOutInfo(allowedOutboxList.length, true);
                          allowedOutboxList.push(outbox);
                      } else {
                          allowedOutboxList[info.index] = allowedOutboxList[allowedOutboxList.length - 1];
                          allowedOutboxesMap[allowedOutboxList[info.index]].index = info.index;
                          allowedOutboxList.pop();
                          delete allowedOutboxesMap[outbox];
                      }
                  }
                  function setSequencerReportedSubMessageCount(uint256 newMsgCount) external onlyRollupOrOwner {
                      sequencerReportedSubMessageCount = newMsgCount;
                  }
                  function delayedMessageCount() external view override returns (uint256) {
                      return delayedInboxAccs.length;
                  }
                  function sequencerMessageCount() external view returns (uint256) {
                      return sequencerInboxAccs.length;
                  }
                  /// @dev For the classic -> nitro migration. TODO: remove post-migration.
                  function acceptFundsFromOldBridge() external payable {}
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)
              pragma solidity ^0.8.0;
              import "../../utils/AddressUpgradeable.sol";
              /**
               * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
               * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
               * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
               * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
               *
               * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
               * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
               *
               * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
               * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
               *
               * [CAUTION]
               * ====
               * Avoid leaving a contract uninitialized.
               *
               * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
               * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
               * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
               *
               * [.hljs-theme-light.nopadding]
               * ```
               * /// @custom:oz-upgrades-unsafe-allow constructor
               * constructor() initializer {}
               * ```
               * ====
               */
              abstract contract Initializable {
                  /**
                   * @dev Indicates that the contract has been initialized.
                   */
                  bool private _initialized;
                  /**
                   * @dev Indicates that the contract is in the process of being initialized.
                   */
                  bool private _initializing;
                  /**
                   * @dev Modifier to protect an initializer function from being invoked twice.
                   */
                  modifier initializer() {
                      // If the contract is initializing we ignore whether _initialized is set in order to support multiple
                      // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
                      // contract may have been reentered.
                      require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
                      bool isTopLevelCall = !_initializing;
                      if (isTopLevelCall) {
                          _initializing = true;
                          _initialized = true;
                      }
                      _;
                      if (isTopLevelCall) {
                          _initializing = false;
                      }
                  }
                  /**
                   * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
                   * {initializer} modifier, directly or indirectly.
                   */
                  modifier onlyInitializing() {
                      require(_initializing, "Initializable: contract is not initializing");
                      _;
                  }
                  function _isConstructor() private view returns (bool) {
                      return !AddressUpgradeable.isContract(address(this));
                  }
              }
              // SPDX-License-Identifier: MIT
              // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
              pragma solidity ^0.8.1;
              /**
               * @dev Collection of functions related to the address type
               */
              library AddressUpgradeable {
                  /**
                   * @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
                   * ====
                   *
                   * [IMPORTANT]
                   * ====
                   * You shouldn't rely on `isContract` to protect against flash loan attacks!
                   *
                   * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
                   * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
                   * constructor.
                   * ====
                   */
                  function isContract(address account) internal view returns (bool) {
                      // This method relies on extcodesize/address.code.length, which returns 0
                      // for contracts in construction, since the code is only stored at the end
                      // of the constructor execution.
                      return account.code.length > 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");
                      (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");
                      (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");
                      (bool success, bytes memory returndata) = target.staticcall(data);
                      return verifyCallResult(success, returndata, errorMessage);
                  }
                  /**
                   * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
                   * revert reason using the provided one.
                   *
                   * _Available since v4.3._
                   */
                  function verifyCallResult(
                      bool success,
                      bytes memory returndata,
                      string memory errorMessage
                  ) internal 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
                              assembly {
                                  let returndata_size := mload(returndata)
                                  revert(add(32, returndata), returndata_size)
                              }
                          } else {
                              revert(errorMessage);
                          }
                      }
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              /// @dev Init was already called
              error AlreadyInit();
              /// Init was called with param set to zero that must be nonzero
              error HadZeroInit();
              /// @dev Thrown when non owner tries to access an only-owner function
              /// @param sender The msg.sender who is not the owner
              /// @param owner The owner address
              error NotOwner(address sender, address owner);
              /// @dev Thrown when an address that is not the rollup tries to call an only-rollup function
              /// @param sender The sender who is not the rollup
              /// @param rollup The rollup address authorized to call this function
              error NotRollup(address sender, address rollup);
              /// @dev Thrown when the contract was not called directly from the origin ie msg.sender != tx.origin
              error NotOrigin();
              /// @dev Provided data was too large
              /// @param dataLength The length of the data that is too large
              /// @param maxDataLength The max length the data can be
              error DataTooLarge(uint256 dataLength, uint256 maxDataLength);
              /// @dev The provided is not a contract and was expected to be
              /// @param addr The adddress in question
              error NotContract(address addr);
              /// @dev The merkle proof provided was too long
              /// @param actualLength The length of the merkle proof provided
              /// @param maxProofLength The max length a merkle proof can have
              error MerkleProofTooLong(uint256 actualLength, uint256 maxProofLength);
              /// @dev Thrown when an un-authorized address tries to access an admin function
              /// @param sender The un-authorized sender
              /// @param rollup The rollup, which would be authorized
              /// @param owner The rollup's owner, which would be authorized
              error NotRollupOrOwner(address sender, address rollup, address owner);
              // Bridge Errors
              /// @dev Thrown when an un-authorized address tries to access an only-inbox function
              /// @param sender The un-authorized sender
              error NotDelayedInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-sequencer-inbox function
              /// @param sender The un-authorized sender
              error NotSequencerInbox(address sender);
              /// @dev Thrown when an un-authorized address tries to access an only-outbox function
              /// @param sender The un-authorized sender
              error NotOutbox(address sender);
              /// @dev the provided outbox address isn't valid
              /// @param outbox address of outbox being set
              error InvalidOutboxSet(address outbox);
              // Inbox Errors
              /// @dev The contract is paused, so cannot be paused
              error AlreadyPaused();
              /// @dev The contract is unpaused, so cannot be unpaused
              error AlreadyUnpaused();
              /// @dev The contract is paused
              error Paused();
              /// @dev msg.value sent to the inbox isn't high enough
              error InsufficientValue(uint256 expected, uint256 actual);
              /// @dev submission cost provided isn't enough to create retryable ticket
              error InsufficientSubmissionCost(uint256 expected, uint256 actual);
              /// @dev address not allowed to interact with the given contract
              error NotAllowedOrigin(address origin);
              /// @dev used to convey retryable tx data in eth calls without requiring a tx trace
              /// this follows a pattern similar to EIP-3668 where reverts surface call information
              error RetryableData(
                  address from,
                  address to,
                  uint256 l2CallValue,
                  uint256 deposit,
                  uint256 maxSubmissionCost,
                  address excessFeeRefundAddress,
                  address callValueRefundAddress,
                  uint256 gasLimit,
                  uint256 maxFeePerGas,
                  bytes data
              );
              // Outbox Errors
              /// @dev The provided proof was too long
              /// @param proofLength The length of the too-long proof
              error ProofTooLong(uint256 proofLength);
              /// @dev The output index was greater than the maximum
              /// @param index The output index
              /// @param maxIndex The max the index could be
              error PathNotMinimal(uint256 index, uint256 maxIndex);
              /// @dev The calculated root does not exist
              /// @param root The calculated root
              error UnknownRoot(bytes32 root);
              /// @dev The record has already been spent
              /// @param index The index of the spent record
              error AlreadySpent(uint256 index);
              /// @dev A call to the bridge failed with no return data
              error BridgeCallFailed();
              // Sequencer Inbox Errors
              /// @dev Thrown when someone attempts to read fewer messages than have already been read
              error DelayedBackwards();
              /// @dev Thrown when someone attempts to read more messages than exist
              error DelayedTooFar();
              /// @dev Force include can only read messages more blocks old than the delay period
              error ForceIncludeBlockTooSoon();
              /// @dev Force include can only read messages more seconds old than the delay period
              error ForceIncludeTimeTooSoon();
              /// @dev The message provided did not match the hash in the delayed inbox
              error IncorrectMessagePreimage();
              /// @dev This can only be called by the batch poster
              error NotBatchPoster();
              /// @dev The sequence number provided to this message was inconsistent with the number of batches already included
              error BadSequencerNumber(uint256 stored, uint256 received);
              /// @dev The sequence message number provided to this message was inconsistent with the previous one
              error BadSequencerMessageNumber(uint256 stored, uint256 received);
              /// @dev The batch data has the inbox authenticated bit set, but the batch data was not authenticated by the inbox
              error DataNotAuthenticated();
              /// @dev Tried to create an already valid Data Availability Service keyset
              error AlreadyValidDASKeyset(bytes32);
              /// @dev Tried to use or invalidate an already invalid Data Availability Service keyset
              error NoSuchKeyset(bytes32);
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.6.9 <0.9.0;
              import "./IOwnable.sol";
              interface IBridge {
                  event MessageDelivered(
                      uint256 indexed messageIndex,
                      bytes32 indexed beforeInboxAcc,
                      address inbox,
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash,
                      uint256 baseFeeL1,
                      uint64 timestamp
                  );
                  event BridgeCallTriggered(
                      address indexed outbox,
                      address indexed to,
                      uint256 value,
                      bytes data
                  );
                  event InboxToggle(address indexed inbox, bool enabled);
                  event OutboxToggle(address indexed outbox, bool enabled);
                  event SequencerInboxUpdated(address newSequencerInbox);
                  function allowedDelayedInboxList(uint256) external returns (address);
                  function allowedOutboxList(uint256) external returns (address);
                  /// @dev Accumulator for delayed inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function delayedInboxAccs(uint256) external view returns (bytes32);
                  /// @dev Accumulator for sequencer inbox messages; tail represents hash of the current state; each element represents the inclusion of a new message.
                  function sequencerInboxAccs(uint256) external view returns (bytes32);
                  function rollup() external view returns (IOwnable);
                  function sequencerInbox() external view returns (address);
                  function activeOutbox() external view returns (address);
                  function allowedDelayedInboxes(address inbox) external view returns (bool);
                  function allowedOutboxes(address outbox) external view returns (bool);
                  function sequencerReportedSubMessageCount() external view returns (uint256);
                  /**
                   * @dev Enqueue a message in the delayed inbox accumulator.
                   *      These messages are later sequenced in the SequencerInbox, either
                   *      by the sequencer as part of a normal batch, or by force inclusion.
                   */
                  function enqueueDelayedMessage(
                      uint8 kind,
                      address sender,
                      bytes32 messageDataHash
                  ) external payable returns (uint256);
                  function executeCall(
                      address to,
                      uint256 value,
                      bytes calldata data
                  ) external returns (bool success, bytes memory returnData);
                  function delayedMessageCount() external view returns (uint256);
                  function sequencerMessageCount() external view returns (uint256);
                  // ---------- onlySequencerInbox functions ----------
                  function enqueueSequencerMessage(
                      bytes32 dataHash,
                      uint256 afterDelayedMessagesRead,
                      uint256 prevMessageCount,
                      uint256 newMessageCount
                  )
                      external
                      returns (
                          uint256 seqMessageIndex,
                          bytes32 beforeAcc,
                          bytes32 delayedAcc,
                          bytes32 acc
                      );
                  /**
                   * @dev Allows the sequencer inbox to submit a delayed message of the batchPostingReport type
                   *      This is done through a separate function entrypoint instead of allowing the sequencer inbox
                   *      to call `enqueueDelayedMessage` to avoid the gas overhead of an extra SLOAD in either
                   *      every delayed inbox or every sequencer inbox call.
                   */
                  function submitBatchSpendingReport(address batchPoster, bytes32 dataHash)
                      external
                      returns (uint256 msgNum);
                  // ---------- onlyRollupOrOwner functions ----------
                  function setSequencerInbox(address _sequencerInbox) external;
                  function setDelayedInbox(address inbox, bool enabled) external;
                  function setOutbox(address inbox, bool enabled) external;
                  // ---------- initializer ----------
                  function initialize(IOwnable rollup_) external;
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              library Messages {
                  function messageHash(
                      uint8 kind,
                      address sender,
                      uint64 blockNumber,
                      uint64 timestamp,
                      uint256 inboxSeqNum,
                      uint256 baseFeeL1,
                      bytes32 messageDataHash
                  ) internal pure returns (bytes32) {
                      return
                          keccak256(
                              abi.encodePacked(
                                  kind,
                                  sender,
                                  blockNumber,
                                  timestamp,
                                  inboxSeqNum,
                                  baseFeeL1,
                                  messageDataHash
                              )
                          );
                  }
                  function accumulateInboxMessage(bytes32 prevAcc, bytes32 message)
                      internal
                      pure
                      returns (bytes32)
                  {
                      return keccak256(abi.encodePacked(prevAcc, message));
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.0;
              import {NotOwner} from "./Error.sol";
              /// @dev A stateless contract that allows you to infer if the current call has been delegated or not
              /// Pattern used here is from UUPS implementation by the OpenZeppelin team
              abstract contract DelegateCallAware {
                  address private immutable __self = address(this);
                  /**
                   * @dev Check that the execution is being performed through a delegate call. This allows a function to be
                   * callable on the proxy contract but not on the logic contract.
                   */
                  modifier onlyDelegated() {
                      require(address(this) != __self, "Function must be called through delegatecall");
                      _;
                  }
                  /**
                   * @dev Check that the execution is not being performed through a delegate call. This allows a function to be
                   * callable on the implementing contract but not through proxies.
                   */
                  modifier notDelegated() {
                      require(address(this) == __self, "Function must not be called through delegatecall");
                      _;
                  }
                  /// @dev Check that msg.sender is the current EIP 1967 proxy admin
                  modifier onlyProxyOwner() {
                      // Storage slot with the admin of the proxy contract
                      // This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1
                      bytes32 slot = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
                      address admin;
                      assembly {
                          admin := sload(slot)
                      }
                      if (msg.sender != admin) revert NotOwner(msg.sender, admin);
                      _;
                  }
              }
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              pragma solidity ^0.8.4;
              uint8 constant L2_MSG = 3;
              uint8 constant L1MessageType_L2FundedByL1 = 7;
              uint8 constant L1MessageType_submitRetryableTx = 9;
              uint8 constant L1MessageType_ethDeposit = 12;
              uint8 constant L1MessageType_batchPostingReport = 13;
              uint8 constant L2MessageType_unsignedEOATx = 0;
              uint8 constant L2MessageType_unsignedContractTx = 1;
              uint8 constant ROLLUP_PROTOCOL_EVENT_TYPE = 8;
              uint8 constant INITIALIZATION_MSG_TYPE = 11;
              // Copyright 2021-2022, Offchain Labs, Inc.
              // For license information, see https://github.com/nitro/blob/master/LICENSE
              // SPDX-License-Identifier: BUSL-1.1
              // solhint-disable-next-line compiler-version
              pragma solidity >=0.4.21 <0.9.0;
              interface IOwnable {
                  function owner() external view returns (address);
              }