ETH Price: $1,871.68 (-2.04%)

Transaction Decoder

Block:
17040343 at Apr-13-2023 07:03:23 PM +UTC
Transaction Fee:
0.229483948 ETH $429.52
Gas Used:
1,850,677 Gas / 124 Gwei

Emitted Events:

70 TransparentUpgradeableProxy.0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1( 0x5e3c1311ea442664e8b1611bfabef659120ea7a0a2cfc0667700bebc69cbffe1, 0x00000000000000000000000000000000000000000000000000000000000ba4da, 0x87202311a0665dc5bb8534fda58fc97265bb2b41ade9720bdfa87bf4f2a0594c, 0000000000000000000000001c479675ad559dc151f6ec7ed3fbf8cee79582b6, 000000000000000000000000000000000000000000000000000000000000000d, 000000000000000000000000c1b634853cb333d3ad8663715b08f41a3aec47cc, e1df7d3a9b97337636e130f86560c6e6d717a60fe08859ce7c4246f352fa9b5c, 00000000000000000000000000000000000000000000000000000018f10e0186, 00000000000000000000000000000000000000000000000000000000643851fb )
71 TransparentUpgradeableProxy.0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b( 0xff64905f73a67fb594e0f940a8075a860db489ad991e032f48c81123eb52d60b, 0x00000000000000000000000000000000000000000000000000000000000ba4da, 0000000000000000000000000000000000000000000000000000000000000020, 0000000000000000000000000000000000000000000000000000000000000094, 00000000000000000000000000000000000000000000000000000000643851fb, c1b634853cb333d3ad8663715b08f41a3aec47ccef7817b8f6f1b288fc8c0969, a398563763715b93177f259ae5fed661643d5a33000000000000000000000000, 0000000000000000000000000000000000023fa1000000000000000000000000, 00000000000000000000000000000018f10e0186000000000000000000000000 )
72 TransparentUpgradeableProxy.0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7( 0x7394f4a19a13c7b92b5bb71033245305946ef78452f7b4986ac1390b5df4ebd7, 0x0000000000000000000000000000000000000000000000000000000000023fa1, 0x9294258f2511988d6d3fc040b3d9cdec3e633b396661be3f0cf7dedaaa9490d9, 0xdcaf861bafbac73e8813ec137bf912df44cbbd7d233623b60cc0f2ccdb742d61, 16b8e7ab6467783395d4e71421215f4b5dec5c9235c80cbe164bc5d097db2dfd, 00000000000000000000000000000000000000000000000000000000000ba4b9, 000000000000000000000000000000000000000000000000000000006437007b, 000000000000000000000000000000000000000000000000000000006438600b, 000000000000000000000000000000000000000000000000000000000103ed57, 00000000000000000000000000000000000000000000000000000000010403e3, 0000000000000000000000000000000000000000000000000000000000000000 )
73 GasRefunder.RefundedGasCosts( refundee=[Sender] 0xc1b634853cb333d3ad8663715b08f41a3aec47cc, contractAddress=[Receiver] TransparentUpgradeableProxy, success=True, gas=1887671, gasPrice=109123442054, amountPaid=205989156985516234 )

Account State Difference:

  Address   Before After State Difference Code
(Fee Recipient: 0x0077...958)
213.451330380688624378 Eth213.48256343831845382 Eth0.031233057629829442
0x8315177a...4DBd7ed3a
(Arbitrum: Bridge)
0xC1b63485...A3Aec47cc
(Arbitrum: Batch Submitter)
5.0014318972244864 Eth
Nonce: 96092
4.977937106210002634 Eth
Nonce: 96093
0.023494791014483766
0xe64a54E2...80E2E4eb5 161.397966804256427973 Eth161.191977647270911739 Eth0.205989156985516234

Execution Trace

TransparentUpgradeableProxy.8f111f3c( )
  • SequencerInbox.addSequencerL2BatchFromOrigin( sequenceNumber=147361, data=0x005BDBF96424C2ACD4FEB019295A3D043403C7F558E73D8073FBCF898C3EB420514A3B4240522AA524A42543244AA9FEFF7B556D2B300205A6D6957753CB968CF5096B06145DC85470AA3C69043345D221F0810F8514A419A8B8A577492915FFBF77DFA3287C92B2084A36012A36C954CA954CA552FA9292BB6439A54BFFD33924CAB462A5B823FC9F7083944677B9705AFBE434129A02491B29CA82337DEB5696B358B5DD3E6716AB94B6CD2E73F6B3D8CDAAAF92BFAF6976B566461A3B88A764110E2769CACF5A90C60B01F212DA9372D0A256C89319A534CB740AE0A9BB7FBFFF87DA9E9A911C574976C0996587BD44D70082F53DD4B6AEBB7CA2AEE9B6979C3D1138E163DB215BBE6834213E9C96E8BAB5D7F3E6BAC875DFF9D799AE965FE4B30234F1561AF1ED3A7418B70206D8922D35F6857C77B91080E97F1DF9087D612E315B41C35A1E598E4BB786682DD945C7A50075EBEB30F575A27DEB30C6E2D0A79F5977BF54D73C09A22F623234B21939F95249F3F95C80A51821B116634655059F82975CD741060191D0346731B69E9F815FE12B8F4344052C62715FC5C3C5DA0969ADC74363C150B8814E4427101CE88F2EC615F4E15F0C566F472C22230628460CAB2E1B98E4DDF454225EF0A5B1310C6679A3C5181A898475C42A3C886A81107F5CD844C7FF89B01753355F5E727040385DAFC99CCAE2B6FBA004B4B97DED4C45A87EFCB441C36E792630E150FF6506E14364C870DF939E5B73BB9610158C57ECFF1D4727781D03568E03AE991F185E80C53C9E865D950B04A4DAB74117C7F8FA556B116D1EF68021932A40E8D13D833F4284EED6791D9FF1B1A7E731CB0996031E1EC8160CE61CDDA1A005F103AD090A79A88F2E6F4480C522A1FEEB8F419751CC7EFF8C620DA8929528F1954B9AEFEB4AF4AE9B8DC13AE4902D2A9B6F760C36151847EFD94DAEABBFEF779C46C023822C723808C142110BEB87017AA36BA3BE580D0B1359B8086D8D8DAAC37EB35E0E815D08780271E4FB4A657000AE81004007E90F44E423451808452DF49255FA189EC286D82F57339CD7E42E709557052980421E219FA2CB1BC56FBFCB40E58C9DADFB2346C4DC4D7D2D31CD79902D71FCDAA09C002F410DD38E527352AD1342F7E507D60B48C4D8BBC934B0224A88AFF42005C563C5B63542445D909CFE6CFD65FA782383E0E6CCBA3DD8F0C9E0564B90F1054C4506FDC90C01518C15370D0F14EF3C294B3C0A3324FA61003452F3B3B218EB3FC98711DE4BF2963E908C1FFBBE36DC2F0C085B5F7EFF771740E5226D4190F5A52DB538A7FB53D457D36B62CBB35BBFCEFABB2F0CC90A5BFFE8F8A1A801FA500B1F0B7FBB0B8AC1EBD5CBD6F7D7674E2CAB828776D7377213F8BDBC4AD5A9E62D45E2A0F22642889E76A30BA578141762D7FA62E942882083C09166855A1338C58095E3017454C558D670199D93B71B3BD4446E6AFBB7D33C178CA383FEE609E6BF4BD27B80654D39E51D21FCD467C3D9EF46D75C7602172257F9F5B796B4D759762768BCAC7C55601328E411AC1F5DDE08FBB78B40168694FD83E6FF656CCFC40943CA7542F9975BDA94DF1252098C0E91499329D11DFBD878532CBF0D03F254852B0140FB63C0EACFA1B09DA3A64EC78D833DDC12540E04FC6A43E9E4FF6F333DFB16A0238CDE42092BA428BCFB0A897E1850B625F169F5E8474956E9BCD61ED62C7BE47F954FF1B4DCCA8309618E36214E1F0146A94DAD135FDD4AEA7F59A9984C62F7E0FD420BB49DB37F42A4F92A557C6F7FF0A6F6833E7847A3DCC622A406C2623065A4B2F74B0EE9A3EECEEEAF855FB6B066DB9657857EEE25A2206FFDBE96E8D48195FAF2BB8409EDB027556AF9F7D8AC6E43FFEE1337247B6DEA5005D81521CF5A5135A000A4DAFE9F08DF70BB077A11ADE0C83D872E76E1DC2C6AFF279C7E8EC80FA9EAB4C09BD507FAE0098E15CDFF058A412CA1CA6EFCD68559DDC37DFE4CC78765B494F68FDE342A2091A96107333AF6E1FBD5234266D75DECD12069C8E5F4ECEC549CBFA140EAB6CA951976F8827265616B80A20CC86C4F45E3F4046728E2554C46A557E3211E33E6D0F787E218A889790726C6D1778203AA5BAED2D1732E301E0966F6F38AF20128B2606892DDA3D1B85FBE63C301E284BAD8BF08F9B2D9C1F5029403F264202B629C97CE40FD60404673C88313B59409DE436252C9750963B0DE332001ADDB2AAF75127EAB1C4315F0C45DF93FC6771A49C4F9299E77C49B4C4B424D392E7AD1D04E8F82E1372BC3FCDD1F991E1A62A0A51F62B177CB4031EC23FD95E5AD7D832FEC5654EEBDA641EB35C9F35BCC70E9AC1A6453E4D5C7163C04222011098AFC30ABE560F4E4B671C073BE2976289D9A759227B046858E9F8173CFDC2CEC62BC280023A210D6892C6F8C6F9DE4909AD432CC1E01DE97EE70F3DC9906BB1B048BFBDD6838702744170407028140A0A64EB6AF99C41F87DA72FF2F11A843F01EDA9D81FE62F695B7A67A5CCC4E76B898C79F1E1F7577B4210ACF0F2B43211ED854864FB30DE82A729A93E6430B1D118A70E287D10EDCE5D3FA39DCD1DDD121034C35D6D2A2DD727F7612A4A53D6C2C514BE0F557DADF86D4F3A86118EE66FC1DD0F9E9BCF4188B8C0CE79E6DCBC4D28870D75C13CEE1EB2EDA5ED8517BADB29C00C65AE5F6E8073556A4AFD8238AD69A5AB6568C3CC45BF799E5220E17FD7E21DB7F6CEB97BB8A3140F519B0EDBB9811296D4634E7CF11FE3F184DF8EDA83FC6F51135ACC8E7C6F27B268D010CA0F9AFFD30135DDE1855764809BF126707AB58F3A738C91B6B666F907F67A1673555C2AB8375D865B7066CC5D25E23B513B2D880BC5BFFB51004E93512FF2D1A3C3391F4C0A7CD2DE0C74084A2EAABA510F3F93E29E199D5E5A9D5225DC6D0C027EFDCD794FF202C673A40CA8294B5E27577F0DF847D50A2258F633F0CC8889EEB5EBAEBC6CBCDACBC2949E14C911BEE8DA98FAD71774D416C93973C3502F0BECFCA22F0A2A82E872F62F6E7BBF1C557128520B0F4355E50CCD9479EA5567582774050C823782DBABC111C0B7FBB0B8A85BFDD05C588209565ABB4506FE93463B343E458A1E8F31BBE470DB6AD0990CA600545C5F94EB0DDB0F91923080402814020105E009A7C829637F618D22F45859C1B582D09CE06C01030F4EFDC07E6C6604B333733BA101E9119D52B90E43F84A502F19E1714004EEA77473381DCBF80EE519118337A4AAEB614ACCF13CBD0F22ABFC9E55749FB61FE602C4C7D4068C0C2029970E9870156BA1F3EA70E6433498AAD3C86D49D7322DA11FFC5D12F47CAD6F2467778F9DD0F6030D6C84BA07DC83345138728B687B7095318880932F345A874A3764CECF3D07522E414DC4F0AE1853E4238A3CD4712FA78A31CCFCB4E6D7708BE3F67E1E8C7334978E35F8ABCDBCDAF80758287BFAA3DD3DE9FAA943B909B96FCEDBEFA4ECEB726C9C5E529DE3E441300502B1164798FC240900A70DC30C1025D830994091C130803B02FF9EF64F256FC5AFA4ABF7A8BC513A5DB9148E80AAED040FBF2E27BA05A8A62587AA3D63E4F48394D7E0288BA2D7D2019B34673BFE449B33ABE7F76D310984FE2654A397839EBF0D75B1F840192FF988F909CE8F246F5AEDA774EE1F4DC102FFF1AFBD188E64B9F7187A2EEC5EB6AE5CC7495E8F705A43DFE9451A372B1C445C341A8FD428566A3B691838044E31D45F943619EA8CCFD181DD34A4FA601E209BE8C83E26B9A9297E898651DEA8E74FAF180D5019A0AAE5B53F980D52CF4980EC976F886BA3676E40B8259F73DB59CE4F1573806808CDE197F1CBE0D96AC9709EAED3078F767FF9A5DAD7BECBE4239628423635AD0F9AB874B590A51787EB0F953FEAE4C53D406667D3E3E6AF242E79E13269771A2D22C02DDAB0F4B2918542667CD8052DE9E1C4681D5BF5FAE89BF1A63E7C1E94C9F3EACD94C7C2E4B4C350E6D59DD135D8BEEFBE468F0DFD746E7EDE948055BE8E1BDBCAEC17849953289DCB9DD7770325DD50ED57F203D7AC2C0ED502AC4A46FF06EFD7A1DA2168CDF1CC1A9C7987743BE3B171A9228BFFBC180317A85D2488DFD8614B669B9DAC9C7E33E64B81F5F17786A7AAAEF64A4FF207701D85BC4A4FA6A4E8A88D052EADBA1E2DC02EDF49739AD94408732C251E9E9BFDE9DA8C4203810080402815022A190479490E8F276C82926863FB0B21DC407CCC54846242F39E46B9CDECAFE57C50C6A2750CBB74B6B618575A240D5A3ACBA405693907708157E48EF53CE049612B2C3653383C0B9905C3BC6E6C34EC0907346D35ADDEE547700AE0141633F4E547142468B742B0CCAFE4FB3496536C386909E525F0CFED3C3F908D7A903C8BAE521C040CF0A3D0A83E85055EC029244E8742F8FB68A658FD9ED5F04F6C713D8AF0229A9A607DF27D5B622E81E918F1D1EA1CFD1EE070643AE40563982BDD82A109CF037803C8320532048F3491F8994747483B25C7812E29FDE9C5E74836B1D691DC9AEC6D93FE8DF41403C0ACF99E162A0C342BCB4A9280339CB7A18B8AD4E90BB09A6495CD3FA9F9A5DBC6E12D0FE7F6A6466F2ABD6A87ACFC9869FB6F59A08C6628C1F6F31A2CA1AA6EBE2A52474C3D80B31F82441DAB8433EE9DCD3A01F8CA04407652C74483C493463E313FE50994C9B65A69D90D665570C9C10FA3CA30171B4F6B0B37673F073B2B7F1F10CF4700C720FF270061191671F6A5084C01730E0E857C0A5395126877F883C3934DACA446DA1C3E939CE577C54F94BDE82E40ABFE196DBA6801581A4378F413A1D3A6946097367850B347DA735FA763FC4CA5A903B7166C94E7A891719470044B5D4FB2368ECE639026E1ABF187F955C012E9016BBFDCC451812C86A1238B9E75DB7CA4F43CAE1D9080792E9E1B214D57A08E50AAF0C6FA2DE747F00B1BFABED03E8831178E440591661F900DE71931508151329E22D6D6252C678E1E693AA1FBD1743A21F0C308C568CBC94DDF430D116D54C2C07C9377FA86F9F9CE29FFACD85D97766701A0FD0D1AEC911FC42D4145FC8F1D774C1CE96A42ABFE1E1E361A1DB27AA90988841376FE54428E42136BABC31061E0060B181FCD9A018716450369C18E83593E506D521E64DD75B0889FB6B07B9212C175C375FCD426807385C899FFC6D483F0CA07E5A333ED437AC8108B33846FBA9DC72E8FBBFFA30B263D5057D19B09AFF2C0518515AB2263C4C254E0F80FCAD99F69EF8EFFB458BC31E3067CAD4CAF0DC0EAEA2E1C01DCD2028E4A13EBABC111D168B42FD068B4147ADCA76C8E6C3ECA7FA79D069EF182B5EBA0D6E9AA66883B5EBD5A568CDE37A9578BC27316ED10039AFCC0ECA7D74F06E59D936E3D154EF3D6312A6743B6E7EE8DA7CB6A7AB1E91606EA1DEC74A3171DA8DB2EF047C88FA484A416B275A12A93FD5D80697F7E85EB1F5D28DECFF2A58F07AF4D5157542F24050C823242BBABC113D16FE7617140BDF9C3FC9A782FF965DEC717F6FB292A2B1AE96473FAE1A50688A6E1305EB84D0F1E208333C635B007321A84AC2A3B12A66FB4AD92AB3ACE678874FD29D522E2B1800B09E3CA8CAC32FA4EB83E81462EE868985184B03A82484E2505BE65745402069D870958A49795A80BBEC43FC4EDC06F8DA7B6E04F8C5B4383147BAF643AF741089328CDBF773DC5549767FC55369253DF2C748DE6E274286EFE65B99E17975A364122EFD30C0835A6E7E33496ECC4D363CCE1ECF8916EDE520B87586F56B0EFDE5C86C0D6930401E351A37A23512810D87BDEE0B12AC3F42BD08602056DA4393814A4F08629575C21F44D62B815B803EC2CDC660531F8C17C4ABE792B36CC27081F53D4612F57596152EF5689BD44EEAE57458279C1D3D67681B3C83A7A2F3B347FB57FFD9199452FFE27437BD13DBDAD7BCC9AE108E2D923847AF58449A665BEB6808A7248B2923525F31E3FCB14C0D2C52A3C2876900CF8D0890051A88CAE0B78FD47DEBDA598736053E389CCFFE6FC28B059704ED61451631531EE4E94592E3150249AF4D4E6FF62E4EFDDB8425801403F20837B05F539EE86EA858CD97E4574E7AF22DA36BD68FC6558EE8D7E75199BEC633343D27A6B6DAC7358D86D24DF4F367129B4239090D2EB4C7CDD01D9C8C4DF0AEF2B0ACE39183A014E81BC7C42A4D79B7F8FACDC24E944A7F4E9EA9CDB5BB57E3A9A7E2E00844680E470CD4B31AD5955AA39045C20D7FAE060470C7BDC9629A5FBB1E6980BF84052C6C1B27A27151787F782451BF888CF0E84911A4124A033FA747EC32D03073657784C8BA66BD1F2F9B993D85D6BE3FDA717DCF754A04DB1EB3EFE649813AC1B1A6894723F72A5059746E9F223FC0BE5F1EA850D904930D7D4FC0F7B9BCFF0FB28E22298EB2BD7F72EBE5764EEDD15EA57C40E69CC3B8468FEE74C812E2727C75495AAFB2D658CC4BD0B5F88F0EA8EF8C8CC348E907034F9CAE3C006AB869F7CA46E0D726BD490CF4CF623E7248CE853F6A764B6656CE01F022856C8A6211B7C270FDC83DDD138688B167ED0A9C107C8410B4595DABAFA613CEAE567C4A7F28E4C13BBABC1175CE789171B4B369D519ED50425604210D944C6A8DBFF30B5B93B412E1BE8CA25AC77E56FE2AFDC4513E07DB47BBB9395F35E8B21555F9B0F0343E4E124336457613D439F5270F6053D07ACC51E3C82F7FBB75F7D18D0885C5276C12FD5E618C4C251BC761FC3B03503A382658820AB43EF7DE871BF69826192DEFF14488148B4B26AF6366F02D52D193E023F251075B774BB3DF62DA558AE7CB48A0FBB252FA39C9100EF18A0CFBD3FFD6DDF55D601FB30B692CFA9FB31DF1D22BF685BDC9030076798F7160F17725F2170F26052285C765C247021E4BA9EADF8CABEE6E0666F77083436359173088F6C34AD4D341500C53CA4C36CA976835F84A4DC3105D97243447EE982A9FED9B048810B3FA67235027185ACF757781BA82CB88CC2608E60DC19E902977D834437EA7EC9FF9E36FB9FA8D57C31D32F5DB776CB75BB9634137A42D513B1F6B13FD3040720198D325CE8B8533DDB45618196E191446795ACDCE3131DC66DB6AF0CBE1032C9BE47FCA5FCCC71CAA1C6FAFC109511B3AC7597C4A2A20DDBFE02D8F2DBCDDEEA76CD30A9A7DD08B540DDA9BF2A99A1C7E9F866778FEF3299DBF447EFCD8995CBD88BAEA627B7CFF882FC4F580232C18B140452C9AD3F379015F1BF58C1ECF83DA2F9244D5492F1FF700E280EDC531B4AAD70FB21DDF5BFE6AB763D08E44580FD4854C747F1CC539E68FEAF005411F3CE163E16F774131287BA3D935A4650E16F26B2334FF9A8574D3904A4CDEA90B13718ADF0B9B996641B018B0723CA03A58F1824985D8E299BE4F536A2BCB272BC554FC3CF27D09EE0F82A2731C2A03200C626D1284CF16F980C79BE56DFC68326D7EC07A13B4723DA2DAFD2A78B57FD2E10F82EAAFA4A738285B8E5FA3FAD529E3456B285E4BF6E602BEC9779E27C0A544948FC0F03BF76020099582E75E7DED75B3FE754775DF387DD3FB9C975C80F47D8F645FF928CAEA09A012E8D287EC92D5FFF8CA083FB083AE724E66383B565650EED3402DC518673AD509C90141218F90B4E8F2462E582C12EABFFE18BA32DE6C352B78DCD85E7631F08F31F9194B55B99EBEA2BFB04E081D7F96811A0824A0118FA106F26227A47D4775C81BE407A8C7077183778D9183A0826B79B88D96C5356AA028A5D7B71F77DA2A413D4E50183BBC8C36777238683D64528A61ECA3B04E9B4D505B45248811AB4E5678F04D06DBDF0C3962321CE881BCF15BB42EB05F6CAF24B612E41DCFF2F43DA2F8409C3C9971BEB076A6FC9401FC67A9602F34F13BCB8CF34F19942220C8736124B2A68BB7B500A68F0D0D7AC7FC5EF03BF436784929FEDB34BAA5041276E8046FB4D74A2E69127EA09015A46593D60E52E9E2E8CAFA8FCDC1C8187FC778D9BBBD2780FDA37FF191107482ED02BE21E70359E0C40B07224401D6E3E19FA49FB10F5015528A6BCE9A6031EFD6A3E117A9B4A08232F5FD9929620B7935184A2D8FE1A218140EFCBF05FA8A1361D1C52F3E6601B4C4F453944D1B5C1CA3F610BD58B095B411D1BA08FC42F4B2323FD551D148E10735339EEE342B7E8CA11BC42DACAFCB606F02888EF2CE10F71D9AAB64F27E16643C23EEFCBE31A8F82C67F7C812482A640D0FDF09EDD53D722A90A4A298400A2A002FBBBB48C567C674E047B4229BD9676046B24ED34929EB1DC89DEDE351748AD7A0EE60D8DF11371BB5118F244234DE51949EBAB9745DCCEF507BE3C5A4CE6069C07CD6EFAD4234D065A4A105C4E646D14002D03FE72646E8A3D3E3FA50CB207CB45A8AA1C53E79DC190B18E6281B73ABA6F3841B9C531AE9D22745CD3CA627D93428E5D963BE6F13F37AB75F3D4087589D183754E44D7229B04E305DAD505697B169666370FE40DEE3BE50D5E908BA3D2002E5446C25D7E1573EBEE7AFA1D57DE6DBCF166A7D15619102B2EA6327A49F2CFC270C346F14B2CBA158299A6EFFAAD1EA7310BEF11DD1F74D967BF4C300C1106F3527EC9EA42CB7515BCE07A7FAD0BCE85B347ECB3A319A6CD1773B5D21000E5DB46F0119F58BB1CE203577CF4BAC6F123CDBDF442B3E734FEF30627C9E6FB0ABDAA7BB5BB4E60EE461330ADB365D69026160EE9D3F234CA63911997826A2F2D0CE09DDFD7800AE5C5F0969699CC1EE073028C8771357CB51BBBAB6C5F1F42A7871EE0F0B2205F0CCFFFB8EF5746CCEF9B7A6C74B2CBF6A30C6CD05781255394AFCC95E948AFBD989D206823EA234C660531FC6223262806221A5DF61D984E102EB7B63851641918347CAA6C8E0A2E8349FEB7B8504134AAC36D1BF786B45290564C9FCC1AF86B08FF4137FEEC9347D28643398DF9CD640EB5DE6ABB93A1DE7E4B1F00270AC93627CEC8C61A7EEC957DE81354A09BF82C9346A27470564CF276B4F03C2D4C1097D70A7C8B0A30A093442D40490E0C095E40638659C3CC5D375D76DE30BB29461609515A47E26F04CE040651A68AA10C4378FEE8336A082F043E4DBDE17E5C9B350C16FBD1EBCF77FD1D11FEBA91C7D9B41B5A1EB7F2361D6920321DC08EC89DD3DA3DA7C3B316FBA4102089B35984A6BA888E95E3391A38E18646ECB0C66FE2F66D70F9730609691E4034E83A7F2F8FBEF4F7C1C3EF1BC2F73FE687F970BA4A7EDACCBEF2FE2803FCD86F99B28DE08AD28F4792599F8F6686721470E8A66069D58D7F268AACF22C0962FEDC1227FEDBE48EED3BDB9C9C0248B0C2D5FE5DCA29DACEEB6FEF1EF233F80EB82F301ECF9B588845DA0384145EED25DC7D254D9550A0EEFE5DD981075F40560EBED978D33BB7BDE9E73BAE2FACE9AF83A163620E8C18451E2A9AD711E656306303D1E949F00BF09EEA97A4C9422FAB43EA246CEEBBE8D1BF03524DE4B0AE4E101B7EE53639A7CBCB87A3D2669853ADEF8AFAE6825133C1CC5893BAE7E382D9F626130180C0683C1E2A82321103F2210507522E0401E1130C031A8F33B9D35967DC27730D214302C2C9014E8678BB1BE1D8FF42917AC3731494AEA27D8CF214648660435F63B2F0DCB95D3FB924C627BF08AA5BE87F6EDD98160202CC8A58B21CED90C713F2C10165634D9AFB0335420504E3D8D3DC2C33D1464E3B316616E48F57FF28F3444D1DECFEE55CD96D07AB00536AF74EA48F7C60A9C07BF3BBD08A654E7B0565EDA0E971030DD9AA8DFD236FF03802C34F88E90A51EA0BFE3278440EF063F6FFDD174F7EFE959B8E99CA6B74C3845ECF5261C5EFF7D1333852915CAD8E850273DAC72E6F1C1287B8A43806621667423CED2E7EFC9D3C662606D50CB2EB04D3D8CDF9EFA5B9F6DFC338EF21F1678919E03A410949DE7EBFB94564215BE2CDF7F09FFD6CAE28EC5A03F3C664FC614327E7D1FE1B9B5A4201565138FBEA1D8F7766DE9C7C4348F9D6A18903622EDF00FD1EC2848890F33F328C6A02C0C887DA45F00D5CB2AD4C36AB689DE9B0EDF11B682BBAE43AC4D0C8F588E2C56D32EA0217D81BB23B6B8236797D04AF73A9C74577BE586A85EBBBEDDD6EAD7C216A5D09166623CDC80823F1D1AC9D5E1CD63C11407CB6FF8F2B09AB271EFB8F7DC92AE9C205553F44603C4FC314F9446D0A5EEA3D1E8E637EF24BD8993E8E031A11A6C5EFB8F6C90CBCD8BF308125EC2B92104B32FD53EF4647BD3157B88055628C73B74B8F9CEAD85BCCE2145D65E13ED2215153DDCA4F9760C1F9E8B6EF3538E6066863912A63D10508BAA2E16A80D530C6EBC768B9F8934E62D9764E1CA523CC776A7B76507379AF713B0ECB4726E3745A735589400B8931B54CC6032F572B82F48DFCC45FC32E83A0739531757A56DB943A305B7419D70572B35F5905AD19934B3077D286E0DF0045851E35ADFF37D4022FF39E2EC797D6186EC745DC0EF2F6298F24BE8C4B87984D1858194DA157769ACF18012B307B31AD993C2BF8B031F6D9AE2E645C117A86FABAB195597616A9E2EA1285372D84E99BE6E43A59B661EBA5C17D101831573504F67742EAD717AD06BC59FC49BBB89EE68CE1A7C439563C4424BC474B4BE6C48C9FF36EC90AB0A5BEBAC1A3F82FCBA896FBEF6470B5FD08C56D850F099C26C5A650988C06336CA165F89CC09397C015E4E9EB0684E954F611218DF1FAAD9153072FF6AB4C17DAF26D04A7F3C28A52DF0EE411950C8430AF5887EA03E2E65AD5D969B117F5BE918EE7E5FD9C44671E1FD5CEB24EAC667989C1588E3B8FA61C0A6375ACD28F16A08C22E7B9452601E7A5FC8E8649798D7286B05E3CCA7924A3D2062DEBA2E13B70A57ECBB43F9DDBDD34FB1F266A31DE0608F2AF7DB20EB560F53341CB813BC035ACF991E3E07A2EAE196418A41DD63903FFE21C05DA468A38BC21F3B65CC61CA62920D2776A4C41AEAA9F5F42C4B2AED8550B45F2F2BE61F2BEB28C83CA3EFB49FF0FF88FC9B0D45BE21F4A308E3F48F925F9AA66EADB27558191CA2A23F9FCBE39907FFE5DE5F4947212F9DB19938581F8AA4909115E28F148F99E05688C2621D115E9C6DAE8A51CAA7517225F51405FAAD396D44BE5F94CBAB2A60FB37C8E0D396BABADEDC5D3BEAB25C2101756C69DF772B40B843BE4478488A7C7CD357376A705649A074CCA2918D90C1BF697AF1FBDDD172275800047D0473C7C01973C471A49FCF8262C13855B06CEC2526C4B5231CE0D210475601F55196FE46B41DD6316CA831D007A28148B5F9C9854114FD0FE0391AF5DB00EC84B4FAFD39474C2EC805B46A1A54324C60C4AA17C3823423C2D1BB8F0BA790DBEEB065F462F4CC95405D5AC60A0FC976F24C5EA8DB04706BD1F4BA8786BD1AF46B527D6688CEBC8F862CB24763E8FB89D308477C0AE5EF44F58401FC69874770C6C4A54B65EA78A1493F5B6563D653C8D99B7C77A2FFE492369DD0799C5863ED35DE67D60DA1C3CA48002FE1558138D1AC9A0ECA67FB898E7EB24D2C507C2AE2A877F997BCE268145563B30A5621C3D1A44CFF50D854FAC5ECAF43128868D892063522C6C7FBD6D515F063AE5858B67C3E2275BC041B21D10F066E83C06A7F687DE835FF0DA3746EE370517B72E0DAC7AC317C6C3510393C81DC014EDAE90B793DAF5322861ADB8A5FD594D363CB7CA85E9A595FC58E1BDE551F6C50A249F3D5BEB744A53A085A2D827B3428CA9DEBBA31B977045DC3F18F633F816499320BDD434C49BD5B8C56504347F955D4C61EA6DA9294AF1C31BD793A46BEC3DB2CCA5A170A43F06E72902B7FB7AD02E4DCDF724B7B83B7D6657EADB91ECC59836DC978E5CA307CF86930DF5EF17605CD9850BA1F023588770053497D7948AC62FC47D054EFE2442F490BDF27A93BD6BA7DFB9C79B9ADDC664B3E9D40C69C1E43E305F9F94ED053F10EE5BA2D5407CF4FD7FBC607116E660E0FCA7E6E8B651514B231F6031C83150DB5BE6232120DA36F652B3BF71445FC856FC4E7B3EDF9B8F0A90D7BBDC6B659CD890D2516F147392C86E46362F62B92EBE8949912F96461DCE97E50497FDB9789CEB853E4179B19C62EA5FD2D9D579CCEAE2427E52B2AC903B91798A4ED8B84421C5068946012242BF0F299DECDC6FC8CCDADC950F7D25447D033C1E733BFA217FE2BA0800ED15660E0895BAE51C52FD3B79B706B32820B654413BF77A01109CF6E14E3185FBA1F3C5700BA602AC38B874A952DA8DAA4D9211060C284EB46BEFFD0F56DB0CA10335E67E853EDF75893DEBE627D64EB15951FEDB131F5D14D93C9AAF86A166CDB7FF776FD6C5CA6C9F801A06D55135B1DF91E45F2A6F7B5220CD7A091ABB96B84D6F9B8F226B332F3FD32116E084953B3247E2BB97AE2E8FADECC7B111F2325BC6696DB092E67DB46CD1175D09AB717D663FDB79C3B434BEC6346DA52AF46DB03B2CACFC58FB987B42BE64668828174184016A8BD0D1A48C815DC6C3AE0CE83A21F06B853613F7DFBAC2402B050075E44794DA160C9FC41DB5D0E622B9A72B97C459806285CA4690CD63E9904CDDC17675C52DFBD8FAA2DE376F398096310A17FD5A25AC493C10B401FE179A262DA53D54E1A64778EFE52C13AA1638B2141ADE04E1957F424AD416A85148D199DA3BD782746A656354045D9FA80AE6F24C7FB92B1F2FF24385670079E56D404CD447FE59B25DEEA05B2E68F040E4B6FA85D602E3FFB3214F85A922301B2050210FFF6FFFE25847481C02E20B09636D5C4203A3D4441A70AB1AD17334807A14D66DEE754825255D191CA06AB88FF6C85FC12520B8E766E9E269BDD17E42D4CE2480BF454A29B1FEC6A3EE4AF76706D86EAAA60DB7FA79E11288CD8D79F1DB8E16B1B6116FE780D6DA841AC1737F11838FA4DDF96F12C125D0C0E8D4D7202CADFA42C7EFEB52D76645BDDDDE211D4AE7DEFF6C13ECA332DF42690DDB8324E4EA32C6BFF59F320062E299AA93EC0DBF1A543BE9F5BCFEF7E3781E8324BFFB41B917C82FB15A15380B27533F334AB130A3712951A6140FDDB914CF4FFB880994CF0FE9B1F1C51AC4E7F08E44C85229DA4BCED7E488A4031BED78944B44658DE57A30E9090C200377DE8FC02A0F7C300B704C9B9CEC1A5C1724475B78129B72F397CA19E7E9DC44A7CC5FFFC1FBBCE980087F9A07FC31EF3BEF73D8E374BDF3ECD560B1C875432BCFAC95F35923BE9739982EBECEBC95A8CAE44908D101B073CDAB50CCDE7C0E713032609D2C3C91A6828E0CDEE04E2BDB8F4572628FF7742C2CF7D71F6E56E4111DD490A8F5A8F96DCAA75D7755B9A1B7C53DB488F8400976FBD5A685DB9281DAFDE4419015AB8C3AF4F676C1AD0FE6DEC44828BDAC55B3AB6014B90A61B5EC81F5CD72DB75586222DE48A9C7D4BFC4CADAD91C2A6BB437BC0BC75A8D6321E49005045C082AAB4704451527533C9C9CD4C61E5C460E6F88F10DA04D24F904DBE6F7084DEE866F1C725BBC4B72FE253328CD4CD375C82CACA7AE42BDCF63719AEED926435630DDD36312C3EDA34AE8CFE17BE70A414D2E8EEECBE505DBD6FA5082124B0C24A8FC0C0DDF4E81F907FA4A9D6B6FA93039B53C3F7DC02CBE84FF81FDC434AC7F8BA2B89716FA5CEA9510081E85D9FC096A695A2C3F3948E9257D797FBF4A3B413E1AEA6588C25AD6FAFE3E0B252AA4DA598B29AF98254E4166E8B04F19E47CF5794A9D47249A7A28F54CF5C6C33705BA8C9FD6080A33AFDE3D4BA9F7774728115ABC59F65960D58821C938EDD665EA9FD8056E30C109189732982F40FD93E65C5AEE67340CE87241F5B329654A5AB3C75F57F5792E98AC229013AEF8A5115DAAF07054EA2B69099FAD3C868C999BAA4EEDE6A7A8E5B4B027C0337623908DD5C1810B4D116422B8339140F163AF0CEA7A9A9CA6DA4D3ECBB596C9242ACEC61EFF105086FEDF707EB19F5E1ED460B31CA66DF58EC6AAB771D1D06FB4BBEC9236F4D4774C2BD82A08F700F31D8D447B1888C18A05830387B239B305C607DADD7F29A80804247442105EA848B55E5A0BBE42B6E7D7F2A50AF3A9606CF7E635AD3363615C51A7A5BB0807DA3CD7D6143471E9B7174434CD444FA0E58C38160984AD5BD0EAC7CB9754F09C70B23992561FD45019A1E80C7B51A193A88F553E837F360D4A223BCDED64781E837DAF527E6C168E0468BF29230C2CF1A3EDB493CB060CD8C7B55799BE06FECFC6B922996F83193E0AF6857466E26FD95DCA06EAA05C020D4BC9ADD2CE5F235FFF699504E7870F69B5D582D57D7604869C08D4AFEA15927B847C558D7A657CC01E9D7F2AF842BF402C1CBFFF04CEE176DB75AE0D06C2BD7EF965BCDED3E4E99AD6B780D7C35A28F9862A6ACAE431DA8BB04097207B187820577606AF4F36DA8A04AA9433188554FFD62E5F5E31FD6C4D626C802B5F668AB10D389053BC30406DC516222A9078CF6E7CE68E8930D4454B20C6967533A17F2ED0E9E2A33AA8A7F069C33C31BE2EA98FD0AA53B093C36ADB5F4AA0E3F64817EF4FD641EFE0F11A5DFE84432C2910334077D988E86F0C5C2DFFE9D8FC1C9A1D9B9704F3AEC62F5FBC9EF4599E5D697D9ABE7D7737A2A5C73D98463E6061D49AB41F409B1696DA96D9EF6F51007A80EDB8706858C707FAD88EDBB1D53B0F8D1589E390F3336B744A2327D9C529DC19236A2EBE9B992CC17C13DC4D02C21B68B06161E31849066CCAD6AA4A997472E925BA2C6DBFAEAF78B2193BB678FC13EAE8EDBF4B0386785DA41E7A56047E47217B0580DEF55F67E30202ABA18FCA15C9D2B5C205EBBA0B55B8C5464D078A43D6B5B8DFC88BD348F831DD04608D89298691835DFA4AE5EABC79FDFF7A638B2CF5484FACEDCD6542D066B8340201068226B8176BB8DBDDEF4C7EE043E4DA0E28AE99FC02DACD442FA5915B02D2F9BFB7FC157A967B0DE67E185DDA26FA72A5A35A208786C50457B038063D9EBEDC8994C5DD909EE5534ED212BAA76F661E0DE7B310E0FB38611EEDF257FBE089650C82382497479A355D4FC2A8952215A360EF756DBAD5FF1DDB4B36CA97FC9FCA192A7467D0206FF53160908D409BFAFC005AC9C9A586F538AFE59AC4B65B1D7FB1F2FA7C232825C4CC253A73FA1B9A6409B33C800D2CE17A86A1469078C83E6BD54743AF193E2CF744781A3F9FCB72034BFF6E211E74E8B382DC812051E3C3B2A61BAF8BB7BD9FB70D807D93A597B386E742FCCA7070B571097C97410B9896CB6237D7476D1A417D896D661B1CA7C2FF2093EDA0DC8905BDDE2789420025A5D0789833D8163C2A9166BF859D0B00D683615144ED03590D90A4F20F144E039075962C05A6AE509DE5BD6347062E5C12E3BA2F58441A9D117A4ED5692927CF3FF82547EB1B2CF9881F04A324CCB3F8E02AEFD7DDB443F0CB87F25D5214D194E763DC6A5075D96F6570B4D4686B02D31EBFE1A44D4F9BFD60B604C9FBB73DB7E9119D72CE60F14E264D737CA3A348D65E70DC8ED43A3FE667CB8FE6C47E14E0E8E317E57DCE2E45CC7CEF978C04A8F453AE5832D2D50D3A99FF09F9B80E8A05C1E9709E3DA02071946869CE2708BFAE1D75CFD77D24AE6228CA12D5863D1767A954AE13C554FB33A42211E58639C751DF8B0DBBC168043405A134BF296B4C1DAABAF81D7985B012C7FDFB806F86497635555AA870CF4DD297DA9F1D2A49D74B3EE032E43256CDB10257EB0D5C0117AE377C72D8FB53E1FBBBCCD0CACAC625C068D5BDF98135A0CAC7CCB2F51837EAA067EC3B100F9C1F2F4E7D4D59CD5616531B9A8C1CC4DAD16AF8651CB56D279AC2A9AFA54A5999D84881DB073A7E67AE07179FDE8850ADBE5326DCBF2E4F1846F10EC675E25629AA7B6754042EC1948EA0EC401BABEEAE8854E1F9272AC2DFBA80E2FC875258B989386A54D6D5833F4E7981B3501F1EBD6E73F39EF9FA83AD174282E34E63612E79666BE41D87EE6B960A960392ED0E8BDF1C7B33C36773430575E49817EE706A74C214528A846ECE0B7F9C19B53646B9A8B5E1E44E119961161C17143407EC92988284799F23C55FEC5DB15AEC05873A9033D6968C683EF031640792E4E0F31641A32B6D2F30CFDEDF44B0C8DEAE12F872FA42C6A56E27354C35D273EC56AC49442DDE749517F9BBE7E505E441C395410E0A8526BCADDA3FB8C2714959FEDCDCC7A8394402980B38C2CC17C54AC840A1F0D07B1BD7BEFBAD9A8FDB9F24AA2F18EA2FC719AA0B11F535FCAA57EEEAA02FC4F4933D56C18F58AE2E2693DC55B8593A3A380D467F8F10C1ED31524A6CFD4BC4EE95F4558B99BEDAE14FE986E58DBFED9A25A8663943B419A17CDF23BFEA9E34128EC5AD5A6F1017C07B36FD52F0DE7B1195DD906CE0B5BBA572E0B80C8C97315CA842C325C5BED817E539DC56F9E345D0FDFAABE0F916DB9E574B0A96150E37DEBA3C1B7BDBE1AE1F467D3625164D126B05443A2D137B54F59741ADA91D750E6F438B0A7BFD86E5EFE7CAA78020FF663493F795AE4AF8D0161B482024C55E30C3B7C5C53DFBDB45EF10126B7865C59ACB998CE97DC953EBCB34F849ED1AA0FC2F556085FB368A985DBD7709707D1DD7431A251C9638D9D3841B1F6BA97A018EC40FF6CFE1F8106897FA7F7E565C3B809C4A24D1D1B7E87C33A62E5740CED40163DA5DE425616C1DB41F020127DFFB7D30F06DC8FB951BD266C29E01798826C204308D4973D1979E017D791DDDE2EC1652B2A00E373A4A6B681F2A4C00A14E0AE25CC7CD66260F0D9A6CAF6DCB8E845FE8A202D53A308411F51F830B58FBA4822ACEFD9BADF537ABD784243CBDA133DC77343C7E37EFBD824801F37030C23B53B9187ED3DC56300A40E017002DCB70F341A406E0139CA128368C4A0B8C1BC47C7F1363DD902C5210318ACD261B203715365201815EDA63FF334ED836D3CB788F89F8209C3394A0F2F4A68200DF8CF28A88785CC5254389F4060AC0549B6BC22971037A03400588120D3121B7E1A928E0372DB9111DEC61BB49E47E07413C2D7E8B1B35E082B2AB3C996121F2EF796BE3BEE0013EBC81A1ED287612497876CECF460B1014EB61A3AFEF672DA5ACA4A6A0E42C14E7AAEAAF65A84354A41FB3A83CA085019CF04890982A65BCDA06B80F6B586B0ECC0AB12899D8F0532F305914EC013E26C62E41494C6E446AB5525D6F3443CFBB3C7633C95D4EAF3B7A18C6AFF725592DB10011447A03C88125018F9F71815742D54F2D4D46B0AEAF122F2CE0A3975916D1C2F20F338DB3F977E5847996FCD19D5EFAD65F160E24DFE4327F8ED945996938B2B2AF8079F337636C02360665288AE3DBEC3C55234F058FD950CC349856C6DEDCF37588BB975B54821670DDE3E88CE94D0098B146367B9E387FE1070F57FDD342DE5483FAED940F7834AB470E02671A793C4BCE683BEC38EAB17F21F3CBADD97F6BD20379852D599E6A2849D118FFF12F84689A12B20CE64D711F7D5E1A495CF4DD75525882CE9F8CA5000039FBCE2EDE11597B9E33FBECBD6C375E58A6CBF9E9D58729EEAD957420242858A015396BE79DBBA5D0F564CD7D5BB6480A3CC3DEA3570AD2C7B52728D69DBF95FADE194FDF5948B8974F321DB7254F757E1B70B1B24A01F05D1ED52C59A8AB43E5EA028E4940FD2DFBD08B4E5DA4427765D4A7DF0193B09235FDF118972F618BFDC54C3DBC0F8380CB0B34298EFA4B5B4E5E67E9159516EE94CB939A2D8FDCD9EC14CC4943CA58809461A1C691A1C811EFC814293B69BAD2FAB8F6E1F25465969234313D60D942631077A27402B41F6D5A70F9D90728443431A825280DC40B8E35210C1ABEAF60249914D1CE6E4E934AA4208835FAF960035B8A824764A3B5C5F1CADF52D935C51181312CA3068944FBE62D2CF637527A165369D86517D47A381E9FE99D78890403C818A7B9A1377049B93A4274320F75069F08D8B60E98701E25F1BD34A0E27ED5734FA9B60D901D9B219462D146F3D2EFD949DDF78193F15011AFC158D8F04A86D28D8E55F3CBF041DA30587E6C1E642375846CCD1BED3FEB4ECB8068D0C1BBF2F6E395C88D20440EDB0D108CA5DEC47156642871F72341163F09AADB15E0F62E7BB00F2C3CADFB98B07B413AF37A3A7AD334DB563B39C2F95EF518C5F139FD6E917DCEABE4A5F8297EF009A16C14209826B719291FF8E1C2EEC11BE3E309D3F34732B555C06E3A2BAB2E39D605C10F4118C118D98158B901A088BC1490CCB3EF23EEE459B3436B1F1B420301C2498960F3B9185759407E5EE0C824020100864638F598CB078E4F387C6BCD80969ED1D06901575A495D538F575E5601FD35AF69ED76C422CFCF6F8AC4C3A37C8E87CD295D746D6BE9FF54FD6CA49A99612FDB800B7CC9F3975E321578B3ED90DEC9A858DC49EEA71255F56D645986D94B742A85CE7C78690DA77DF4A77DFA23C628330B1B14C8D8FBBB4697DB4A632054ABFE3F055F1BAB6CFAB62F043200E980E331D6C0A698BD334C1A7FA247351BCE5B66CCED8A97069F2AFF366C65EFA0F40C3C2E0AE20D33B23AB2A2EA397819BDD54BC6DEE812A5D65F0DFE1F169B0F791F7DC05407FB9A1D26BDA609D45FB097EC5501BC8A5B5A19AE093FA2F29C087C8115F7F4020BBCD01486F5E1A2160E08EA99F21D7381BCF36C1394ED298D33920C35CDD92CF5C2DA0DCC8FBB1916815D0467F073B94EDAE7FE433BDBC465FAD0B6D39E09479FB592839658F34D96A89DD09C55B4D9C92ED4ADBD6B7F1FECFC162D89431F60D3447A75A8DE679A698D326E6E7ABCE000663422EF34848BFCADE2AD2CB5A8E63B785E730523715869BB6495426382890F8123C087A330D211F3C2F3E6EB41FA40059995A293FF3B0B23CEB2A8AAB5857D4D4571952E74E413AD737C722D4FF4F27174DFFC43F001E4E9626DE449FB1E8FB9E4EE02A133E2385374A28A2DB92AFFFF8EFD8A3B6EA06763A6122DA10179870193D5BBBE088824E4AE54D50BE462DDEBFBAB7E904279AF310CFB8AD00B2C460B8B90B5482210E204E2D9A77B3295B59B2F8D482291C1B89E715C5916DF5D6D0B7C6A0D8D0DE9E0D28D1E3469D0596905E1B14B8B51125BE9ACBFF6F2F0BC69E8AE75D1B6B391DB6C7071EB815FA086E8C81C09DC5112A051C8162F677FBB33D3552BBD4792313545AFD826A07274C6B3788C7619D603942FEA0CCBB890AB13BF95F9CAAB64FFB242A9CC41F4EBEC63F3D348992497CFB5EA37FADD99818ADB197385DFF623B93BEC8AC31C1AA019595363511E0D8AA9A27B121E0E8106F3D2617D03035F264EEFF510D3C24AB03B2F00A8E66068BA29921A8A96E5CE14D62275CAA0658CCF2F9FDF951E6364BA836B0747AA0E31720D5AA91AABC5807A10FB378634C40E9E5B0C176843D1CB9C454DFAF60B8FA7A13ED52664A4DCBD6FEE6A5C9BF4BB40B0042D65F98FD0B9F8D625F58EB9ADA24E0C5D6A8A77E36DC8108D9122B2A7CEA5DF7159F180D39F96849631059FF674F1A86E1A2817398DF297C280B2E4A55C207A4D8E351B7BC8AE41811EBB8F1560C80F7366F15B9D281D07826A69F723FC029C0671185EB775F8B700E50B40343B4CB2A596A658EDF3B752DD9479676D6486CA503E10FFEB60E2D627777C2854D6EA7B4E91AEF16ADE2B7B3418B39CA02B3DF4A5D433CAABE1F91A2E27F2E1947C5DA61D1DCC5FF1809913389A9A2C21B72782DB1FB5C0C67FEF16219B3B555C5AC0395E943F9595841BD37AA68A63BB66808429A8DA6D451453BF397704CF67BE5CAAAFF62F2832D8EFC29F5CFDB6348573FBEC36D1BE32450F1DE424CCB5942D51178047CE4936F6F23B55F5F44A3084B4F47641A7C08DA39E97435E22D7B4B9E748741513CC1249B28F27FAC06FFD32F2BEF13C2454F35C5C47DD8E8A8FA8AB9709314D4A39D31B38E42E837C7818AF313C6CDE6186CB5F890E9BE5E09E3760362132FF27DA7A6E24A374DFB31A1D488C831EEBF742C49733EC9643468DB20AB349AE2386401E9F389F2F8B4EB216C67B8D12F14F46C44E289EB51F16F975B534C3FA1F8925B143EEFF99308CB1B201076150C6C9198C3B521B1F5DF88B80EF7AA341F5700CC89490ED7B063836D913EAC7AF87B850DB99647781CDE3ADF8B7F997931DE64F8B6EB110DE18F221DAE12833ADF11AA5807F916DD3C708E1D1D71786FE3117D63DBAAB5EE29E066F34BAE29BA0E57C83E73F4D5F70A91BFEDCF991DB13E5F70B8FE05B5E9FE8A66140D7D5A819AC7957BF1A8F6F3B70238FE9E562C3322BC6963146E9A2324FAC140D408A18E2D0E5E16915026C26951C80F050E3E88620EB1DCFEB7EC49C33EEB30000771276BADCC3CCF828B99C8BCFBD5CB93307C4E8E12FB5B9BCCF8E537F51A3D789C625CC6A26709A89A3C7586B34FA5BBE993FDB36EE13D30684CA5558BB6000390FB27F0DCA9F6C2903BDDEDF06BFA6F0D0E49F703AB53A9B9F18E4AC4C38FDC00240EF724028226CAD7CEFF48D4366777A9595AFA6C3D2FAB364DD2DDD4C2BFF8DBCBD744AA772308A82EEBB82745FD0E47AD2252F7D9C7B13515AC13FEA7A5A1FE49A8196044A711F2C2EA4D93074AE44E15AEA787BDB287AD9301BF82BDBD5CB087B5BBB32D8781EE80C240B445571756CC7969CE1F322E936CB7D83A10B9197AAA2D586B1AC576272D689B369D1DEA297A15C83FE4D73CDE4B1088415695C2552904538D471015198549EFB9B740E2CE9370C127F6F021AF532B8B8BD074104326FD180A13219875BE0481877605B0B96BD817104813D2F739F142B71DFE32328CD35CD80EFC05717D34CDB8E34594FDB2AEFDED49FDE57331C7D2F744ED099AC6441289DCB61128E9D7C6B01F0A8CFC345C6FDABF1AE58C976D080DF17E18208081DC446811FCA415F522ECEC993A63C7EF8ACAFA438ABFF499D1F86796E71FC012C981B2D97BB8B1865B5B0A973CE4937117076CCFF0B575E485FE55F9CBD29AE116F8A682AB0425F1C44FE4ABB7E0C837062B0FF8844579156BC9AF2A3AE8BE761A6CDA21D34843A446B240C276DF02112F34E876F9D87BA59BB207B0AADDB72208D822568868E81E77C43534BB27E6F32CFD080A7594F7F2E65B66F397BBFB54962A6196DC6792B58EAA340BBE7098D8EE5BC7772D22A3C9656795CAFF34690A9A34467BFF51749D4F5F5A7F30C9A3A716192AA46117A1381EC0FCB10740DED9F9BA46EF8204DD30444951446CD48BD2D356C018A8772663FAAA2BD8C36D1CCA7646B7883F0E088144B511FBFE36FA1706E826E49FEA1959779F97B8164D0D9574A20CB8F904200ACF0F2B23210EE0DF5F760FC12651EF40189005FB0475455E77B76A4A4C452BC9496BBB7EDD8A050C3BF8706A9124A6FFA74DFFFA72D4AB2EA395A6ED935626A5204C55B8FBB15B7BB83721FE0878215BFF523AD6334FA087EFBCA4EFE933B76C2561D16C7C60155532A3578C9843D81F4FC0B3C24B4D40D9B1B6F0B44E39878AA45EC35D4DFF066B22B02C3778414842DE97D9BE66197F5C86F90DF3D2E3AB5CF6309FB4735079AEA85AE173D74E962B92C2439F6495FFD140149A1F2C23C26C5A728BB5F93823CA4E930ED568334857437F999DE5D0ED27A2E59B78CF622C60CC020FED2918B270A6123A39EBC09A568B24653EEA0D7DDF3A99CD2F8C17BBEC847EEE20A6E4E9B22B4615CDB16EB451B6119DCCCB449889484213C5AA9709F6FA7FFBCA61BBB363EDF526442F661B7089B1362F78435B35AD8EBE0A7BCDA3ED7ABA3B10DB486580FF175DF16EA5289C93185E0CBF9599C295CDB4E074162942010C7C67A07B1FB7AEEA330BFAAD917C7322E98D499FA6C28F98F71D2E734EC10AFB1240689A92FA29BD539DE4EA222861144CA6478DE6F4F350BD4797EAA4AB351B3FD3384AE304693507D5EA6D5AE004DA1F4F0B3A8E46E27E5B7C64B247E265D67B0814FDA13CBD7FD20D250161851CB4E73561725215CEA91BF186D5DCE651D3446FF7C0FF662829C4782D3A628ED01BDF3A6EDDC67333E90DD3045CE693EC9B8A4756CB053B5B694D22267B1A4AF5D06D7C3406C80F964BBF7CFD42202098C5122874A3989A13F4084A9DFE4A6228689978A45A891602340398FC4EF2230EED34B2DAD8E089F991B254120612CEE34CCA06FFAC94CFE92D6A7DE76B22D3A74144D32002E3CC566554BB3099BD69C9913D217758BECE1006EA040F7F773809636EA0DA40069892D37FF161E30AD8345488A9E4CD36C777F17221CF01F3602764D80BB2E8CD38D19EB92E4F149619C40DA8F18EDC55D136E02F392F997D59F2965E6B13D286B1890B4CF90EACD772CAF9FE13944FF6F647EB0930CC604F5BF25A1062C230E046B7AAB4D0CFC3E67876C256450DCD99E0803489C179A6B7F18F8DEA1EB7C871FED88237EED20CBA823F680C9F7BA8C95EE5536B1A15C3DD6AD1FC6ACF2A76A37D7EEA0A704931C8BD8894C07954144EFC4DB1DE046C57F3699BBE536E13977C861CE6A70AE0078270279E639217BD89390643850634C2BDC60D62BADA28821503384E38091AE7DE8F389A5C2241E9BD90DFD1418AB04F6DA47CEAAC2DA32C9AA83DA7296712E9F7EDDF408B967F07545DAA00579DAFC450958FED923F8BB528515759ADBC83FB214BB37A75B564A5FD7BC8A3D1BDA441EE5D485544F5B4586B9A001FB3274220E166E7E297A04E48EC99004C40D90841A5A9C40BAB63407EE0DD0317D500C232359E23C835464D58FCDAAA68E55CA316953D1139F186F5F0810EDD5AC1049338648F464E51FD75952F73C0CFDD228D48E987013DD9703F0C1E86828536CDF3D3E71D8DE1B52258C85A658CB39E7EA027351B320146ACEADF5F77554D58BEFD7B58A5BC7F902F6E7B4E97E01561C833A299EBF82DD589E6A6719022ACE39B331A6E64A1598B899413B207E5BE58E6AACC71056F2C4EC3AC84EC3805ADB7F1BD86BFDDD07845E570D370F4AC6460B1AD69C2A30F4CFC35B01C5B118ACEC9422FDBEE22EDA0F725A486C3BFEF7FFD8B292672AEA62A1548D56A3A611B4505453F0CB08208CF46B2A3B23BC6AAF989F36BD753D7B131775FD4BC54C77C3417BB7EDB051CA35215616A14575F630DA2F175F1CED10F7EBB5A49B40BACB97767C5AB85484A115465A32234ED24527FD8EE27758AFA3C144CDE76040EE5D821A2A479261E1330E812045F7F6946EF16B6EC5676969B732022D31AFF1AB911325C05B5D27F3D98B4DA61BBA15F494E788B61971840DC2E31C343C6738B59084EC31AD7951347BED0C95709CE90630431FF0CDD8E5E738AF092D910F016780A025F5652E154582093810CAC14C6AF65CC03F3EA783E6FD27AF3984B632D931198D8A930A42D4AC7A139E22028FAC1409352C6B09F66C1C294840802D9F5DF129E6F3968F0F71E3C3DDEEF4ABFF1D52601F9F57741418E96CC05CDA271F497B26ECD60CF156C554403FD61AE6F9642B3557043165A3ABA1997A57AFCF1CD0A036517DAD3604770CCBD99AEFB74632CFEB9EA3D5CDF817542EC1814148F7025BBC46C0BFBBBFD8AE6C686108C2A212126B4CBB1C71915D31C827BA18F3B7480638BD8B2E0A42A8F85773FFA5C407EC110E250D6865E5FFB7DBB058036DB527A4738B0DFA8DD0269E07AB7E6A1F75A635601A851E183CA07556B7FB71FEFAC4F31602306ED85050F2B8BD92FF2E4FA6F581A32175FA8FC04A501322D01522D0844FAA4774C34B2BB448927526557F09DDE9E62670B7102971ECA2FA0B309B9A40A8A7E18609A9A7BE21EE4DCC9378A67DD69DF71FCDA15F4BD3D8376B8CA4FFAAF7C9AE01C60A71130CC8BE82BEA7533A594FADA239C6D85699B45CDF34F116E40EBE98527116EF05DE325E5723222CE028C937889946C16B7C30F7BFABE51C5688AD118230F093D65D627B04E706CB16EF5022F3FC0E141B97779C1616DFF5D83F5C7C5B2E49DE4869F3B6589BD131C857F2EF5E6F8CC996CE964D7E1844E0F017A4240459AAA142067A7DC115E96958052129A587472CAF85EA42503E47DC042190FB78ED6A4E12EAE7C6A212B483A5A67FC0BE92624FA6180CD8861EF7A355F7A13E134E3CC91709DF3F0F79D09CFBEE573872726C9F43249402AF177681FEABD501F30691AF7FF2FCE9D59074C84A9AACE15CD9EFAF929AA8C8E414EE3DBC4B987EC1035C39A467B8720B6B27EB656EEE38EB46AFBC52FF799E2767BEAEBAF9F270ACF0FAB84421CD097020F6135AFF87E5FD38FD487DD7BC9CDEB5ECE9297593AE83CDB5E61A1940CB8745B2D79004997145F7B5B9440C1E3CF9115B2F168F7670AA727CE9E73E5E25764D5502722E929E42D3025BA5EB64144BFFA8CDB456CEEE59B335AB51C78F082409B0D35DAFF6DF66ED5B9016E8F8A370313E7D2B60929E1C71A44C9DF37A8A01CBAADC139CA853B7D5E274E1FF1069180A34016E46840D16B8E1AEF66B5BF5AA127A712423A62F6470067700B2D5D0C6215D347D746D709CE5C17313105B91EF28794236C92685EC0741CEA7DE5E43012FA4A3EEF4ADD605B861E743BA339C4BF4EECF4AA969353F38048ED92E98384BE3002AD72491FCE44C5983B46DACCDA4BA09038E7F4EBA6CDD31E2814942A2E4A571F91F51C8A7BC77EBA21EC8035F52DB23162426D0EF578F199EDB69016D53EE6BDFEA87C7755FBBBCD4404950A107415056AEDEB889FA06D8F5237A0609AA5E640C8F112738564FC79FA03B8D59B93C0C766AEB5B8854594EC348C76140BC031E75327FCAD6D37DD782FBDEF44141A2FEF80DBD047C87A34C25A2CC2DA607F8CBE4444B622C3574C241D7077D4185BAF3A214E9B0E76CA04C9224656E0BEDC6789B094A67630BEEFDE722242916653E60959C84D5476C6A1103495489A6A1CB8BFE08282C17F03032B0C130BA6ECD2A116C214D0C298367A9FC80EAA4405BC42B31D1623876C23187F19991BEFD4C577425073BAFDC6631EC894B22BCB20D31844C7C911DDA038A081DC86D537CE46912D86C87F8C1C3B8B476E7EA11D9DFAC30FCF4DACA85D3263C0F7B640249E5C52BA23D1A6D7458E878DC3FD75D3D9E7D7CE6656AAE8AF0A945D908C6E1B7F1C1C3E3E486B3A8802A872FF512A9C2242A64B8B6BE4AE3FD0FF71C3FDE9FBE3D411A2F0FC60432F7D9B9FDA57B6B3F7E3CFB1D58113D4A1B1D6A38656916EA44DF78CCA2B1538607400795679CDD51ACFEEAFA0F7601C198905A36D70AAE642CC3356D5A27FAE34872ADE589066E823A4211AC2118B20C32615C37073902DE3EA4FD265A99CA1FABC50B26F72815CE41FC8ABC51D50ED272DFD2FD09A0F9AC38CA2C0FBBC7C2F28C0202411154E46EC54715A9E86F6397B3CB4CB6E9C888ACFE620DDBB9B3DF020AB21E084300C096DA9C310047E65F689A5636BB8CE343E71E84FEFE5FCEF83F7344D83E494A554C388BC07459EFEC4E820EBA78E262D5B76F678E971135FB1F40BF69683ECD206AE245D79FAE4E8228DDE16FF9792E1D31B3417E23CD954D76EC48FE53100476CD9EC14DEB463A0D88374E5F80A22D66C916FF973521A66FFF58F35ACEC81CF9209853CA42ED9AB15DD09333B55F30956CE4112AEDEA6C0B658E876647C65FD60205E59C221D7674AE2183C1EFEC3CCB257C880964C3170CAC461E10BFBB75485DF004FED34CA28CCF16CBDDF67896414592E8BC8BF64645D214E45414AD2714810F1088A0A1F406FF69649259B2172BB0E6A5062BB9A25BB24027E0D729DE2DE9D62EF6667C2B5F307AE265AF82C272FE78C2AAEE2019CEA3B9A479DFC5AFD8742D12058611E3C7FC1C5FB9A3EA5F00012FC54814258273808040702814020D0E2CAA78981CFE47A11E583E5DBBAF1CBF0CC60C0B1BC8054C7B550969502B33BC18346FF061906A2F4E736EBD455FF966CA6C5162B0AB7DE8E4F52E81B9F83331DB6791C71BFEEA38200BEECE3B5032D54095724BEC193E9B3FEAE324B0250FD7F7B56F1A7F05D2C1D6570256C42B4DB06F21C321EE8608683FDA2C18D76CB9569655DF40947333B2B829EEADFFF12BA9564DB4CFA060886E29AB72F917DEC846BA3DA9728658BEBEC5B3C3415A6F71A89D6D9F95F27DB896D18FDF677F1490F3B50B0113F1E7B77633CB57F8F36474F0F99F6793D0F09DE0D0BB9B3B402383784018754D48F2A0FFB25B7F9BF7495F510E453A228CB988B2AABF6C863AE0EB7408580D27FBCFF37420309BBB96689592E6056B24229E7444CB07EBCF3FFCC45F97A44AE157BFB353E42210E606221C9A7B4FCF47DF3EB2D1BFC5678A345D8612C79E158EB5D75ECEF5BB0D121405C43112F856B201767C39B5BAB2C3C56A21726B8FC030F3B809EFEB8F261E89B709AA2A934845E529EEC10CA8FE67E62308001C1E2457E4D87FE647CBAF05F750F32D958D8751FE286E7774218196D9D54D2FF011EA31886735BADD4A49A555B573816D8A5FF92369E480A3F0B2F890C14B5ACF7230D4D3C0D4DE8AE51F1B0B7F1ABC40FB6B51DEF621368E3AF3C0740A04ED4251EE42CC7A5E8CA68EF65EFA1696B6FED517628BB80911BA68486F1190766690B37B74CC8F72906E03B805C9E2E4DC2A32614D17549380849712F9DB64E0AA2B21A814D38FEC0A669F8E90CFA50F50DF41C40E7486E8808F839E698DD38F61F2E9837F21814942BD82A36AA9A1021E72006BACFF4F07144137D23AC10C86798C08AA196C4F65201E41AEE0044EE4BBC1E0DF43E8B01FF394101DDC735580E14C06A7A3BADEF2A8E2D6AC4C02BDE4E1ABDB7CD3B37806DA488EAFBE7B797FA884C0393CE4BC50082F1C247F28098ECBBED6D0250FCFB5E76492E1471A09BA2C8FC6294A8A369DD83F2CDE312F7A1E493A681BF8129A7349ECFD30B40F1BFD4F23C021A69FE20C53B00B29B73C0CC03DD27A24351FB22E815D2B0A0EC87012768F795CD1501D4DB157F357DFC6F4EA5C7387A3345E90E246F90835487AD7601361FC2BEBFCA7A299C1F3BA6BB253E23A90634A0A1ACB17554540766AC7E17B34C52B75211323FE3963FCC3B3DB389AF511027801E0A722C223151F493965AB85B28F37D8561B98CC430736672A8E893540E53A6F073198C65D7D5C703C7FD492A0F2AE1185B1EFBCFED5308301135773A68EB295E8696F40EA52D154AF44D996CCBEB0CED6F3EF28693B53D1CF7263AC4D66E7FCEDA0F06F4EF9EE9D1CE837DAC64C254F9BB7FFF1417545F4EEC266B5FE527804FB4AC2C04747FD2C44FA32DF1FCB1A557C3B3A8F8BBF2CE3CDBE9F6B8DADA511DBAC89FB8DB89840A82038140A057F18D7F62540790771234BD9FD082D4CEC7097248649A633F85209F4133AC6BBD977910D75A644DDEA05AE41853BC67408B5B256721A6A337E0F65F7B9ADF3A7C5C974A035BCACCDD099A407E232A4D4D1D43930C4EC68F2FBD4F5351C909471E5EFCC7187385741150417A790047FB95920509C5DE2E0ED1F05AD577BA3B61EDA3C80AC798010CCAEEF900AF4C47A3753AEEC509F93C6CF424B405B2B94F29371F7BFA252672F02381DB68B7EC820AC1100F7C7BF3ABFF743ED59AFDD10BF75D72675E69896093CAE88850ADA1BCBB516DF633C0A44861545A901F797730EEC0522E6D837D96ECF2ADBE01759A97E3668660111E53830DA18F605DEBF7124E2924FACC9F3D8B4B7CD3661A8C23AFBC2555247065016DFEAB9D20B47CA2E6040275EC475EBBB48202FE27A492FB89690C2EAD65B05F32DE76D77D1418A5E8B87DBD3F0F7642FAD99415D4B3CDB3D2D7C0C54B9ED90ADC2F8558574B717A297F429DD61611161B7F4AB57E0E42B8D9037CA6265EFF3EC2C51B62682BBA200A2F29986921FDD47148E045511768C8EC88C72B01E3421FC19831D0D45485692D26FE97953DCE7D478ACF774ABD32404A777D5B43E7BD50A3850F8C72B07FE33036B22D5CFDBE1B4C5430A87C5A787571D87DAFC5443402FF52C41A1E726B5A87A8F0C197F42A74989941B2639ECFAEAE0FB0211EF2A2C8BDF5AD2E6151202DC6EFC9CCCF582362FBE1EBB19807940A863550508C12FBA4573CE388B1B49FFF9C45EB84227455DFF12C8F4AD99A67BE224FACFC0B2DF8A733E0FDDCD9D3E88785645F99B9F5CD1E4474F119E7C2D8C60E3E3E879A609626BA138F066A86421E1A9A7F5D3B5AFEFC4067D6E9D742345DAB0BC12129EE9B55700B3795EDFD1165C09C7D1D4FDD7B6065ABD73DAD238CF2AFD1F0B37C3ECBFBF526D7FB57F9222146B99DC0C53E3FC074E30120757FEEA37FE4C565B052B44A1B30596D6374D8A156E519582B0659C897E536FBD9D577A67B5834FF5AFC35CAA9D97544003F3F041D54F32CBDC29788B846AD971084578BF6100FBCFC7A67357886483539AD3A321643DD53333F1E3FF12C6C22171633628B56D201AE655853EFDFC71776BEF8323109740A35A32AB298E7D3D3991F5F0F0712F5C5AA102D0A9D7B390DCE7FCE68B486D10A7187B2EB5FB63DA79F3141CC544D190B756DC2D5C2442C1A3D0BAC130E2A8BA39CF374C9CDCF8A08603DD6A05947405AF361AF3CC70D1B2E6E1B011B2E21213E2E6E1B7E1E6B1E217B015B011B3E7E5B7B012E3B7EE1CD07105CF4F1A1EE41B27034EB4B26918881C45F312EC70015DB19407CE0653B055123F5442690F27CDA07728FC4FC8A6311C341D40F06BA5C97F5F029F73BAFDF50247CE8A4FFB6477C5B1AC4E521DE8F923FF14DA56A069408D2D5754E375E7D58ED9CFF3548B6E62A955192370D903E0A7C3F2BF4E568EAB8EDEB9CDA1BFAE011EDF6E02692ED437B71761EA64362A53CCB0F7E3A8CD2F78E06F07C8B3B87C5413075D1A13940AB73710CCD2FDEE12A1D92F50D5743FF3A9D3F7C6519D100651C722696596ED08D0244CFE37C4424D415E86354A7DCAF22D671B5F5AC7CE4073E38017B938BB3E64A619EC907FAE009F34EA945F57015BA7FD0964849F0694D079E3E7104197778E06BD5F5995356061DFA7FCA851419A4AEC997E01AF0DA157630621A257FAB7DDFE7D245A00CFC89FD620078F2C879851D4523EDEDC1F0918566954FE4F85FA57476A3130E51263D33CE0DB47C18DD3EFE38FC0AB3C73554E70F5ED294D91F51E31C98387AF9308B3823E3C846FBF2EDEA99038B8F874BCCE0BE6AE32555A650D952E803B7A87520E2F5B56CB015EACE412413BBE577E16FFF60B9C5F17DB9550741A12FCE25059EB678562D888A72CEC731EE94B8E6DEC4EC00E362BFFD634C48BE9477D89F674E5A6A7D64B95791FF99323FBE64BA342C964C31952A0D9C9F06CEF9A58687C522BED4C162248D52AD215E0EE29F52FE37EC537582E97E3173A0E3DC6034235DA1C95C4F43F3EA94F1C83ED14FE56416025A6245E669B802138C3FEEF7D11C410C877E18A0E0D7DA437127379A889D62E0F6F995FEA0D478D946B57EF649874D4192EDB709A019671A545CAA2D0757A7139BEA5DA2AD8975C520E2D8E8FBA4B1E360AA88FFA21637E5BACB6990478B0911C9B2ABAB5CD39344B550D00FACB9282A841D32453E37B21E829F106F4FEDC7E05229BFBBDAB3FD9F18DBFCA1FBD74A97F932419C560E3B8F9D34C3AA2653F2C1F98F0180CBC95D9E8AB7EB0D91CE92171B9D65C68B01B7EBF5D262AF22C7B8FDF9FE27EF6D4C34DD0F111FD83E8DE7BD2233290BFA497B3523FAF60AFD3A06EE8701B2B9BB8C9EB8D59591883ABDD2E77E56AC867F541B7186BDCD6606CA6F3AFB6D00D968AD02CB9F34713892ED1B5599938572881741AF11E72486768F47C40E844D201008040281B5A18F60F5A8DFB1F7A856A52EA66CED8E4D02EBD88F590EB267D37BF3A2629D4B051B2C78DBE94B988B9707C8A545ACF3E7B0C85E465950D607CEE6CA4B3FB34E9653FDB2C56DBA50BFA6BD2BDE4E5B604425F514352518334894873502096022A298DF31D5FDA765FCD9CC54CA2C018781DCF5435E77E2DB2E8711B3E9A477996C329A594EF10A5017A18FA87331D8D4A739654362212B22FF5B69921ED5CEA851909B7D2037FA88892A4853FF757E70A172A45238DFDF3A9CFE1D368F898B6C44B15A839177008A87BEC051B19DF83E780342B98479AFE69619F603C8E3FB74224005EAF89601EF70C415EE109DCBB7D01D40CECFCF0647DBFA6462746723CDBB7EA2C5A1F9B9A64FC56523CF2AD3A276A01B16AC7803817752C7482CB3FD38F0B12C3C57B49A16DEFF2EA7BBEB886E95758C9967BF0F1A3DFA255F816F1EC19730608CFA885B8E825C96DE9D0BD9587A5554B01888A9C547E4FF7154E8A3AE15980BA09A07ECBF45EABD3904234EE5472479137E7EE28C7A3879F9CB57A9580E7598036630B1A6D873A4E737B593ABE1B9509B6D94910FEACBED75E83F7A5C9C1B3FE5027D5AA1C1497C18222AC24198FA24228B17AA4FF233F97CA11953CDCAFA1BBD4840CA377F9BF9817744E120D19A80E5D57F0229C95F0B2229F872E94C1995DED65E01D7318D0B9A2C3444CE0E566393018E6B5E06FE3F45E1A861C979DCA0F2FC5F5800D833B57689A98FACEE259239F5FDC4413B69966FD7C5FEBCE1C24D2BDF9CEA27106319D1823343F2EAEDE33C5D9777FF1FB3B4A043C31D8EFBA4970BEF57E8E54760C8CEE58C454C86FDEA756B13AB938AB9F3F54760D63D43BB6B1EDB56BFA2461A40DC5B96E3957D94FB6E187D06A5866B37448F8FA38B538D5937CA40841EA16E02FFB0F2A262BD97557D7B6F5FDB74E30AE87DE1462D1E3EC5F1ED2E3273F2152C010E1923D75A5D729F371C17F4E4458B1129509D7DAAADA81FB3A947576C85D5FF01AEBD873C4BB5E3A189CA9BA7FCEE5B07AF1728C1A7BEB759A572C0FCF46100037079E654FF0FB5BC7E966A527DA81DEDD86F7375A97A6CF520D8341C8F14AFF833F0C57CB2D8179892CEFFB5B3A79DA036F6806F80B9B8586D1FCD3F77B9B4173D080381402010080402812864F469EE48E834338074908402C2A6C7BA108ED86388CC5469727D00EDDC407327B82EFEB596808FDF3FBCA07172301FDC9AB27343586286ED84E01AB073B33147941FF88252B283161C304996E3CF783DEE2C8792992274714767DE9896D81ECFC107F89E5CB912BBB97FB88B09B818DCD05CFDF2604F33F31E51C15F15D0D6C4AA6542CEA018CE0DD4838B8CA39D2D12CE4A64BF43F0C960E9C0FF39CF851073F2EF7C225CA45235AF83A94D117129D410D4A22B82918FEE295DF12D0C89EE3FD2DCAB054994A8E06D2571E8CD5F20B0E9A9D6EEA73661CDF7958DED05CACB3E8FE00FC736B0FEC0A9B8C7D0EC9EF44E34E12A868E5FC7AD3FCB49579854D2A30CE32C370FC2DABD13FBF4B0AA4BCE4AFA039ABCBB716ED2A5ADAFE32C50AA68E87D07930D4D50FD69B96FB04CF997D3E9559F6F6D4CE6C41ADBB8EBBB5D88EA986BCD02508542B4BBB421786B998796A87D2995CD3917AB9E3D6427727F3F9602CC666AA6B0432C93D64B512B957453D58D74B04B84D6424EA56677428FFCED97C7BF7AE3E61E56AC70830EE9926E0F791E7BA3A2E4EE6F3526745AD6AB0C65A6DEAB1F2D6B98E0A9E0F0651B01FB3D82BD61801422BBA9A5CF7A350BD6743D537F46A7D58555899B6D33A0C9E9AE7A67E60302BCD89245659183186EC86EA40F7F3B617342BEDA92A043550548BB07185CB25D01E26EBD96CB1766319323F2D322991EB3EADF8B5D10E2A6D666ED84D07FB6CCDCC0FD0A1569B9025A41845F97B77CD20E6220C3957297AC38A11B094F61D4FBFF03C0A3E39DE77E3DF86EEA4919F2949F158BC6EB5DD470CBEE7836CC47A1D8E63D0FC834F5DB89C5157A8FB0B706770578D8B053E38B9E43E165A8DFA71D64E738A2816AF1EE673238FAC3E4D8D1B21D9ACC6C12C2194D1DE95DE27C6945D0C2BCD3055060FA392E1F3E3C658FB52202268D23FFC9C0EBA83E3841F57B0A269D17DECF16E0153A35538238B3DC1CD286B1DB626763F42D6C8D2B29C964564DBDA0F767091FC0E33D6F43EAC0315705B99ACD45C444E4AF6F0EC9194548733CF82628E5E72C06A00784E55D54F3DE406684EF4D4DB1E0FF72DA652478340BD656D65DB92FE395C16030180C040A858AF0B740FBA42F9905EA1752C8004B451A4A689FC40232D3A2C9F501ED8310B476827F40B7D91AF0F1F6871734CE27BC07B7A1A07D10222C31C37612A6FD22A081E68BF0A11007D860737E8A1E550B749C13439143953E485B06C36D4E2C3CB66D4286B7B455A60009A9ADFADC8C6CDEF9D1E76495D2B27926DE096AA1F1B2FDE6BA3F5F1859A99AE1181E9A1007F41E7493E381D84876FF916DC6BEDAA3BC0E5EE5B5EFE8288E7C2E3105B737F2ED0E9EFCD74440846F2FBBA595DC848C4D8C5A382876127BF68BC99E27F98F00CD7D8FF7DF6B159D883FDE1F4D00E70099B548D36C464D48A2E0421F85A0E160A2F61C9E249D07D4E373A9E425F462E5C1BD09D3A6074AD312D30D947EAA70F6FF6407F71662E202D20A147E6E4C80F4F2351EABB755626907983E31415461F726FF75BE4D7CFC16127CAAB02B2E8C6D0E600B7AF157FFD9F8A928D989683AF8CB618BB88B0C3F2ED91AC8D09B414DFF828EA9E156A18F708BE8BAB0BA4A3DB6B3D99BD9E034BDBFF6EB2F595FC2E44A3C0824AB9BB913D103A8378CA841A04E38BBCB10F9795921370C7D437FA92101874746DA7703655F82E3FBDE8178E58E6FA4E6D42355E16F239E2923EB493CA56987A68CAA86BE319AFF11CB155274A3335D2F772B79247C0DB406A81308F8F780E4E0D5EFC5B1194522A20A6CBF2A35863208D24BA5FD6D547F08FADB991430E3FD0B0C82834306FFB3097846008341041030040E8A08828783274C8564F84A875216260FB84F8FDC7DEEE11154487EF7061B81E0AA6C47303C081B8A0A062120822010A477E9C81C3539DF84E69EBA496D7059D7D14CE8E0BF0625C80F99C6C1CBAD0A7F52A535237269B455F765CB61F0CC945D3A890348DB07BE2D2BCD6FC22F0EFE7DEB846F0277489C8B2E2EDA2B9F9DFDC053032A0D298BFECC25E4D9B790F7984DE41111CE2BFF43C0FE647A4D7BC806B8156FDBE75941923F1A30970AE64C0E567C7C022823ED9755454027F25A27FDE62BA61E054ABAED8C9F6142296831522912ECC89DF02645AD7B6741210F1A96EF1E0DD6D0F3506D1C59B68BB18D042B6F6BB5A4972928121E8C9037A698917E8FF61A5EB1D33DD1CD9A787AE7EB707FA48E1B9590F907A45CF9BC26526F633940ED9349FF078EA481E9868719B456819B1DCBDD6E82CC04FD84BFC21AAC95EA2A70435BB53FEBBEBB30B4386C75761BA195652AAFBE0134428AC73B6B039479864A377AB3730E036705BA066202BFC6B9A776F98FEB31A8D11D650B31D58FEA7DD4CCEC9CF0E7F0114CFDCB0C2B0F8ADA83C8283BE4C3413E10D2F62662CF0E79EE38DB0F063EA26EB265972B27569A37576419DF12296F713BBF220F2438226E7E95A178100174CDCDE5DD1404A58995B20BADF6E5605CC8924E16AF239A3CB1A5447F0FE1853DC1E46C14AF713C12365FEBB9B91FB1795D875EF96E311D8588FEE4249B54D7D8CFF0D7DF97D8A7480E3EBA03A20772FD38EC39ED84180026694E263A8F733532FE4DA83ADB1F13A6330985048788FF4949E276555E849F3BA10C0A975CEA6F3EDA7850F6CF9B02F7C9C7F2BF0794FC57BE29FB5709EA394A10DA85E4AF0DA13B00061E5EB68CF6D83F1BD79A4971566A8F2C711FB8703ADDA06C18F4CF7D50C812250744DF03799154FC967D5D11286FE1AFFFFD9988368B993C98F3C850EB6B18F6DE46421C7C2D3814E281A12805CACFEF9DE0023FA3BA3B2CBAB5F2E1181EE5DC5B7FDD521973DE69293F80229FC99E5C2F4FD64EC0C923DC9D76782DE56773A0A440C667D16FBBE441B0163AAEDEE843F127FF1EED9193314679F8B510BD1373B4E03CB12B59D4D877A9C558F4413DAF415D02A2508EC152FE4783C49CB54867F4DF180586D10E595557E692910E092AA7291818CA983706EB4020456313492B6B77D47A596ADAC6D724292C7E7EDFCF3F7FAEA8AC5537ED1EC7835335A58FAC1583BB2EDB8E682B03DAEB6E342468A8204E73A30F3C18F039528D742BC249CB0D5AA1ED1F5EAE54E41C2470B87B0C0ADA19132C648BC012FBC0056EDCCDF0A2ACE71C2E2B9CF962FD8FB85DE69D0481A3632A330C1A15DB607F6E6BC5350744461C70D75DB7A2B78423B733CA4D2AB3DBCF79CDFA622B56883550623D343FA3F62200E0FE692711B0A4DC934C19FDAB21D2290D6282FBBB8C643301DC3FB9BE2590B377C26B6633403E4D7C847866E05A2FA86DB0F4BC394E7FAC8EA0A0B9595D5CE074BD37EC9B39A0A5AED62C889ED119879500DF180802A1F47F1995B78E699A0C1143847B04DE6632FBBA0A5FB2FD10FFA69A52156D3F3ACB03E4AD239B21CEE40C217BCFBC5977A00F8D2C6B3F9052A28D0BE97A555A6F7EF0A1085C8948014F8A5ACB5CE206051C7D3601B393F180CE075F7CEACBBCFF5FEF6DB66D1567619D60398E97BFA18075ED30E99F0E4EA272D3CE914FB4DF3EA26DBF2FF833F2AE8D8A431E1E517176D0E777B2D594A1E745D7CF4F88D90A501E9DDF478D0E9860934E3EE3C7CFE49BBE37A038CCB5BE6017C37006A41D0676F37B6437DDA27244BCB01C613CA4B3BC9E5DAEFC119470E80703FB2EDCE8287C98A41FFEFE41BFE7E9BFBB3736BFF885175B72FD5B6393CBD58600B04424C0D2EB202B3175E39993F4BD7E7452134B8B1EF0E8EA8C14370EE1C0AB733B72D704E968E46758D84FBF5475E30A6017995018CBADD1F07F90D748D77890F0CFDB800FB12B173C0022E1C94CF0081D826F49CEE91E67224248A4CE4DDC287FD918A222F57F309B837522B0D1C3B3E15CC2DD36EAC1571355BC21B4C249FAE84F4A55FC9133CAC9298CE49E53163D2CA311C49D3EF1FF2D14BBB32CF46A240038A1B456E9C49F6852731F06937F250EC92CC5CFFCA5FFB37951C23692F3AB87844590A9982A42D28AB51F75A05D38C9EBEDE28F5EA71F2FADC1AE0C887B39CAFF25416C2A1F9543EDD8745EA7BF5BA2AAEC9A878899F30490F38B8B1F537A622121A2845D6F8A9A8C705432D5829C50F8A754CDE98E373E3922A5839EDFB880A790E566F51FADB6A395BFA7E11FC56388CAD5A277D6A7025ADEAAAC008DD34EA441EE66865C3AB559291AF789C2B43FD52023788AFFA2CAF2048F43C13F87BA21313017CB28F99FD1E05BC1FB2B8F6A0CEE9D26A2E2EE819521A5623CD298CBC226C9A67C36DAF30FF11F9AC6871EC2F22A3A7185DE7F1B712EC980E95E1D22D1ABD54FCF9BABB7108BFD32F67FFA48D901F6ED86869FEAA58762C7A3E1C0D15048271A23088E0FE982421EDAD2C2D4A971D02AC231D0EF3D5D62D079FD16978094EADE29292FA0A646D478C9597AE372CC65FE48B5E359B43E1F3AFDE1C55560F483FD77913B163ED2F46E990975C05F94D558B7FAAF702A6ED46A4B5A158E8C14834FEC40D588D6085FF91825BC34D2504D2BA21AAC2D8A1F924584B6697E056840F471836476A3ECD3B46D929A4E7B96547B72A9DAAE49E91A503605F5B40024903C059427C23AD219F4C32CB3E19F634C89C88D1EC5A295221B32F65C5937D2B8B72114D1B4ADFA905A67F429E1C5AAC23B32EF3F3C30B8D9D2BDF85A0E4596CF95960EDE96604E87BAA5250FE9B73312CB506D2606FC08F708AA70D6C40826FFC6E1018E402C3D9402B94840EE1A3510C7F8F7B8E7D8EE79DE0B97E2C1780242C5470D29FCDE40368FB0F2D3EBB6D515E6F5B27133F0525594D5D7915757B7946377C3954C08A71EBBCC338962814CE3E1D20F06CC9FA8377E4ACB18E585BE45AF7CB0867A3A6DB40EB6FEB78C22872212E3F473021CB9FD716548143F9DB7BCB8DA9EF27A1490B1E33EAB7FB024C0E98E54E94716EA4441AC2D18A078733E4231ADD7F18735C0A4D29CEC70E56004059562B54C26FD9A9E39BB2FF7C0A8C35F7C3CF640AABF7629D4C65035D0845D36867C57372A2EA6100BDFFE7458931090F895CFBD7C4D52F80AFAFFD248A63A272E9AB48B22E106A7D7C142137E41F537420D29F077AA3B81CDF7975F363CFDF218A91A905D1F4A48F483012FF23F69CDF97EFDD2843F3E4594AE6DC8AF1AC27B59AE2E8E2F7C0E709D742204540C4132F9AB0C3CBFFEA5A97E1E99F5102BB8C287E33925A8A2F39D4211555AA1876967992CA66AC686469C103870E93D4F1D61457ED34A931F8E340E7D30F0C1BD75F7306E97AE38B4BCE3B18B9B9320BDAD5BF7E5B4E547D13383451B890BA07E14C4055445E8779A2743F1EE51184A2ECF187F6E49487E7BDF79E06831BDEDC16150C84350D3F94E304EE85D7A5B5C9CB4EC01E2EB5B7BED9CAFD46AEDEFA4C30FBFEF971C56121165F21945247646D64AAF8CC19C1F9BE5521E702B1810D2F38D537A532F9FE0AB3747D0ADDA2F0D658B41C0D39E71EE4FC276C475C579E3675B4F71DBC5C0F9639991CC8ECAF4AFDF0F24E4E9611E8B1EB97A52BF5F63371E2F01EC6D968CC7FD484117D55465C307A7153537A386ECB91F97250915199346051B71C78D3A14A771C077C17104CAC509692C472596E3C622B96346A9C3B5363A541449E6B311F26F1F01217D0D5449DB89168A773128FAC180B5615481DD27D57D37864F4EF975AD9CC68D4EBEF53C585FBC7BB469E32EBBDF01BCBFF814D48851A157F5224FFFE03E63DB5B3590CE62C61CC068E84F7ED0EF027083D77A2F4B2E4E79562B4D8E53B60B59EF45FC9F96D4E181A74EB09DB3C5DD0FA84A21E5C7FCE097B08E12D68CA7CE87E47493CCABC36D3A878DD4319A086C72B99C6CF431229451923E4750008A256268B2625F2081458190E80703D3E91C21C1D751874B7741755AC29FFEC3044FFEE01D51158A994DF485215095001C34F516983F67F88FF36E9C34824E98D65F22621DC6976B1A49F3B2B3245EFCE0CCACB608264D3A88DAD9D2FBC9A99F047C3184BD86F047BF76FDACB3FB4295082EC62E88CDB4C2B92A18B854FB552CCBFB512FF0CF217D3A8CF5BF82D3BD38810DD6C0F31F0B7E6D4B2D26C002EFDE72F4E5D321F25E32ADB957C39955FED7ECF74CAAB84FD4F34B9FEAB3C93BB1364070201008F41AC764886C845B58B3D8EC213B9996721D8E04DCBC29EF90DE15C51AECB744F6F4494C413F47C3CBD19427FBF6F20FB1D296CF73F0A9714A7E07AB0151674C92C12481DAA282BD353CF6C533C89E42D7F83E49A17E57672FE371FC03D1B4E3766832574862E516A03229B1326B50F483016AF6880E4FDCD4633A028319F8BBA3D36FEEAD44ADFDCEDFB42D7C894A0624E801B5F48A5C95240474AA64EA08BDCDCF0B85B9B9312CEB04B2B69D781D0D0D5131F0E813488533E141E1C23AA88CA1A1524AFDB8D001F2E7D29EFD7EC494E62AD42B4591CEE2534EB2729B1F9F136E3EDEF0E28B6FC8FAD0DD5D66EC78B497B7CFB5FAB935383C571E2AABA270DFF8DC8F6595C88B614212682F57E2A44C4529601E5127DEF8B42D061D4417095CDC1C8A0876753C2590DB3410C77AA89CF7227F0E10CA7088C3C68C8EC82B561B5C1015B68FB9618A81357EE854134694E642A4C7262A2A209B4758F9E945DA19D9FA39F0F8F10B6A069928FB1AB9A8A8B86A3A819C89F1105EC6C06DC9C419CF8741F071990FDA7873A056B0A817265C3A66B401FDF23AFF2440F7089406A94A549A291DAAC52882746DFF279890FAED85C6BD3A8C0299C683A21F06D08BD6F8894BCE74FD219ACE12C745C436221C2AA2A6CBCC8018D753EC85FF6402F8E76F71D302E083FE0CC8DA055E22FD153E9E606D90B8864C8F6F87877557EAC20DD1AF04EAB42645F50DF9F18B4EF5C9B9E2A1DD9F0F92BF5590C2600C9A1DDE3576B4A040551876EC469CD5CACEDEC76DE3D464FCDC16EDA9B182ACD422658003394F4C753E51D0A62A59CD0A6D3DF44A6B2E14E1B9C7E5D42DF4D232A6E04730D03154E908D1E7E46E6F37D99E9200751C3F99C5ACE197BD84443F18D0EAD01EEB2130EA16E35D57CB5A29894ACC120C62CABE3D93C69747E8169B6706106F47B45068E658146D983BE0E543B5AB678C4B0FF1C8BE3CB3E9AC9E15528FC03EA74DBAC71649C60194B232EBA3A03C38A8B437E2D94CB90C0FBEA672F83CEE969B779B702A9C68DB6ED4F79E216FCEAAE337334ED7B48C93B0482D508B8A1D444DE47D07C459B233277CBBE65247DB21282772BCD0BB143BBF0BFE48CC6EBC7672AF1DF44EE8FD3FC6425F0BD597B798F1F0225BA3CDED8797630806F708EFFC679DE3547C927E1A58041AAB7425640EEA05A2D98B049A8C06A4FADB273880BCEDE3327EC158EDEA0CDA80BDED101193D0C93E0EA64CE03E283280F3017F8E59200D104532613155DD89E509A3A683DEEC196781103B0BD8BDEB3444D16813FD30406E4DC19E4BF152FA5FCAA469EDAE82B79848F0DB91893D0D29EB0B199B15C33B60FCF691762AF00CB16DE5EB27F923711D9DD0DB0A792C2B879FD6FC2384399E29B3475C139E801B556AF4E1B8E39E56D68A4614034CA7F71F99BEA78079A622F195385FFFC39323A13FA9EC76A6619F20A063B022FD6FAEA6DF6D14062D990F24DFB1D78867475C76FB8720D0C96F597919CE2D28CC00D4C9B5C8B6826D1991BFE612AE4E81FC3E5A21C35922B9CB3C953D3663331E0F4F02C5813E4231A2E6CA342D8EA9E0CA66250B95BEABBA6AEA911FA21531B76C9E721FAFC2EC862B6FD3A66A5200A8C1C98854F3022ACFDD514FC1A66975E54F7D6B8C5F1A81D8C86536FFF1387BBF8D6F30C2E01F7D9DF1CF283B217D986C8DD873F494DF49ABD5459AD7F0BDEC7EE0120C90329AF905B2E957747E5AA0C04B81B1CC444DDE6286612AD94FFC44BEE9CC513344FC9095FE419E23C9819DBB1B78983AAB91ECD8E5B0E02DA2EE3A3D35F024FFD7FCD70FB99369205576596C88343FC364E4EB86927C3AA066A93B7E5065F18F8B3EE4A9E8D03C1C9A62DADFA76B468AB24BC5D7B4246ADD89100E03E8719A87DBE8F246F6F2E1172A8B86BB667FC8181E5294C150F424FB5F0857534A57E9C1FC3901A52AF4421706EA881535D723040541D10F06904C4742F63C29ED3C7EFD3EBF9B741809B10A26D8603896FD5F87FFC8B95EF20E3087796EE98CF002F57EDCB886CD949894664D9185AF7F07A426DD16B13EBE24D1A9BC2F015CACA712C8A6189A36CB684256FB14D1C860F6C96A638422C33310A2DDBE620921401AC686F515058F4D06667F466B3D6A85A22B31D51DE1DAD7E26E5335E2F583695DE3FE0FC53B6A9E08867880F27E8416BED8FB4D110461EBE4139A2567F4222BA173A3C8106C9EE430DED8069408E5C2349548A5B9C49E93116B072DAF6706B8754950A39B2CC77DCE50F6A9C15B2E8354D2E1CF793712E0F0CB907ABC1F80828988329E26F4C4A4E8CB766360F72B171F14523EDC7033E87A482F8A2D36EC174C739C1BC080982576B86BF7EF0D0A7BBF8A77784C3EB7D11FE137DED28B0A7707F6EB149E12031E69C6162BE4A0281EC1EE686C826C0204ADAD4E2230065C966658C0BCAA89CDDA0BE9316E21E832968A1A27C81584F522758328825316A7B7F01EF4EF5D1A9B80556CEE8BFF4345C14750FE25E1CC5E7B75AE941628A711A8E979DC9B1B615024EDA3D5EF213BCB0A60444FD62D1CAF9DF7BD25D77C01E3697E1377F4C2E1FCBE16F4E19D29019175A113B203823E42D6A311D66D585BF6B957B480F9AC3A6972EB289B0C4CB4D3E9F08ED30A7149CF9449DD982A4E5312600A5CA63425757DA356F4CC5C348FB5FBF2993DC9F6CF0D1CE80B1C4E38DABA52CD999D03FB2AF09320C8FA6CAAB746B78FEE854C2A782457103A657ACC5E4E092FAD49C60681ED120550E941F33C7128323C8BB3A9B17B1B8D43CB4E95CABF0E8BC710AB7FA81CD6F756B5CB6360FF46FEE30A7B1A1E561ECE760FAFE5393FE0A841906610240FB45E76DCBDC222FAC1F62E04450FAAF64E120D70A3DFC80681CFF5F1EF3663A9CCB413D2BAB1F5035572AD64BDECB2FDAA64D543781E43CFFA2B41DD97CA6A66D64CBECB304F4D7F1F223AAEBFAD0C9F3EC57EBED38F97898C7017FAE0FB71B7813ADC5E823CCE6058F3EB20E9A75B9859C10E3F3619BC145C6583185D896A4CBA46813F24A9E8A997B68F9DED682AEDF5CF5C1E4D56A5A2C32491B0A0CB520FBE2FC2E9103C50479F71D0A9A642CF67FC141052B18AC236E92FB66F01F023F84C7E92714832A9FBC6834FBD5CD7AD4AA34D0F65767C9C5F1D407EFE68D489A2090362F343111BA2E1DEBA8D8EEFFDDDFE6C45FF86B47F4AC86F583FE0E3C359E192544DA915609D88721DA1A843935485C50DCB6557543FB973EFCCAE979332F4DFF5D71D64B002154410BC0308E53557EEFA51511A4894D345FB543D43679056F98813EB528BD3093519CF57B22594B8659B8800F4A4D63004BB8407AC0880E9EBE05F27E81C488F0F4CFF61BF21557B51600F45B49E73ADB1B92CB5E237C5B905EE02AF52BBF2382573CE7BDAC99850F497CD3748F3C3BF7390F2FD0366168DFAD44E64C379433B2868889CAFE1ED6F369B905230FEDB1DA75E9ED33488326CF3E105771D4CF89B18A90D940CA96AE9870D9F83EC43EE7D09C28128B8DA38D57B78B22787B6BB8E9D49B08783869781B6A787BD6F4890869F913E8F96829EBFBD8AAFB78DBB1A3FBF9371905FA06000BFA73A48604DEC907C065612825C232C8A409E116CE48B183B9E9CCDC215642B2C2CCD2724C0CB2DC82BEFC0CF232B2B23282FCDC5CFC7C76567CD65CF2B6823CD2B6CCBCD2BBCB13FC72926F6DC3CDCC25C7CDCC27CF63602C2F6FC36FC42C236FC42F676B636B6FC36827C5C02C2824282B6BC38C54488C75A814F988F4F504EC89A4BD09ED7C64E985F468ECB8E5FC081979F878F9B9F87D741C6DA861BA79808F00A2BD80B58DBF0F3CB0AF3703B08F2D90B3A58DB72DBDB0B0B70C972C908F008F3DA580B70F3E064633E79392E615E7E7B5B592E5E3941055B79071B2E7E617B1E4161195939616E2E6B2E1E051E213E59B095A8560FF7F86C7E95C3F3F84D14315A63DC939862E6C0575FE246F9448F388A04118D1820D9B1893F759E11A3F2F2781660FE6C43862221B9461211FDFC7D19D654B9FD29F1A04E28E4A1950F8D016FFF84D75BF7CB4D067A20BB8E9FAA5B2178F7CF6A3209D118CE812FD0F4131ED6A1A4D9FE6801629EB786030F51E88D563977BEF44DE20988DD62CD0D5396CB82318ADFA2E20A42F09B3F5316C62FF7C8F68D760A414A3FDDA17E30F0EA67970CB0ACAF30D028CAEF16D86DF6760E549B519C1F7135E4A77F173E32013C116382CFFEBBEF2F225A629FE9278102538EE8C0E7C903072741775B070A1A5D13A4539FA9FC74C2C78F1967F9AEC65F5BC53C5876DC79D58B3E7F50637C73D483A4AAD7AAE4033AE20ADC6BE7857EF73BF9FB4486B00B4205B21317F7F5B6F5CDFF82BECB0694DB4367A00F9308FFA99522B7297B256C1B0BD661773A62DE2BDC82D87A0BDA0272208EB539C43E45539B30177994F1926A3587FBBF65714EF4F318B454A17E9A8F554C32BA67F99FB6A20A40FCF00BDE2ECD47A5250B471291204074D9FEB80365F5AF3683A4C915FE076DD44E887F9D3E0DE2E9A26D70F38BEAAD512F5C7F870E73CF463098AAD6426380E6A52EE8F467ED4BE1FF90C1D0CF91D3F486553B2D99B7F822A51F0C0C05386538E04DD949D2320DE19BEDD330A77187859B3CC6247609A99CD63D3701915027AE8F3FF584C82DA78F75B59CAEF31E5A381D6621C9DDE6D4AFAF756F229DE0EB8E464EB3751F2076B307874F8078BD5721519D0D6BA7969F06CD465C38BB8FFF0B5D00684A7D2C3D333563944BD055D3F573725A3775033B80C8EB6C1C3C44596EF5FD20FFB66CD981FAC03B3AC4FB01C79EDE7FD646CB6B8F4E237AC6A59C7E95C896B555233D33C7E52620F07A6ABBFC0209852637593AD62564F75687DE044E9BC9377EEE61314E236E1FAE247B5457008E02A2981C3E4EE35863579DAF5F62763C951864F30E8EE02CCDFA3F2F0854A590535F5F12D356D0A8502653305B6E65FBC347EA724CD10231310F23D3EB4DBBEC9F187366D0F3ABE42D35F0B2D527554915E0DE30B9020ECF1C6D20A3B3DE51E1008E36A6C5F53CE6D34DA3C864F29EFC5E0751572AF2C3B6DE982A19E172CAA2FF6ADFA6CA7B2C721D3782D70F8A58182D05FD948DBDDB63D530B8337CC4C53D5EDC404961C3D04156470A76CA303703BCF13F38E5A72B5E97B85410D764F35D25FE577B0C0330A026C2D0275066BC87CAF4583B21197F19DF9380A789E03459E99912E41D9D770CF8AB1432FD7A362B37C5CB58F0921E7D5F620E7110BBE3FF572238BD90F5FB4C4BF1433AA0908796EE96920AFEF3D40846C8CEFA7B202D9612F31EB4897E18708D7EFB906B3AB2D41EB5D4819230ED1C4AE191696036CF9003B3E0241A9FF1040CB0FCBDA4F18F183B73ED2FCEA677BD1CFEE1ACC5BBCAB07B3A94B545798063BA5C0433913E0E4E89DB5B5A6051FAAD4698D4CA26EA25A37830A1B20ACD04F717B322A286625AE23D839ADF4521568022F5B84D514369EF7156E250F66A084F307ADBE068FBF3DED0A85F7EF91583270C10B21D1E2184CF80339FAE56B270C4ECA6FE172901DC4AF4544F30BF4E379DB2561EB708A3636287FB406AA05BB93DE3114FFE0DC48EF112624DFEE74C851304DA0729A4AFA1A71370E656768737412975CE3210573B92C0664DAFF06D8502CACD4383E4A2BC0162839FD9BD3C5F3C0D1BFFFAB69079C00B845F4564199EE5656FA0634761B2E4C6679A8D151E7422204E229900FE01E4DD144DEFA93421AB85DCC803E4E7D652F2C2FB21C720C78A010D1951FD8F98AEA7FED655DEFF79359846E00FBE35A30182173E18ADFEFCDE0878934FBCCC9C0CA5EDE9E07884D4B9FBF0C1B35853E0BF219F2DFCF202B0BADC58797EB3461489B9C67408C9CEDE4AC4F92085AD9E1EDCA68ED9E313E6320F2E86421EF23F072A22FFF81CEE92A0766567735A8D4F1FC8A3C0D2774382FF6C32E0970C139F2620FAFF374194029517CC582AC80E12A19D7E309033CDDB0CA592350F5AF62D9C3DCEFEADDD3374EDA2F0286656B86E3CD9824C08D872133B209D71066DE536BF1475444B2355F37E3DD8EDF63A0B1A478B8F455B8547816D1CF28A249A70B16D4170D2CC981AD208C27F94D3572A70F83527E7D4529DB20F54428D8BC20A680C4F57FB09535CD47D1A54C3FB6891BF26BCA35E99C229DD79CEC42B3A6883D542DD3E59D3793AC837F5C7F887B4E41C0C73806043D560FC44A8D840E317A28B393E24F652AB824D81C4B6D7A132F6F494D4BC13125970CEE3F99F99D11184CADAFDEC1ECD3E256445176153FCE894E11D483ABC710C3FB96704DF75ED0AC780733A3F89F6180A30E0C277711BB14CBF3AFFA375412F3DF1BF6BD3A2FE2F2BC3B8ED2C70099A1A9B55000B52934221E53F2F1C970F02560E2682AB8DDE8CCB1AE54CFC381DB89C2CF1B6700C1948883F1D3F28E4D27F10E5747FC745DEBF25EC54CFFCEBC8176E90E3015C3346707B1BFDDBBC3FED05644D4986225B0EE7739D10EAB2AFCE6840D4C3963C6F54175F0BA07994EB7298B5B76B2260BC12881EF411A215834DFDFF36F81391E95524C92A789F1F7FC8CE9210101CBAD4A44E34278D02F56E64B8D957B910F8799DCB5CBF641B4FCF30A1AAAF0E12E3515881657802E56B86382AA81A072CEB85C58391F765D9B51A9A53411ED70D0CB00AC14D06351026A2D3CC5A150A8457182C9873C414CC74596E9A3C6DD620515059E6FE03D8F648F90B6736EB08DD4AFD8B7F4904DD3320B6A1FBA5C099FCC7FEA63AF6751752AE0107906E9D3A9F31553884B2EE2711D3D1968BB7999F19F41D077E97E6A4FF92E7C32D4E6BDBF5E57EE09094AC46F5AE941B882FA591D2C12A78C202D20F030EADCC8EDC952EB73ABD3B4E3B7DE43ECE53E3F76178171A7B3394879072E25702CCC5CDC2B67BEE4E6956DB3B9E97ABE23946BCA9124C5956284A4BFD4F6FFE9642B2EBAB7D57B87A3B0BE06CDDEE244451E12BE4E737F7C82CBBC1372D47F411F0508EE2296C0222936DEF0F857820DDB9165EB9EDA4C516A4C5C56660F332853352FDF42338B394BAA4E5731CCE0740F3277FEE6F4F21D2A4758446D7168E0D5CA911C937DC9902F6F2C003C33E42137AA82BD46B76387494BBECC63A337ADFF88828C3ADD91404CB51EB2584A155A8EA45814C0B92CE57315FEB5BC603A196B885CF5A53D57CE9974FCA4EA5A099EE1FBCA021D3B65F824A087FC4367B7366D0BC75DBDB6CE796021ECC374A6755479F5EFE48189AE6F7390D2741D8E0449F1332EAA628A417381B6800E7EEC923382BBABCB195622E91BCBD3A70B105B0B082A2A739BD95BD6620FDC495B4BEA8950AB1D03165F88A9C3B851A0AFD1CC4B9CA159F7259BE33DD81EB7461EB8F3E8D2F6122DB2AAAF710FBBE7845B0AF36C33A1C766D7BA17B3DA2CFBE0891D887455CF789F13197BAA6C96F4E66FFBB4D6CEC42A4F4C3007073EDF398F0B1E7EA680884A57761D290DE12FE07B8AF4EE14DB6AECFE1430410A8EA2580738A625E48F57F1F762C62F169BCF94D5592FB3827A8787DFA272B412784B319C6BE3E5BECE3A91ACCC6B4A1E84CAE64F74DBE591AA4A6DCB682EAAA6A247AE239723D294F29F903D4CE4A22C62FBEB413E3D1322121E1D5000FFA44DB934F92BFA34BEE64637600E6225D078490DEC69637D3D5D28C6CC6D6888CA2449018CFAFAB5FBD7014B9EAE05A8F5CB82465BBBB1A88D03ECA12E1219D0CD361BBDCB707A3654F7C8E39DB316280D8EA5466AF16681F46F3EB28B392CD2AA997FA737066726F048F612BA3141BED5C1180565D0F157B6F2B0B81C9DABA265E65BAB2ECBC546258B48DD05416D64FAD9DF370A6EA2A8620DB1DAFC8C978B9EA3B9BBF77602B8E5F4EF76EC7553F9B3C607B30377BAC69179DA2C8DD0699456751AB961B618E9D9EC6D717CDB48D42FFD3DCBE74E9FD3FB50244F113E7BF6EC8439D4DA3543987C3A73F9233629DB9E7084F85561BE07AC3123AFC4163DDD33D2D5AD4901A392A4F0928C59EF7D9F8973FA9E5B5EC6D22FAB7FDC28393FC42B48738E09A4C6FD9F930D5818576717B66005953AFAB51A61CC1C7BD55639E988F9AC404E05BE7E23C92E512E4A7250DF20A807E34D3AC95BE799B619CA6F906D7ACC8C06EBB65E99333B7968C68FE5E9CAEF5BA80B53B814AC09D93617624958860243C306191B9BE381E04E9F1470953515F1F4B46BF2C4067659258357C77CFDDBA31F792B957D43D57A8D400B45349D542EE3BF5280A9ED153F1C51B0A67DA68F614DE337A82AEDD1962CF523E29781EFA089E89866B8D72FE04594A2911BC0360BB446E3B03D08037C24A182A8FDA918D07F03CF3B08F574BF5A791CD081BFA6299FA63E1AF3931757B21CD4D3BA4DF934DF674F86DDB4504DA90852839CA27B3A3F3960AFD930E108664A3D2785B27D07D6C9B818A8D62A73A17324E979FF1A57EFA333F892D08E3AA6AFFA227FC2FFAB616F845A43DE997831AA04689C4DE9549100191B05154AB9293AC430F45D6FCAC4559F29B43CFB041D31D9C39210F178B117A7C31F8D966DF342AB92FAB237A59E99489732FF757BF2218EFC23A620D45B6A2487406C8806826CCD65E85DF26F2D3A6D03BF6CD0BD109EE44D156D20B84ED2957FB15E8070366B4966E93E93E362B96E9C8D16FD546A7D3297C293FFE3E7F8B1FAF9716A10C0198C18ACAD5437A5F75526B33036A7C78414E39877B708F6C9BD0553749F7A334100804028140DED0070F682CFCEDEE2CC84B22BA7F6DA056F6BF34837DA1808A6E94EC015F6B368138DBACD406643E6D58FC06D5C20720BD57CFE50A17C22EACC31031B19EA615128E43E1EFBFA6CE7F1C03D09325CB2EA58618DD5B858BF81B58F0D22FDEF15D7455BDD56EBC19A8F0D88C3A51A493B4015E6FCE47784D03A45B2C56DE9D8D66CD57D39F44D130B4B7916F324BDB8DB4163F84EF10BAFF719994A57A9AE5F5E845E3D26A668BA90FD0317E937944C5A0497BA125EB42D8E0CF43DEBCAB4F7A3A3B2D03402917748E4A82DBB64ECDFAE5136DA1A7FD48FC0DDAAB177E61CA6C1A3026DA7FBB4DE31EEE8018231DDEF0D1F4528681EA27E46615A4FA0C0437E83DF285E43DE091D033B4330F7642FA49E50A794780E2AC8CC063809EB11834F2AF312AD2C46F115744C83699C2E7749FA8C9AD1B82F43CA0913840200D41EFD1AF202887D2F87AFAFBD8DAD388D0D8D93B38BBB959BB5BD3B0D1F8D83BD088D07005710959F3DAF2480B710BCBF3DAD90B4ACB5AF30AF1D90A0A0BF10808CBF0CADA73CBCA71D9F3F10AD284C3565A939FCE5D8AF287867354EC178CB9ADB0AEE63E77270C8D81D0D2DF85E1D48A3794D300419CE1E9A3B5637EF28D27DAD0F0FDDAAC8853C8DD8F4F0BE278549F88701884C869602EC956FDAA1EF9379AA1C09C8F1845B103A482A21F0C547BD1334F41FB777A9595986CB717982FD5EEFD38D3E2A7DD4D389B6D46AB9F00CCE08C5F4801A2390EF03AF73D48C565BFA1C49475AAAFF90E242477D88DCF867874387328E411CEA851608AD358C45067ADDFA94B0CAB7BC3B0A3E10A390215AF408E118244514CD7EF5AC889BA7098C8ABDBF32ED72EFFCDC663A1115168E9FD451592C1E531D7451581C8BEEDE98F34016CF440B008088C46AF07690BBC2FF63EFB9B817B511E5B5B906788980A827748E76DB5B16383D1DDB032EF29A5DC2BC6CD713EF51B369B5D90ED8CEDD96D80AB27570797190BF942BA9D517FEA3C1B42D6F2311632BA0F79346C86CC9E6B5E603F0C98F480487213C2D8FADF523F1CE5FF9F08E77DB2B5FCBE1E1A332EBEC0E09E920728F58A6DEA807D6E1D713E3FD33F1C6C08A3F035EC58BF6E2E9FFE63B65603DD6F8E666DA38FC41F172AE2B896D0B527E580EA70C2607CAF52B38028DEAA65F94E272C30D06C356E095168C7B0F2DC300EB8F924F5FDA51A4BDE4769968F26C3132B9EE0DB64426E2993E6EF2DCE68118331802A1EFF4EF8B9188FECD5AF99E9F3BF3627C26444EAFAB1DD253FC9AAE5C9D64A2324FA2EF6FB67DF1854C9874EFC2CA740F35BE589F61701211ED9B25B6BF9D9B2A0260FB4B75CBA0DDDB956AC3175B0A7DE8D04C065AA79B0C093356DA578A89CA18EF6DEF9C466D5F553F16FFB1291CD1152A47B27E11E080E0402814020147FE8238A770C36F5652C2223062816F233782A9B305C607D8FD12E3DB1D0C6783EC9F69307244A6EE900344D07A345F4CB30C87898EF06FC55481B0E72F10FF69644F365399FE1BEC7FB4DE6E501CE9AE22A8911BED2E408ED010D675D76844E919FA37AC3D28DB245A4EDBD6D447647470127781DF10B01F8FDF5AF48E78F5926BC0D2AF9D2E7A44481B4A4C57F3D90D303086AACAF848661F7990653A39CFD07C56D684C99E0B2D0131C756519FB2CAEA9B8E48AEC54172E8BAA2650C16D00C3994D7C96A4828E0D52070D910451913771E1F1D119EB27ADFA1D6CC1F0EBD279817F1C817F9FCE9FD9ECC81D60F5FA73D368DD70F0D329911880CEDE875E9CA047DFA3881FB59AC6D62257CED3C18B0CA64C94E2C876238E558F219DCB46A23B73D3BB75B3AC5B332191A6C60FB5C157BE51C4378511BB783FCCBDD9DC3EE009534C27DF337C4315FE44F8866373EA9A1BF6CE944E9F668F2F3E4B8AA1E499B534F8995416CAE11F1AC7AAEDB71E648EBDB05CBC806D81959D03C3A05203DE90D22E84390AF4C3E3A799F9285944A2B6351E9CC275059C5F351084436BCCC9C4A1DC9D3387FC03F1DDB1BAA9317E809FAF0DDA7588514F5BEE1EFC5DE15EA08B90C7E8EA3C0291E4553905049093EB349D68E7CBC7152EEAC895931F50F6EE1046B2E3F98AA954BF9DC463B5500979908ECFDD495ED811728C9C21E49374FAD21E5326E1B806A1ECA4B64D74A432F4A6BEDF1D1CFE7DCE3566662E078F6D7A044D54DEBB43DD3F4E0326936B2FE52E12CADDB4DF343FB9F57C283DEC58B7ECB3F437D5DDD07B2BCDA9EDFE7C116DA19047448BE8F246B256C2FDCD227298BD75D9BFB5DA377A59E288441CC323F59FB1C9E21D7BD6897024AD6FFF7D03159CC8152EC11E7A05C27D784972CAC25142D37E8CD90905586652FB809E015F0878D0C5040F728E54FB8204A8B1F975400563501401ED83AB5381C0338008E81CC8F6F52C4738FA1ECEBE81D65E06BCD4401A25A78C5C55FE66CA84A09C1DB3FF39BFA024DAC10F838FC7B703280E6278D6456A2C2D847D190C2658A07B00AA7C53ED0B24A7130694C6C9E5718E6097F139B1537F4E4940A2504DAFB5FE9A3194B11C5FF83641A4AC73092DCD194B81653B21AD937E1870735F01B261BFB0E9F638193A6A6084DB3745488E0AFE8EF6586A5D83551F250360A37BBD3DC622E657F44608F549A4A156DD5FE5DA92AC95B3ACAD7FF840FB6E0A87E28504E9DC4CDFEACD723FBE9FCCCFCDD67497D5097304BB4CA0BE936B97A5608FD225BF2785F0F202A8C20E8754BB7D6A8AF8EC78051F6F9D461912BF8D7F6C4E79DDB024A9CBB07B8A8EAB37BA4BFCF194989F5D2BF4DDF9243DEE45AF782CE5C7EFF78AAFFA4BE4F76E2CE659EFF0A62D44E11D83655884E67F01699FB05550F472CAC8E6949BAA9CD81E647DA79C32504324A67EF9240548592F944C79B534FD66228C775CC117ACB56DF674D0F72C5BC78E27D4BF73A5ED4412CDA55F05541FFA08D58EC1A6BEAE6B6D3561B3DBC08675C2ED37F407845B90B8706A3417660D22C3037293282230F490D90616528D5F8F4A21D52EAD3601D852394B128386603251D98006D90ACF00B9DA56848859DEF82120C1C60C7A84641151E96E50936F942408D49B646A16A12709C86EDF3702597BCF66B6A179866C2E23FD01D6CD9B3FBAF673E6D12C4FC580C11BDCFDBDD0E7012E82ACBAFF5B53E39581804D615ABB7A305FE01CAC238D5D788CE4E7EEF2D3085F1F5DAF2D5E9AE5EE47723A071727801B25F720CF4D697A86AA0959ED5346FE824616E9FE99C2FEA1821318A700D4951CF146A6285ABF91EB1654035E284B4CB5A5735CE313DD6F7568BBCE98368922F9203CB38EF61007E84C090A54F8BA99F7B3C9CCDF4F26B251A0618BE47E7DD7ED589743FCD0E3640B787E5E508FB8E56EF89E449AACFD3B213D3EB6BB38223D635C56CEB4ECC5C5597D0DEA77DC14F42D0D98B075F4031ED4B1F0D81AD3BC76EC1F6DF24564A54E8FB79DA10FC25A44115030A2FEB90A1A5816F307F72F9A1C81CE2B5CFAC1804B78BEB40AC9315E9A111F5BAD677BA1F51F939D079E4C95E590EF8E4F77EA8F80E368FE4F5E1CA9222FB4FD50DBAB983B420FEDC3140A484195620B9523B4D5B21385A8885684FC0E724564CDC5576871BAD241B60866B88A5A6DB93DAF85C8B6F28853E6DB1F5F795804695FD3EE1771DC8233BBAFFD261C14FB798CFB73F1B794F9DD26363F6CD215E1CF45E61115C1624B7A3841790A03D83F6120513F225100FF2FB5D2F47769B504AEA5B255E6EE9E7CA3FE6448604B7783BE04C75E64352D493F223E3E82B901520B7D0BD5E32A4986B12142C36F57F22FC866BF7BB06F28F7145A3EACC02B9E037520067A0C5499AAF1987D3A8E6336B8A313CD407C0FEBCA0E67D1A488C76C7F009F90D6B44549C52982D2827EC871C0E547F9A03553C18215E4DF72690D2D8A1D107EC7547C3201526735A6A7C5216C40BDC3F6577BB4C513ECD7E67C9D2B50080094AF478A6B691593883CBB88B6F31210DC8F7B6EB3442C7A6C73FFD5D554F6930216A8FF0FB002C6E98EC84904BBCD3EDAF4F9FB8A4C5F7A33B41614BF2A6C343A033FC7307EAA5242423B0F542AF3B63021474A725317A4E48CDD65430CB4742CFF00796F8E49EB6CE7C14DBF94C086E48C41B7083992A569B128F218099C7E848D3E40E011EF88F8435B63F7FD68AD53DDC6B3E43B4CE64B30E7C70042101417AB26020683C1C27F257F846003C3AF9375EF6E69C4ED5B8132685C2DEB942870F30829CEF919D7C6DE7F552315818A2A7367BCD914DD96EF3C40155CAFC822FA3F73AEE176F9F3F0286C1FC5D32D209B647F139B49937A0656E84ED0782F43F7350995776476D801E5E2D6288DE90C70B9AD5A119D602CBC991288E48E155CAEC319248F59FB72D0733FC16EDE12E80244F80EBB472EC89C23672D841A3271B66506C0CE0C88D734883671FA63B9F0CE805BBC5FA095B193B7D03A71B689F90391CCBFDCA56837F5B7E03F422340FA9817C09ED325C244103E18476B7D7ED115975D3F28E922E5C012D55C3C9B60C5FC4B0990FF3C711DD17A8D85D43C32CB3293458741D2F1FF0EA66D5315A9E3AF77090F07E8919BD53DFBE670E29986A83B86B484A91B47E570FE5AD21CFBEBFEEEF10B411BE8C95EE0313E4DFE86DB6E50FB9DF1222C0555EA47D4F274BAB50CA5C1EDD67318A095BE03673D5CF595DDB196848ACEB1FC97CDDEFB3CBE8960537787B213CE2A3BD0378F9E6E569E80267A723185175625FBB02839C9BEE4EFBAFCFB371A4EFB1514303B9863197AA0F73CCA67FB69CD12D486BD4F598665A7F6A8DB18CAFE65ACC81BE8FFA378F34F96DD2C59052BDD9147247EFDCC181FE55F115DEB0CBEDB87916A33809CDF366F98B2B5850AC79E1BDA71F3EDD6F2B6B8A47F75042DC4C89ADC5D7D1CB04E20EB2C4CFAC8AEB7E0E27386253A4757725798E701F7933FB18087A19E1709F608ADA7EA84563F422BC1318161CC9D6050729C2045FD19E41314D462528CF47B4289BB18FC1FCF895E8BA5DA7D4A41DA5BF0D845583FB624D64EA5624D24AD870AFC941E3B16C30E7C0F0816E44FC36C0A11E28A25D6235CE14361F6CF7A747C635E829DC97423A973F62309F68593E287585F00A2F93644BF17004709947F9FDE6BD48870C9BD54872AECE432FD5F83E9D326241F78945642A4E671401438BB13FC4107F6087ECB3EAE93537BC02077056C4A373D75DBA55AFF57E33DC4021D35AF66BC0E617E52E52FD8BAF5C2A54ABCEBFB9A118D857D668B574612CA526710080884B4D3CE3CD077BE94A10AF775941AC459375CCF732CC877AAC1428CDFF491016B9F1BE60E8C7C584714084EDDDAD9C3C3DE8F4ADACDCBC9FA38A07DF0B77363F0071D2D273F3F2F5F114E4E476B3FFB40EB600E2F670F6B3F6B0E5B374F7F3B4E672F075F4E6D770D6D5E636F3D2F1D1B7D752FAD40253D7D472747750D130D39DFE0E01055017B03BD10774547195D7B2DBF8E3E64DCE125866A1F9EB39F5F57EC4106D825672B7512BA34999096073157C6758B7BA61744DA70FC2894D7513F0FB8C1FEBB8089FDE8FB8B4D9FC01F0CE7E0A769F4C592DA0725E1D00F0632D71495C59276FB6675693D08747490C980BD4EFD134603F2C77492DF20947200DCE83FB1EFB0AF63FD4441E3DF5C25F031D35FC81F315CD74B32CC7A01EFB9CD801BA33BCEF415DD2A61227152909C6FDD8E29ECAC0C2B93FEDE9FC5B73ADCF4DD1B8D5911725FD5E61A62DC7D3BFBF2CA27B811F243BE0176F69C88ED923F1E35AE8E576B6F6D373EC528FB702EF8B73F1EE4B6F8AEED6A77C2F981E04020100804FA42B6323749C99105346EAABA9D4709079F7483324DFEF39E2F0D4DBB97E821BE1483211E4803730A3ACF753F2ECC6D3D7825923BDE499167FA94A68F88D2F7E0CEAA0EBD00CC1F1AE4A78318F090232692A7F8F2FCF2E907C909797EBBB68DC510322CC8FFA4D3E596F428076E6CB809957CF23C89BB647FF786645BBD360AA72F11259FDC7BDE689706C100063A68F03CE170E25CF6A787AA36F3877681E5BD6F940D4446BF57035A4F4B1A02019E0A3B010F643456B91E55A9467B41076DB5DCE78271D684BF4BDB6245DAEADA747C995313A94A9A25165A4D552AFB3B7EEDC5A662DAF0E7CADC1AF997F3E4ADD90F74FC80203FFB41C4B82A8B64B86D4F20891D65B5379B2FCB327DFB28342524E8690C7A9396F9BC8BA8D068C061C24DF149AD242F7F2CB83D17904F22A1875AE15EB207FED75840900C449E66A8939B1667419C43E75EAC17610734E7C48669B3830DD98A3B16F0ED1C9E542B56D0F6C48BBC12916685FA65E996BA2BB9A651950EF9349635AC7A49DB7599BC77FCB6901DD4DB9856FD04F38CD2F677E5BF149217D1FDA0E612C41CCC87185B242D3D0D7971FBA267D066E66772993FEB77647341D7A5C35292F6886BB5141B772302422015A2E578EDD15C59CDEB1FC737464770A8C5B8A155A78DF9622BE15B640288CA29580219C4C3263D67014926BDB6740602064E285DAB30247AA6966865A54EB495A4E7A1F142EF533368EFA3DFDD86127344B7F92CCFEF21F08421DA1CC32C7F4CFCCAC4BD20AEFFB5D9EAA403CF8AB5CB72D71D68074A76989A2775321194E1E1F2446E3C28012E4C93FF0044632C05F866DB9668E7914252DB5BE569AC60CBB072079E783363A03A6466E24C9B3285C1A41D8ECCCB289BBB98867DDFA636A7A081E52C36FE73FD60F7B2D789AB99D0C5522589FA5A5164A0B3C29F99F233D92092AFC58615E9F5401C0E8A065615C10AEDD3FC56879A182DABE8629BCF623A0ABA73C846954780C376F7610E03FECDA220E77BC6667F8754F50397846CDC4F74E71643DB54566478D820A347C88144E7D8857536859E97A9A21171A18395767659351862CA9A4ED9E5F2D31BF4149DC0E42412EAF27E975C6C7CF10DE998322421AF0A26D857369982CDA0B9DDE47E480F09AA7F6640245EF77ACC122203033FB00F9133B71FBF96C92F6CEC3E32B8F17CE148D4A7D941CBE02616F703B96BD4401CEBA1725EBBD22C193D0869C55F6710A5C758B0DAE089A8240BBB6FA7BBEBB372E6561D2ECB6E1A4DA16762826C1E61E5A717692DEFA4A66160AB682417226364A01660C0ABE22F8F9824D22C40AD07EFD1A1203126AC4419ED17E11001222E63400B0DDFDB8A9F8FF17119AF781B0EF7CE7421532CF6E0091CA2ECC856E56F00DD23501AA42A3390117E1C46A6F176D10F06688B45183FAC00417DBE14FDA4769E2E9C0BA3103C2D76F0955ECCD7F81AE345209C931469E956C3CF801C746FA3ABBF6FEC6961602E440E566FD04ABF655FA855613564F1F9F8431F7C62E033791A1696E8285D5E11F9304D2C59CAE481FD67741585F86E5222E27649F2FC5995D61DF9A7C707CC78056848C98DCF2B94A27174337099E35079EE17DD5583C405E9DD3501DC2392D4ED845F61D9C53813DF7156324FA2F1E40F03981C7FFFAD1BA2538BFBBC3DE43314F29055BD2AC9FCD2F7490C26D15CB670A633861E7C5B9156149DD7777AB484E4A72C1A58F908BA518A041758DB063CC89CAF81D80F03F064113898AC7A81274E5446D620A72A8F6F32A71E1353DB8475C21DA2897B0640902DF58FECE4977C7CB66EC51FD1ABD92924712A1E72BAB23129EB533C178B6A708345BA3D75FCF78D01175D38687CEDBE1EAAE32BF7132C1B03439CCD8C99DA3A2FDB8F2ED8E09F1E5BCDC326AC63581CA7CA846AA019B4003EFB99A360058ADE8ACF0890CAC8F79A8FA70BC058A460B76CB99430AF748F9461628DF8BF126896FA3B5FDBFDE62D866C152994A3B8643839472196F093DC2C481E0D9C10067D9AA8839EEACFA4067E1F7FCACBF3FDD2FF29D6D25A3C48EBC08DE688A5F5176529E50ED000F045123652FD9D229CFE906A3DA8FA7308F15E5EA0B1A6609435AD622D2BD730166369D768A446D09943C7C323552EC137F939709206DA634747C0B021ACA96A07CC6AD5265C6BEE75A73FAFDD87E4125B3F0088952FFC2182BF66904F1E785F3D7B9B5AAD492B643658BFB668DBEC39743C641BD346F743D394269E31B346D0F1A8DADC14597A7E9EDBA03ECCA63FBB7A2F4F0BAEDEF636A11911647D4C3BDD0F06F6FB8B9C1EBEE9CAB55E8A3C71ABA3279BCD020D977B0928F6DACE3F8D5607B5013FC7D7DD3B06E58CD346B758FB178B42C75653B245561FB465F3D1B133EA9BCF9D58AFFAE9D052D006DF9A03D13366AB52D47D3DFFC43C39611910580DC92F0890DF0F1405B6C65090EA9F28948F372650AA433C98F40376D91E04E6EB62FF3FB631D7E1DBDAD6FC9525D83871ED38AF70D19C3CFBA9B7A3B36DCF3331ABA9905101901824679E921461CFCBD4DD6E49E5ED19E34DCD6C9B19C3F7AA8CB3B5AF0A6A01DF5B64726D339CDF9EFFA3C9ACA3BB217A85ED88BD455D0453FC0C9B30CA300E00D823543FFE3FC88D395D16C26EEFF8BFACF6F6D9197C987D83E0DF003DF9495D0408836B1BD8687237BE0AB2C60D25067489668C6E7C2824BBF7A69785833123A2016842DF23068A7723C77ED7890F42BD2E1D51D4D0ECEF6F768417F817178F164700A1AFFF50F01BC491CF1E7C4FA0396A31E68ED2A9CBB82D8B320C5609B78FC39E80F44A6A2A35D121827062E64FF45C6FDAAA08F150246742023CF0B0564AA4BB33D0E6E2B041CEC7F123969078427195E6BB74DB3F159BB9771D6A2FDFD18F915F316030180C06F3C1CE0DC1EB8EFFD2F45934666E6A4250B621DEDFBA4441F9F343747CEB6B610382E6832CA9FBC9953A8021C63F94A94186924FE996119AA582E75644CCEBF5593E48C1DF1659955091850051E789134EDE03881EFEDE8123960996642F23A79173EC2EDA9E96B21C431C2A50B5D41356CC56D81122EBC3C4A2B869EF5239080F99EC2F80DC70944A8A9D5E03ED87CE017E8949BAD33DA8A869835B11B9576F15AE3C16FE49E15A11C2943D3C009FD86CA2203F505252C262AF45482A0F1331E1FA4FEC447A660CF793A6F78C03686175F92E1C8BEF3C87BEFD99560DFEEEF9807EC0A9E95FFBD7208A32E056160430EF4FF88237FE3F78166AB85F9B44F362F750515438AF644F90DF41ADF69E0C80B55AF0D0C276A49C93BFDF201C9BD209F7CC47D06F15D527327A4626A312EB08E02FFC9D430B2852AF70FE1BFA1E0639C78F208D550F799FBF10A705B2B6E0791C8073DD899EEC30F3AA855AA1EAACCF9BE7B401D9FA70F4DC487F9D73E7F7916039B0F5819FE3409370EBC46DA6C638B2E8FB1D86CCC78E0BFFCA3EADE664CE216F0B8028CC1E744540D271C8CAF0A62CC58ED8AE167B0808DB154F2AF825714B68A101C3D3F727921F8B9F49B65324F80E164355ADC19FEA7C8ABCA5BB0211049AFC5880FD33C23253261667F73F637AC54F4932F88D0E24A148187E6403BA3DD6799E3980FED1DBF8A7DE62B5B113091F3B42050F06B9A410DF667C3059BD5ECDA350AF110C04028140BF3D62E0D71EE197A93AE1E71FE167C13121EC062EFC8D8794218B21BF3F1316A85489EC181F2FF53BC548BF0856D1A683563B322009BAF0E7FC13A53109B6E8418E03964295A4EE4A05C2AA3394865574B69FE920A415D047E8CF8782ECEF8B9063A1734BF5AB83A8370FE92F579FB897585DF8533543799516FF0E3B8E683AC500BAB2CA3764428D929709B1B8D2065FA2B33D149FB0E1F160945D1AC256AAFEFBE3AE66EB6DACAA711C25DCC665B4977C8D87001EF0BA0FD4F2A70EC6BE0C0064CF672EC06A48BD94177C19F090310F8FEF26E0230D736BCAAF1FC122BF8AEA3C3F58D7DCD816D6CE32007238FDB2F528B661C617672280708678490FEB07CCFA6135B59F02BB0B38683004876D612B6CBE747E9DBFD9B226FC5288DDE41C97D78D7C107F2343C81A3786C64A7B978A1780CA8874BB97D83A92F49CBFED09ECF8A9025793E739A4EB77BDC22EED4BE2E2B78DED6752D1EB72AD64016198D3DFACBBE788C9BF2136E6E8D452D179FE2A93BCF9057FB122241C6F07D3E07CD53F01DCCD2106F2C28FA6977F9A90D5429E058CC80352D6D140F262ED22C710EAC5018DF4893410315D6C945B7C88C2EB19976E35001BA38E8E9C8C14444494A47CC6073C4C42A7CD736EE57F73EB6973C72A7D25A260FF085A4C2AFB8F150268E537C43C73DB55D7340FFA3DAC0E83E5C66D04C8592996A698872528DA44FE76C2FD9E1A2A4550C73345682CE1722CE8778EEF18B96AAA6C4297A7A0FF233478BEF8D66EBFC697974AE19696601DC3C42C29AF36449314B2F6F1FBECE7D314C312FF8E8FE1C98A79FE0D9CD134615120C92033E61CB6F9674DDD33F7A3AE5752C53BD10E1CF3F4AFD96096026F0ACA7C32F108897E30B0B2C395AFC7833B48BFBD7BE042120187AD5035CF905FBCEE2DD2EFFB339FBF0890D42DF684D6CC543AAFD21A697F716E8F13DECE5EA148321A9D1234BF56F9BF04BB0D7EE99E17ED972D4FD33835CCAA777FEE7C4C35C0A2497B0923113C1090B1F494E68650880398D79A54E23F92F790121B65F3392125FE932D9141B0500BFE4319F1CF16BE440950CA49B6B8F99D2BF578DBD0F15D7F8F90E06CA8E2F7FD4C3A9293BEEAAF1DBE1B7A4CE7A09FAE113CB883D62B45D6CE4C6FB6234F247169DD562395CB7EBA9CECB1C34D8C40745FA40FB4CFFC24CD58279AF9CCE9996EBF57618A83F3735536F0A7933B22F577A5E56E8014D4956AAE6BFF69C2590E151F65689F2ABAC91727175BABC4C88DC023D38B687338B63FF871816904D7B2F332EFAC708383077E45266317CED95A1B6B084421200D2C26E53A54754FF3F7894A84D0B7DFE385F5B7BC7F9732CF93D8F65B82FEC601B9306462DE0326203661BFFDAB50C18AD7925952146B9DE2C96890418F6E9E6119A770747EA2AA2E6E5B846AC0BBEC7A4E54BC9DCD4BB7CDB44E4D4775519D5F9781FB27393CE9161FBD310807A9396910BD3488A6CB3672544F6D7CB88084B6C9B6CCCE6FC377AD1BDC166AB234918F1CC851B9469F600640C9D144DD8E47F81D5F6611B212E33C0213E3183C1AB3EB63276444BBD19B3E9EF6CA121A1333D3C0A0A1A0C82E79ABC81F7F8E9627342E8E2BA0AAA53E300ACAC8287BC7371BF695AEC05D23F25ABD7E072C295CEDC8352F0C24125E5D06F0C66D0BD2AB3BDBE909DD6F85A45A689ECD54C9BD5EABA7EE346054A665BFE80446D57F968CE2DE60D85C6759474223A334F6270C1658293F1B2A1EC9C5F5976FE5EABF371917DD63DED6863A3FBC13616357EA6B2C137FE2045890CEC7BD24498459AF529509DA6CAE171512A2F117C430A74B39A9A3FF777D05DB0976574449CA0CFBE0A3178464FFBD57BD6F20E77D91B7A43C7FBD9539ACA4C00B4D84E3902414C2B122E0B22F8CDC47333AAD71B6D5DCA174DC9BD1D6FA6EB68F4247A398125E1370F33B990410890F6721AE2B98E37230E1089C4C4A2C428FAA89D84DD0CC6FC9001ADB346AE62F1F52C1EB6D32C23F45A6BF18B34C48A3B9C3298E336E985636D2601D8D449700FEC9D8D8255001B7AB9778295F9D72C8CA908079DF3064DDA1EA63A245E97FF17754613B784F9908CD86FF8AB0163476C25FBAFBC1C093DEC68495E20ABD2CCE1A1EECA70D86D79B0B9E39C7924F545D8955D15CA312E0C5489326D284556C40FAED08EC71A3F0B1E216210C3F02BA8EBDDADAA780BB00D497486742F74981CE103372A9728F69AECDD9ECEFF027ABEAFBFC1D451460F661AAB77DA8732AE9F88F96FB264BB1FF538C0923E8BC5E0FFD60C0142C76530CCC94CA8FC0374E79A3277CDEEFDDE7815CC9B395E4D1258A8EF06D819623FFD2F44F423BC787F4B5F6DA6EFF8AB84C07E5E7DCED4B87C778E3C7F8994EB06B1DD5D349AA4C6ADA0CD9D6EB07C9ABA01F0C10CCB351CA547043DAB2CC1EB4BFE1E7BD0D7B317FAB338C5943BFFA9B5BF2094B8C2E2F17A287BF3EBA8F90A75918D0C0B31E53B1938BBE8F614B7B6F8272728821F6AFBC6130FF7A8AAB7D8EAC9755760BD7B4D528A0FF941248D800E9F09FA8264F4F5A643359C47FD10369A48332D65A015FF32EF7673B5BF06ED1919DC04AE9DD3163DD29EDD7F9941D085D33A39BCF7E27F8B335910971545D49215B5D66F91A75B5C85F8BC89948FFBF25524F5691356E7A994AD61FE7FE82463FCD552080E5F22300EF571A5FB2F9874EE1F7BAF955A0950BB3E4C7A21DB17700089A88C9E924A7017E9B7D3DA1C5A83961D9255F166BDC52669E58982D83BE76ABFC94ADBEFDC30074245AAB4FDD68F02E663F0C98FDCE5010889FD3BA3730E42691B5655A56A4758D16CE3C1C43F4BBD61BFEFB28C02F3DDA2F56A2ED2B6D9C1B8368BED586DCE3A870154FFDA971A14C7A67A34CB21371651675E3DF1BD51D64B90845CB483421EB44255F5652D2ECC28F34117900839B499218FC441FE8812DA9D75A18D3851F2408CD0F98B43F7E027BCCAF109F1CD842FE42FA3D2C03F1EF0192A700BF52572BE354219C00230341C29FA84905F77057EAE5430007E46C1D85C980249C35E4FBDE91F9B17E6E2987D6205A71E198A11CA5D798139ED6FC4D82420B14738BA4FC6485E78691C956F4B45B9DB924DEC3134738D1CFA4CAA64D371B3B0072E114EA94AD32D9AB9EC436B47F88E546088D660FF474216E106448F94795C26EFB53EEAF891D86F81650D5108BF0DFEB4DD55BBCD1D57F09140A89D6FD7F24E936B27CACFE476C8E6B492AB237FBB59952C73366B1328AF29F4F9291924BF2C92CEECF38C50B31EA15E8AD350176D45E81E2B43F1DF460B4951F9309E4640BBF781BAFEE44AD5978656B327BB9ECE951937539CFB4B9D03CAA83D9D5A506EAA77C0112E2F0041CF3B783F6F11937790CC8C1C660DDC8413545D0DB1762D6C84F0C51518CF8561F887C911241DD3B68F711CA756DF1FD0355A507F3EFF6B47F0194BD1996A099A297F4BCBD920EAAC6466947399EAA6452E67917B7F593AAA6A1567E1609A3FB40E18702723F479BADAE18F8C3A65FF9A30AC1C5B3BE40C61E93818EA81F068C85D8FB47B3C2A5CF0A68FCB0AD0BE76E462983763F18FE5DCBCBAC97C2551000A45AEB3F359F0FE2135131C007FAC165C6688DE8339DB731116FEA92A6D01ACFCFE0C2AE4CB3E77AACB428EAEF59E7A02DB5523C578FD8EBF8A752FA1285187CB59AC2EA9EF187429E9314271548EBC85614FFD2FDFCBC46DA8046C8E2FC9796F07C9400FF4FC2459AA41BC0B5D44F93A5AE886139D78F3D1322DB051752A857807B1C478A18816AF5AB82AF132A08820381402050355A2F5023E87C762EA4B124BC3EB8D2AF598C7F7DCFDAA379FC71B3E65B18881B81A18544D94DE9EC3EBE05B53B533600C034014147358D4F1521385DBF7BC3D3E0F08459896CA3392037044A095A9D5C78528828F41122180DA64C935F90EE62C2955DBB313452CA5B84B453FBC55943FDF027E707F4E644B0D46237ABE076742778D8A70950DAA8CF30F51773FB534D828473978B4DB3D020BFEE1B1F8C98A23474C9DE97E83FF2748651FBBB939D0AE0080A1A0C958ED7F1229B0AE4DFD1C58030953DC8D606CF3514FF28EC5172477E23FAD82F028CEB7C0DDB099E03F804ED97E3D97FD8A8E227F5F0F481E9041A6B84F38C919886E7747EFA129468D063A0A5BEA6C3A1636464237D5CB9FD27A0632346B3904C00BFF1168FB60C05D24F6E1C9EA340C232BC9F105BB60FFBC180C3134F4A8FBD1357DA3FAF1D7D3233E2C3867F05766C8E219ACE71A1A24A727D40582C57F8E5F2AEEBF766EFB7B8699FEA61A60AA3C2F1EFAB784494C4833E152DFEF65980D343D00BE5F6D51E18558193E6485034FC38FB80F3D4A55DF0F49FF89CD895E488989B8E3B55DE3EE4A325F704BD141074D4CE71FD97A9ADCE8D1A0FA274CF3FE61482E4F897A43B08AD3E046C75F3D489BA487293505ABF7FBD44F00090EF9720DF2E89C9A7D42D20AF71F665B0B7F2447D323073FDF7BAD0B4C986434CCA2BE62A5A5EF22AE03043F8CBBE37CC3E2813AF860576E6E07D3E408EE4E48F959E7D3899C26B9E509E2FD72EC205604222840E13BAA49F50C152B5925758DE1E80FF6715EBA7C25E1ED515DBF97F7A650BCCC4CACC7DFF5AA49CE05429BFDCA28B3EECCB026CD727367B131C7F7F0DB7502BB0B99283F6F9DE950E150651DCBCDB0A4BE55B8064F4C12395806B5D034DC509A7E4155955F775B1DC138C14C7899837BF7AA13CE01AFE9771DF89E1799315FC5C2892CEF438A8660189EA04AB11886BF98C2B5D0E3CE4154502BFE93984F6C915B8621386B6FAE809B398FBFD08B111DE9012744980A75158025F67876619B4A28AE01B2396E9C00ACC3F51F38667C01BEF85EA1B22106E70C470296D0FD769594F1943F435E7EFFD90BD71E12CED073BDE0FEDFE3E5C30180C0683C160584F515A35D6F3A1E7703024239627FB3E129199065526037610B476827F4027E0E3E50F2F689CCF780F6E43816007119698613B21640DC00E0253845088038AAE277A1309272AD4687C1C917F61FEFBAF82F4FC5B2E817F219DC5629AEAC70840581EE5BC40526C8C29234E0BC7027F94F369F34D3B5B2EE4358D92ED76F5D7A2D8577F73B0448D7099C80D14431AD70C6758A4473005EA2C9FAE4AC96044A1BCD0DC9BB848B89F48419C3AB7AD05B16C6D5100A6EC888103CF4D06F38E3A213D5EA393402859C448DEB7EF7BF427C91F62BAB13AD10AEFF37282BA0E7D445D8EC1A67E5C29A0F386784D3FFC611868BD8040DFB40BE89B7421269F5277EBE791D0FFA969F38EE1C80DE22E19693918B003F9DF50022698756972862A62EF6F9FC4EED226734CB7B2D432CBA8E1D4704EDAFE017DEEAB7D3AF69597656BA4DFE78D239502EE66BE666426FDF8690726A9465C41C64AD3F4CF437CD7BC987B62ACB3050903FBADC328CB88DD276BC3CE43BDE4E0B984357C99968D0FD339BB25651C5A059A70F35D22A1B2689D5DB89A659C27D4F01FE59A0C7F01E56FDEEF687FDD099D9554E81492FE08E039B52B3AD6FA061A4BC5C0CA923ECC0240A648DDDBB2FC8FF9A206410DF4CFD70466F6C9426797CF437845D9C699B784801D2F63ADAC685323DAD4C8D09FEA693C372786C574AA5F7723CBCF55D76E2B9F80CBDF68A5705A7EC58AC7C867A0B95F821E46D550C728C263B08FA78085D9673BC0DABCF8A03D81577088B97EFE3412AFB8BFF2CE41F0CA02FB069770B74513120E1816C7679DA81A54F4D5D947E15D8ECD018BA67B5EA744B4A87787A06D82B37D20F9F557CC34DE321D8A72147F9BFD042604F59177B0D85E8593D2BDEC7E8D340DF83542344DD6E5C6F8CDF27B12B9BDF5AB723D0E60754A6DB2CF113AF0B360A602F0F151C2DF6437A7A27EFC32A16B5E6A36095F72729105261AB5F806BB54D5590694608356CFFB44B6737F4F4EE0103F7DF6ADAC4BAC8DFF774C6C2B1BCCBED4570C2886986569192162620D96D2AA86D9CB9FE56D15A8980A971A5F41D537E504BC01F0E34FF4632C41E109127AC5189915F044F9BB40CF34D3FFEA4CFE7BC382906160748CBBB3FFFE25D5807635AD074FC7D0F403E2AF9831AD7F812043CF4FAE084540708195404B84154D24B193F86E8C19E5DC3C4E4F817AA7ACF92233BEF3DB89300C0402814020106E80347D9C09489906EA9350DC1C29BC2F88B2671199A9526532E4B581C209023E9993CC4159AE1001A3B31E649919B7C05EA2007CFCFEE185182717F3C1AD29796D842566D84E085903F2DAC014120A7180B2F2CF0C82AEABB737748F695B02E792F5E9C7E0EC69D6E576193A6703CEAC37404838FE44110B7190B1C5EC1A97B092286FCEF614EBBF3264B80E0E31B36E4615363D162E443D1014CD8184CBD2FF48BB14C3EB555FD726F9F3BEE659E9E50D67247978655BE22585B20227A61D0EF02D1836EF4552151ABD6937855E681CF91B4B71922F89DE1C093FF04DEFCB48F5674E6A07FD670AC45844A40FB0DF29649530FFB1C512396D308CEF0C6060CEAEBF26CE484FE39881C0480E7EF2C76BD753FE30F36CDE37E46E909EE55F21C06AB90437519EE5AB7FC1B7D9CD87BC5F3F01CA89CFA79E1CB2BB3136DF4C4EE431A4D6B9DE5E591C4376FCB809C811BC091C6E2648FAF7BD38C95FD934FE2704E3A991228987A0DBA376AF7B4CA224910AADE534CC4840129FCAEEDE4A302CF601DC0C3C1C6D9E230A06CFCA0154FF0A2AD0D2BC07C0304088EE0AC1E38A06FE9049327A96B9B7F0CC4CAD281E8CAA5495F5AF67DBB3A1FA6D1F93A568F7DDC3F9A37C5D4791C181F03166E381EB3E0242FA1A7A3A0167CE76601E687FF34A0C3BD39DA4983F5C63D81E828B3167D5277D48E9C747291301201AF96FF820E42D118F8CA41F29F5A293BB202585BEA121FCD55FFC17F570B66AFBDBAC444827A4F17DCD6C5F738D3F2E296721E0DF17C8858A5CD653DEA2358987E6F1BDCF5BF7C8051588F9079ADF35200AED182C5B3D49ECE38AD41B07F5D77D6699F98B4832F56AFEB7E34F3CBF6546FF8E56E826B803FC791631443F0AD26793E366EC21A9B1C18BD741C734CAFFFB280F5847589823AAD376D93206ECC722BA78C9F7229F7B1913F935CA85ABF8A950D45E3398DF5A99544D3B9229CF89326AB9F8870DDD646646BD0063ED551ED9E52E8149A6AAF9D0413F8AACB4108C472CA355768B02C9D5830E79381E9CF1DDE2D6B7F129A296460BBA6B950A57D2DE46AFBC64FDEFC7287F9957690685C0EBA329001DC3CAF61007B49EDAAAE620E8ABB178E6370FAD152F57A4116BF2525BCCEE14900C856C9FE8001143F722B28B0369F6E10496946D576A4E7709431FBBD436E57515A4E9F16AA7BF8D8522FC197DD29030F5E1F14A71E7207BEBD2FB4D69068CDFB8829AB8915A634CE8796108EB442CFFA611E48A6A062AA2D392D585DDFA3C8D234751E66A9E6034AB31783E29167FA13DCAA1B468B6820402EA5F91DFFF20C55746BD47CCF4D4C84EE82B15B169802E7CA3C24D820A02665D0086410982A4F9468C40B315F1294E210128D307DD62FE39AA829FC5A890FEF4285DB1E5CDF866D4A47DCBEFCFDF50A68C138708523BEA0D5101BF584C788A61D835C2FA092134663F7E1CAC879D74B224670D62CD57682C2F01E1EFC41426DA89E39F543E51FFDD8DFDDAB73F847D109EC163A867917EBB0DFC637C429974DF2D442ADD8D78951CB1B9DEF99F5116431A3D330D201DF148B518A98C7AEF8F5F325CD8E6477C9422E21689F2EFCDBCA1AC7F365B9567E9E726AC24C89C884D9D45737F908177A436B60AE28FFB422FCA4528DEF10D76170D581AF2D0DAD8D5A67E4F4733707C0EED6FFA250977B948141EE1437C2F33FC475337A8636C4B02789AC4136492284D934735218942C5C20AA341CCE4F6D764CB673045BD46E17D1EC0D44062F24244906390E2DB8006539FF423A623FAA8965003D479674B161A1FD4F3B299432A3A71AEA8902A99F5478D88E757B1BDB4BD51BCBED2D9FB05A624CEB18AACF9557BC4B52EA0C9D42071B4DDC3B57EDA709D024C1B72FAF50B52F023C0F3E7150F103FBAC27782853EDC90D05DA34D9E66C59525C6BF46448E30C69C6C904856074A8B6F29FF60DE9FF7C80964E25FF97C1AA4E65512FCD0170404F22CCCF0683D33391B623F8072209972FDF9EA8823FE6E1B6AF9C7A1CEF829F136F85861CBC38BE29CCAA309F68A35D2BD1CBC8403D9BCD4F918F57880E9E4E3C64F2AD97043A44434068327FE9B65769CFA5EA2CA8A3F74B2C4C8EB3EC2ADB9D8469B78397294C5B74576656F497DA38E680202429165EAD7FC6230D5AB9232F935611562511D6F78C95F75703A6479C8E63FF5EB4A4F4A6AA255150536D2EFE93BBA9F46BC3A401BB5FEF740828D7D0D53A1925DA96FA24A76A25DFCFD6D0E35588EF4D6879B942FC1CFADFDC213ADF505D1189F536BEA99A49E2206501F8573F1DEE4ABB39CD52966DDA731E3695C27A588F2ACB59F1D634FA5F3DBEF04EFB6D8AA5B9F331A1254916D1E4ECC03844D1553D3C42F712F6CDAEDFCA51C94CE0AEDB91F2F71ED39BF8F89C51C7EFFE5ECB07C04A73252F9E2D7AA9BA8A6DB84F576E732D3BF8F9CED50D48CEB85EACA13BFFB669252767938B25A1ACDC660CD057B1F3C4CE25025B335BFB22037A379C9A470A70276BDE3659E34FEC05658F969C88F417FD476467AF76B204C5956C3FF1F9507B0AE177273F65FB0ACF998FD82FC6644D090BFFB846C11B11281C1D2C3BBA770D101F54013E9DE20BB9A68E4249FF7DC5BF9EC47FB7F8641C378669E0AAACA2F66544AE99326F678F9878C57E4DE43B16360D749E93AE1FF2C2EA29BD45CF2051659C76065F948FE1B9CD0F1979A6C5C41608B3FCF2CC80047ABBCD9C61A153E973FE0AE73AA3BA2BF4AD828E286AEF9FF411A0404477A2DAEF4825BC173EA3B7C4D6CE493E8A556F0925FECC4126C9E9E8FA5BC8C3F8C7B710C44ACE0DB7AA80D1060D9F41370E8AE56372E7818F1CC2299F36C2FDD8C4FF3781834E708592BFB060EBFFC36E138E843AC86D4A877FE840AFFF5B0C90EF3D0B388B9A7DF03F03DF7FBFCC7B9D87BF3FDF00CD85107076A31638F0929E2CC1318E8063ECC5F77823BDE38CF9063B99887BB6D89D529A2EFBD05D25AE4EB86BB83865788BAEBE217B15F5B5B802EA210248C639A60C4D67EC842007CDA8703456AF32A3158780DA0ED94184AD0D4EAB5A18E23FC06CADCD0B2038C8D109F3DFF78B7C8A9F003EA9BF88451F2A5D891A20E09057592239110911508922EFD3040FB923202F5B5D4AF6B47AF0E2268204DE47C97BDDD75F7671BA430FF59CC821150C773EBD256FF82F0A5178B3BEF836D6F67312DAC160F87B48F2037AEE2173E5727783E0810CD794031A08EE9F22E7EA5FDDB67E5D7A97935EB4F722797530A4427D04DF760442B3B39417456B306C26403F3FF20E2F3DE0FA9E95ABF88556450553C4A5BA2886D96767264245C5047663D770314571236DC0A979CE1A8DC7B15FF515AFC9902F6037449E62EF92EE5D6951E5329566984222A9D1B39727D66CEA8FD6020CABCBB5583BDF88A0C0DF1A0F4DAE3CACDCD3DCB802137837C42501831BA971C50662BF820EB7A67505E20918F0F4E8DB759E4D7EEE362CA1E0952EAC5B22667EE44B00241218F0826D1E58D38B1F0B7BBA0D83041D9BC3E861A9C0CF19F36EE6EBF35A8BC3E4FA6C689FFBEB8CD3DD33A20B2ADE469D818465AF81D78E2E20243DA0F162E9EE81B30A2C997AB7AFC03F8E7EA30DEE217A6C4AD7C511A91A85311F24A175F8971A7903FEFD7A7989FC8E2D81128658A54C4C8BC4A981EC000117EC5C5ADDCA510070D225190478C99DAE5B1491005D2AEBB961FD68E00F501E0F5B9D0C3D6126ED506D57013DE741EDDDAD59734D0ED04E52E7143FEBDF9AF03E641281389C4F4D9D1F07925D9FDBF12A87EEC80A59CB8247D53042D15670D8C88AD97F185141EB3C2EC8A0CEE5F7E9AD12E92B58C1F7841E45F5EB0048883E5A2FD4C6C68E3CA62F74D8070CD5AD3641A1A9544B4A516815E68650E5D55C45CDE3BE85A1D5121EB01EAAEC8AE305B3ED00613DA69041ED20F03BCDCA514B931AEE89130E1757BF4D94625097E83A7F2D9EF8D721055C9B824E0009BE5D7FBE68A3035BE31C609EF6769B3F71DC2F8AEEEF37D29A15CDD5F1AE59F20B94A19D10DD76185E681C8833B3700068E3258103B5B4DDDAAFE9FE9961CE218B089F3E6D831242CE9EFCFEC90F510F70374B7F57BF453163EB6082C0D70523DEE9372433542DA0CF8DA381221E8050F6FC888A6B8C6347E384087765F59C5BE2033E35D3DE248AE160B28198AB014801660005BD8E73DA9A3B55E7BEE63E767F399E509CA3DBB628965131CCBDECD3CF7D6054091D6FFC345EF6DF5EF221AADDB8F7DA9593A3BF87E8A09CDEB2CEDCA1A882CDA1012B81971BCB44705F97BE205FB562E24F60FF0BDAB73B2B86FAC9D28BC0C5748897C8D79A60EAFEF4D011000D42526068F97E17915AB48F2ECF3A2C839948F0AE521D454E6F7D1F30184088F11AB36E4CA2B7DA83B86CD6D365BC9B621DA2F28F594E642702C6169B39BEF917CF66F3E6D723E19FADC50D63CA1FC2E016FE0FFB79D877E1820606897EDFBFDDB948AA1F269D96D5DB6725108E3F47A13A562804C949BD08339808ABF8FA88CCBB6F084536D187988EE3CC7C39F8BC251A9D271719C292FB7D9DC09290469BD4C342A35759E045523924A0C0C0341C48DA3E740AF7131866E3E36FAAB2BE961D9AF4F5B51093F1A93A2E02F2F97F97A6ABBAA5529795DCC23557797676B02039B5C90C88F363B05636FCE847FA5C89721FD13FACF58C62C36CBB62C218CCE31004E6326CDE27B30CBD20EC3F547497B6DDA8072E359C7D5541E7425AFB0F6A1880E3F10F4C12B1A224B5DFF638963421CA2B0CAB66CE08043CA6EF8BF3B9ADA7DF5E53101F57D7E7E242CD7EE1C41A09F247E7BE9E78B266C1506BD99F9F314C3830435ACFBAA80A315D0DD7FCE69002FCF938D336FACA66BFBD9597451C4EFC707B002D5755D8C6F028A749A60DB79278677AF109E0DC618956446BDA8A94A4D04A519FCFDD0807A5B7BF6946394B7AE854130F5B6F9AF2DD8679920EC90FF8B52759F98E2D928015D81EFF83E7C57DB94004965B7B4B20609EFFEB710390E005E70B6022172597ED79819C05C72DE397BFC29D748A5F4EE4FF53390E9D34A0808E50629090CD9D0FABE179C221F5B789EFE5FBA689C5D70C7C29D14E3DDD249EBFD6238ED4DBDBE882DE2B932F1FE5ABCAD4D4360EE9358D6AA2D0295732E2ABB8DD39A4A681300BFB23B031029D18D2818AA252F375D6D8FFCA1B06215FEE690F406B13EFC9F8F08D8FF7E6FF38A46CD0B3BB9418E6896EC5AEFDF01B04E303498645CD1EED9903A9D37DD59A1A44213E1765C6D08BC6747B80066D0B839E622B54BF0D8E6D904B97F91978D8BAD490CD59C90768EA62EF3BBBC40896A476BCEDFE7C738B2B02081B82E672AA96B3AF5325F787963BA729532FE84EC52FDF6F4FA3B5AF6B5823BFBDFAF13599CBD19FC0DC0A0B761BBB3B1F07EBECC3CE15F30059540DAFFABFF687EE74C3E4F5E5E8D02D408F760CCFE7C2D65A8FC883A11EE2AF55E8D65EFD82C613263643785AFB1F011522801984DDA228B211AF09875E93619CCE619CDDD06BF9EAB0FE7125D635D9C920F37E63F75D24C7FAA11AF34A345E8425692042A8F4FCADD4FA39EA71AAEFA6EF9E7EDE5CFB83F3D299D7F6B17B7FFD3818A7ADD6F45AC4041E64EC3F18AB67A610278F7DA56534CD0CAE553D1EBBC5063299DE6E74F894E21B818B668196C8B1555313817727D62185A8807A876185CA6F8CED482337109AB042C240DD07287AF4B51E14E6840CAE8C767A380772476DCEEBBC895DD20486735E75436D460948147495171D90EB1C45FCCFA3F4433015CC4D6FFF3458924E8B6CCE8ED4F95B22A96C78452B489C335ED7F797CFE651A8AFF4F59420CF0FDFBA19FD3919CECC3F8CE6CF209267FC96D8FCCEB81E9010CD4A52C1ACE6360B7E1B11B952B2F17963524EB6999AA4A1F303F779674D45B8703F40EF08AC4E8029171D68DC9FFD0CB3D279E65EFFA41732228456549A0039C574C045EB9DF00B51025A99A4D3972481FF5C4AEE13F371ED84C7EAEA89DAB8EB40B924D84FF3744F4E9D77F6468210E40A12EFC9A3A47374DF2B297F32B784E2D250859BAF707433C727658404ADA0F2D00E522CF6461E21E36C758A06D0487939ABC010DC4F5C30FA640416592D29F65A568D45AC3A1A307F3645CF8F1D4DF457EC87D1C1189F044BE0F73A46D98F092B076D9358A163E67626E49B89F9CCC0091B0730CCD0F9D7DACC8D4BFA57DB8AA7D5E02D978EC787B9AA50F11F7B8EAF2128BD6A671534A9C85848E0368E508B605656B273AA8C99FF58ABCBFD57EF3AB65346A5015BA6B2AAE654C2CB3EF2F9C2414F20827125DDEC813E548CC49B121B04C414D37AE899D90E17F7DB880405F53E037340B1487B3E716FD7BEDF24E0A86AE2E188962F9EAD168A82F26241EDF034A47EB10CE69C6D123BC31F8EB50F068E0038E7F11A64234C1F9CE106B9A6E50129FB823C524DA7416D6C24D2A8121702004F0AFD9C0130553B4B5D62EDBA076BCF9BAF5538A62FA9DACD58CDFB74492AEB77C933F6FBB8B92BA7DD8EDF7EA19D211C691812D9FD96362DCAB596A9E97319CA10A5C980C00AC4DDF830F5BB32A5FFF6B65AE8A9CF79C0969CFA432794EEBFF1E128E3EFE4D140D057722C481E0402010080402DF40218FE07FD1C3664D8696026F4E838A171C2B37174DA8289394BB8934C8685570E6AC665448C24B5FA77958E8B22E2BF0AE6AAE521D31D8551048BF497C8003A79BBF2CDA65120E33C45E091B19A4EA8A799374FCB341355529941F487622A2FB56158247D0443F18502F72D58D940F70584D20B373B3D8DD1CBCD5C92E7E15281052534181DC1BDE0096C7D44B13D0B8CBA6776003F2A402C82AD02158ABB03B810289478BD5484CF9FE4223A1904768487479235C707A7819364DB2BB70686868685292CBE57392FC012F7503D7ABB104DC24A124D97EBCF941A1D9A6D3E3A00DEA39C29870BFA75D16B496812D021B69434393E77C35CCEA9ABE15CA21D363108818E57449EC849C6C995622FFA905D9E9E11074BDBF9DA57EE5EFF67E1E678C2187CF0904993E68291C38E415301B55005132C1540132D67D1989F56B7DF46A9A4105A5B4DB5057780E14AE612CA0F74DBAA924BED799EB53AEF4C3808E9FC3365623ACDB0950D5C9465A56580882A8A7C3FAA60B835A9AE500992319E0D0FD2B23FED2BF3F84A7DDC78B4C5C952EC7CB698CD056AB41038B5B56F9B7602702E5C9BE2A000A79F0A9877F74A1DAEC8FD4972992CA8238E1D47DB5DAFDF79BD0B23B895ADF04A3390B421B18082DDE8A6E8B2BAC48EFE263B26C478749A3E572F68DC4069B7D93D0F9A54C6E84791540B18380D893EDE1A5226C96843BC51B5B4AC57AD2003BAFBA24AA0D3D77A8F05B8556B532C0CBDB87A816CF58B6A86609D35754519D78FB286469903B9E7E6FBD08F830C3A058F619DD2B67544443697ED77373BADECD5915814DF6EE39FD4B111AABBC57CC536AF822A9FE8709DFA9BFBB82D7AC1E32D0A11206339B5AD672B62AE73259BCED51B677202459410B71C091751EA2A403F3B319E4738ED38DF561D5B4423D8D7059AEB1312EF365DDF52C20DA3C64336CD748A8C81A17156D5C2162C43F78DC4DB8D981289BE74DD9132D6F456F283950EBEA0ACA9E60FAB36CED291D6457F0FF8DDCF56997FC5113EA830AB5D211B039C3392B3759E3B473A2F0677134CD7B73A343C48AE159171B5A1B38E3A203D70F60E30A41CE08608080F9729A477195D1AE2B76A31EFED3D70BE6FE10048E647A59D5601A9D6F06ED40805F589A268B277D16F2BED4ED443BF7897A7370CAE14EE39502B37C0753D6E797CD44657184864EAE53287F83A683DB90B95EDDB8F8EF7F3A972238899E6FFAE05B5418B0200E4B8B4B70FDD6E2CF9BA5EAEE24A61E78F945EC760E9E9A2A96E165230C3ED3A370FFCBCF7FFB5B2D1681799872701AF031527A428F5F93D78F2B8FEF567AEAD2FBE13F6F63121E2BEA0B5700F06F936082A8FAB7838FDEF788AF12FD735F9C2C6990B6BE27466CB71F4F9E24621269F1162ECA90222D2C7CD90FD6B9BC5C2AF0FBFA235D7186461E6ADAA8FA26C427168FF2CFCFB5F1007A497923C359E0E4AEBC29EB8AB0D3AE0DC701593D34367B2A7941392FA66BB3139C4CB14A430C49FA884C3BE34CA358D1B9547EAB4D9584321FA72B3638274034594F49009C1386010FE32EF694192C08FF557BB224F3D84791D0D1C35D52A9CFE070E8E8ECBBE8E6009F4F4C649F51165D6E1AEDC0D57563C33BE5B66B5C373BB50C0F81F514DD3DC4A7F1A048938F46FDAD47CF6240EBA8A4BBA79F88964AD6325D394902561C43041F0EAF24F4017F58BC5CEC249EC059EF4DEF45ACF620D9FB725444FFD66689423E179FB5912BBCFCDA7B27A97A5F352A586AAF96E062D8BBC6E1A717B8AB64D8D99D0C11F0B0304E188E08E7D885285A255149F9FFF1339DE185769332F9F3846FF3A11B5F66315D8181551ABCF6E09F0BF6EE14BE5D01F0FFB6FAA7F51DD30AB6A2A544E69E249C377200F6C76F951E10DE705E1BCA93109C4ECE3FC7CBB528D107FEA979B0A5D3D8EFDE9D704F2028E411EEA66CCE187B59930FFE9EE71609EB848BCD93FC9052C9B32924E5CAE1A69187E4620F505EA5D58A39354ED8AD49353FC9EFC83DA6A1B9D9118E4D67E3BE6C98C183A401FA89470C613AEA49CF873E487889DE039E014642346F18130C0243467D8319E98DD49137F95D812BA23F1B892FB613D24615D44952BC06F0239F592047D5603A90BA4021A468B28A318D451E5E78152250D52AD9B5F5EC6D893727D6AD0FF3D593D5BB8A5909FEFFDB7D6D5B649041DB1DBD668820B9CB83EC276EEB1F3C84A22932C8773C16F0BB21FA1B9A79AAD303F14E53399FB9379EAADD9156F65BFB48385BF6D0026EF868E82111FAC41DC75F80ECBF7A9B66BFBE8C72AE3A81F8A6E15ACAAEF948C1027874BFE54EE1E3F421694753450DA3D78D98D1AAE3360FAAF5D757FF178FA55D5EABA06C9E4F97B3CF54C7A54482FF438506D98FD38A87CB287138A8001984E07EC59340A6817D918F9E39EFA749BC8A18A64BFF0B2399C2F7FF34EBD8D4D4BA3EECF615F8958663D0D188476D4EB2C45D714C0F18F0A3B8C4C192D46300DBF19A0557B475832800242ACAAB367B4B48AA3FE23EDA0528D14B2D7F448ECE854FFD32EE9C5CFDE1F7A70F911A64F2CB3C34856CD38C1A6A1DEF773FA1FD3B6730596EB9F740E67ACBC047CB1F339A8ADA425345FDC749C5A43D8A5725D460CF88D03497868C84EDCBB9947712E0E7915BA54E1B0C0B9675BABFC7B71A8BA2EE62FF444C1F3929A09C5DE3151A84D70E86421EFCAB3D488C56CFDCEA7FD79408659E75262A068162CFF37411FBC140A2620A6E762B875F002F2E6C2C80E9EFA7DAE38E36B35FBDF89EE4D823014B58008F21B63CAD2E199B6CEAF18D881899DC2698D4FCEB5BB4BA4EDD35994AF557B48E30D05D7F4832470574221DFCD37A58725612F62D4CB9F113F7957A5302EFFF5948513F5A07CD6546DE4524CEAFD3A0203E706B1852B84ED1B02696B4B7CB7C7B8AE36A4A02807CC39D443548807610A9B7BD227DD0654A8C0D366BC810A960C15EF7F0FF04EB04B781263FB7A8CF75898E4EBF41D88EEE28F36A5BAFE039C6B2F71A5F822130E31EE1CCA04F966136A5BAD58AB3CFDC280724E2C3845528A02DA5ECA338B51ACA83BA831429D568ABB6FE285934CF7C2B8DE7B0BA339CF8EEA35DF8EDEDFF84147CA6119CE6C5F4353C0980BAA172E137EC53672F3A6EDC583B7C5A436D5B56E2083A83F2548126F96765CD4B343F3B41B061515483D8E9215AA5B4AAD80A7A4079C99A9AAD02F90710B657474C07A033E4BA4CA3A4FF66CB5BE75E4360929FFC259A2685B4EC9BCC33FEA4C0C80061F7FB9C2D833DE375C63D3A03578C0DD8FA4129C9F2B42D6424D5C75BB458038960F51B18ECCFF051F9E3FAFBC764C9AE425B4750E25BEEBF2F752CCE6EE78BE5FDDC6195B32E33EC4F033073731B6E4A1A76B9EA15AC667E61CF88F85E3C0DE138BC292F117EDB6CBC19C37AF8C9721BD6A8687831347FBE273D5FCAFEDE7D58896DF362B88D3560623AAAA9561FC8180DEB28770C36B874C798448CEFE651B0C34609574D02FCE3753FB7804D7E9A3068C225CA0D5DB8D791633F74810548756D777C60425A3309F3E22B5D51BACC39974139B675837B00975D42B8AEB2ACE73D8BE545A29A8CB4CB297B3145AAC3A8D1ADD91841A2F27745946761876B90E826327B68CD5B4B007377D981E81AB903ED7403019A51590FBF7E0AAD44DA1891C553BC83813DA716BDB42ED4E4EF53989DF2C0AED1995B3F47FCB4689F0366834AF16EAB20BC9FB78BE8870148BD648314079D7D519D440B758BF106F6D94C7CFE89E483C191E664986541F1405009BA6111FFE41FC9FE232CB4B02DAE324AD9313ACE060E62AFC74A390BF1FA4E84C9FE1D6030407B14D837EF22E12E4376C77CFD2D8697A4F74C85D1D22D134340A816B5E9B56FAA0B596CF87AAA23AEB77E87C2CF56297CB6E9CDCB41180A0394A63F63ED63E23FEADB396C9616916F8A0953683A08EF420F6DBB489E961A385699D43EB4CE515B208437418427AEBBF67E18A08E7E1B9EBED87F4D0FEF28B49008DC94F9890CD5796770EAA21D7E30BDC5B604C0D1A34B8620AA978535D93DBCBFE523F85CA60B82CEDA6470BB355D25DED3D8F8CD194826F411921A551C8B71D0048B6161B890E09F47379D6F769EFDE213FC49E3FE6FCC883B0DD90FF66224C87CC63FCA965915DE277056074199C8C22CD693D97941581F188865A4DEE8266F77CDB5FB186D228472AEB6B05B73C630AFFCA56BDCB6AB50FD3C1A2400B09B923609F5047FDF9F072A5EFD912457256FA76C9C9EC67CD2296AA34A133A4C041C720FB3F9D78E062BE6872426EBE899139C0A9632182A744E28BC8A51ECF9C3EB8462BC22A23517C0C843A7C1E31A72880659463F7AED4A6B9B887162A7DABE247642FA45D2EF09AA6E39620AD1FF62E0F4B04C57B5A20BAA89E2956698E78ABBE4531C665BC48084C7574D395E1119AF0398B19B4D498C97C1AFFDAB6F820F560D45DBAA098DE91835B95D0A8C2045A78A4E306F04FDC51CD192620EFF0D1EB1BD41B636432A8864F0565C9C66EF82EE6F43F61315630DAC6358E5FB5CFA1FF08CBCECE4FE38FD3EB960E2AA6EDCD7D6937FD7FE1B92BA89FB06EFFA96C2FFD81D605BF920F3A4DF6F56F82846C7073F9C274FC9BB4C8EC308DCC782E9850B49C95EC556C6C9B213D2213EC7605FD1DBC4EFA38B19DB88DB1EC56A43F30E35FFBA4DAACCDBB1A2F379387CC30FC419BE00643C766A17448AA4A156C83DC449714AD7EAE0886DE7387B1AD74E967A5949D5092900E9BE8F1DDE138AF0EF00D9C58A5F4EDF1527ACCA2034033595CD97124584EF73555F2546B1F06A77C145AF7BD701BCAAB34F4E5ABA316B53F0CFEA275D3DA452BAEE264796C7A8A096C000DFCA31E76CF1948D2B069101EA9CD94BFA3C03E281AFDDAB86F50A5C30CDE82240E72A03163D3C433D5CC1685BB71BAC8AC437401FD2604278269414FEB1DAED110D07EE443707C1D94D21E741218FC8B384EBDCB4BF0512C2B36D75BEBA556F6852D04FB9F97FC6AC742AE3D2B0C32C854C37C365BA60098B517D36BB0C2CD3E6F2EEC1C60CB699725C03AAE09F2E0A686C88BA52A70385370D4E7F57C48835C2A9676180F2D59F2029A7885A39DCD218795D555339C6E5D7F754E4D71B4E0F25537A7026BF2425E7E8CA06CE36E0E6EFCD96D4B7FF59195FC2BF2F05027A11B20CC96918B4CAA50CA3A8BA0400A8FE835723543E858C3728FB323B9137CB24CE6411B9806FFC19CA1FD3FE1E75DB0DCA0FF475BB193493FA634B8D0293B1A923888E63CC933D963F50BCC17D876467980C158ED3238570B6E724CA8D2EF611E54ED4EEF54C8D26FA61003B22CA885B8275FE85B63EF6518D27DC777A0E3A4E938FF1A7FB87653B8F91C900F44F59F86CD72F9A6AC3425CCA9F093F4BEF9D6B040A2735AFBBD70F5E95B7B44C04BC9104B62D47A376D313B190639739A3A82F4D9FF7CBCE743E543620B4FF7CF8C410071F4CF7226A5291FFA9859A59AEFEB35A04DF573C14381EF8B338C023298355EDA9345B239ECCED334F9373D76817D8B9829FFCE5CCE50B97AE6308A5DDD2DD0F55A182DD2AD49E5207A477C99283E9969259E48032BA26EA97F022ABEE7F3345FA6654E7469BEF9702B38D7E347D641179E42E7F196ABDCDEDEE9D4FBEB4D4E15DB8C13DD2CFFEB64FC619BFC49B6BD256CEE57ADCFDB274942A3D266BA10AE518C10AABB90F5728BC8EA77EAC295901ED072814B0B2FFC57066C7C071516AC93EFDE86B05A0FE6A2D115331182E9D7E326871B7420C6C12BB76DCA96F9489CE16BBF9DFAC0DDBC280D9B99106F63741F769F659BBB802F5AFEECBBCC3A05FA7A3AA7B911CD3BB787CECB8538ACDE935DF93CE8839D00E7721EC2F7185D2D9015ACC7799EDEDD5FD6040093944B9CD2163B2CD57C3CD81ADF5E46F1C19EFBF1E4488A197FF6F4E05FD30C030BF8B511EBB5D9F30E2BF813BD0F06AF422FC1354FCA3FDD4404F6274B3FD6327DC5BCE7D58D7681C0843B38DA15DA6F91CF8B1A8CBDF3DC91A9F49C2715B258765A906948FB12DDEF7EC2363687F86EE4EC4996BA21F0C2CBF728A64FC37FB2DFF2297675458F31125DBE93DA2422D62691081C83728EE0AF0C32A72C626A52F2CCC1D3B5BA5FCF02FA90846A6EAC1AAA576DC049742D9FF8E1160033E1BAC4390F6F657D54DAC80E93B5A3C58EDAADC6C9EC34C6125FEA433682EFD6E4156EE583B963B95009FCB065913848E83F418A97EAF4D58F991C404BD3B4AE591CE48F74B0BBEE6DEA77E49292C8AC6AF3C7A555BEDB6FF1FE8BBE8C328B3C742C6B4CB08F9F5B70D20F88237A0E0B6D3C14D794DD175262ED71C94654A912A9D25F47FF983C17E689F869CD10FD70FE427F3F46D4FB125646AAEB28B42ABF6EA29FC04C86474F867E2515C28110C609989A6ECDE8C788B918054D5BAF402C3D8EBFEE09B0A7F822210098F3B66A3013A91E6427D3474DAF3A383D93C4B9B4BD1B5929D248A6B334D1663486D9AA3AB1DD720E8C3BF18ACDE5FB1888C18A018B150BDD38A4FAC98167B97979600F5079C7890444CB4339FB210D38E91A65DBA5439C5E900758C00D322F69823C6C375A0EC3785863DF74B5CF35A88284FDC5E7EF4B883783A3ED32F5B408621E5F1A40961897701D232BDD3C12AA48EFA84F6C1ABA737018B64AE97E9B6134A12F28D3D3F0F34A3A4C154687F777058FFA9ADCD992E0EC5E422E5FDBE4772048859BFE60D74DD4D8E2C8FE127FF83F0159292D6D4B5E436CF100B43E0FD547FC0BE0034C6A8FAB90DED7C66A61B60BFCCB6A5AF14146BFAA0656A787574FB1C11F4FC23E0A02F8FAD0E30F460CAB6A168572EF488FD92B68638A03840B6F3472DA12C45CC5DBE5486CB8B9CD1EB771A8BA152A88B6CFC8CE9D07780DB010D0B2C71B8D33AF66151EE679DDCE11F048AD790CFD8659CBA9B2472CB260C363FE5F47AF4A4840CFD64AC5FE24D5D31280FC51AAE517F6B7F4EC4280B6D4C8FC252C6993F5235C7A571A1F989293191448525C0C326BBCC5E1091B4FAF20B2159E0FF9A2720B2189F3E6606D962EA0BA2364381991B2B9D843FBA5E061E57D874DDBF2FB805A50487FB2B4397B3C6D170B02654FB9639F23DC65D80DA78C4B6037110572601ECB79F6E5AA6FB1CA19562573513FA7778EE220329B24CDFBD3F60AF129C51893B57D5B6AC0E9E025A8091015A8AB6AEECD2BDFECBEC07823722621B89E5AFDA858CB73F3F2AFE4ED48576221A350C932127E2DAA937A359B43AE768639A2D4A89F93A066AB5EFF9B2ECE4291EC8649B485759ACFC0E7089AB71124D12E80CFA52BBCF734EB0B827EFCC9DF9577EAD4375C4F33CBF75072950CE25C5E1301596EE42229A3F1F8847DB778DCE220239CD101DF00151EAD79C80AEBBC991E5312AD81A6040DAA38B82E1BDE9C066DAB3F0B2132FE9F2D929567DF8E84F3114ED2954261B71C03EE4E572FBDDF69D8CD4C55FAB2118BECC20FC86D679F59D9F50816920674E0E958D259F8B9891D832906206E476C21F0C58DE1DC3EB7EDA71C6BD3F94B50E90C74A6C3731D0EB0C59AD3BFACC88211755FC8550A56C0D9167358C7495414254A672F174C6E443ACF3DFAE39B7DFF91E66ADFA6C16F2087D84DC220A3730318B18D2041FDE9E9200A1BEA287D76AEF8424AA4E1ED3793E34B49F51E1724BEF16FD3E6C2AB8E41CFABA0B08156E08398522FE14C67558DF7DD09FFE6D63048D1025FBC00EB91F4ECDF706527F093253CC5563815A53C5FE3F41A037198818970E9AF34849812BF2C1D971B57D3E78F2440626D60047997CE45DBEB3FF4C2BCF9F53A90C3924016DD9FF00874430321EAF94A46C8AFE86D14C22F7FF610EE7B2E1D6EDBCD173FD4ECCCC587F2EA99385A9FC5329A59E0CF1FBDDD9A449D32AF8939E4764200F00079462A4F5F0A4EB6E7264790C3FF9EBDF61A13CE115F7D54F91BD7ADFC2EFB4AE1224E0C2F06A90D09D7269C0D42680D8DBDE79DC9ED5DFD027F54DA7B57DB7A608F2D4D01CD101C50FF263A9720D82C8FBFEECBAA8E7BC967AC13DD6AB61DC90DDC25834AD7952C9557A460FF2D4FC43F00F3CDD10E8766505B51007C8C63CEAD3EE85F80BBFF31869BD631E7E5F0476895295281552AFCBDA8C73F001514EEF13D27153B29DAEE3E21FA5DE89A2F6D65FC93D553ECEA64DA0CDDE8BAF43D224873B043A24855C348EDFFA67824884ACD0508559338C90D6B0E1DFECA4167D0E187FC2E01588708D1101FBB058A3292321704C3DEB755D3E6AB295DBBB098425EDCF4BB3832BB7186A435D16F7BCDC94DE676811A08270FC84E666F5FCB7EB0B9A51C27BC7CF148E95E3791ED3932EF14FE827FCBFF1BE917F431F91A7956311E069A562E3179F99EC88997029E7838361FCD22B1764D66EBB02EF6F33B04E643BD4AAB1519A911A8996875497E8E3816CC00A8F99D7890EBE64E5FF2AA4D828A4FD84F65FF3118179BCA6063E64508370F7AA4EA4772165DE0525AAD60482B8873F6A46CC78D932545611D56453F7DDC4453BF42A306AF85AD50A298263E9A20B8F3438E9606F7AB9D4A63281D0015A7643690832675746D658E2ADDD25CD342E98BA30565CED0E61B07F22322CD5C0677D2A81AE6D4B40974A60BC0FBF79D1FD738C663591C72983F1CFAB5BE81238F5F113A1D019C820D3B9A5FEE4F754312A8900F47C1B0AB76490A86377E8C448DCA41592632E21F7A3BA703CB4CDD72CD220158B224F41804D79D49F7D6BD0E51F62C0CC94AD1939725337440F41B9D27D3E9005BA50DFC33674FC8E05A483516A3FFE2DFDA27F63F603BA20F9B0E622167EE799EAB0FA26842F9732B484D50E5D1A7F2C13AC44282DF32247AC5CE7BC33CCEF56884097FB54EC87B12BAE3687B71F4EF35E8B74088D0C7DD085C2A8FFFFBCABE25CA920A699E0476C7238D43C53E869D02B1F4DC95449A36E3BB8B6160B1FCA2BB6065DC45712DDAB269A192D23C86F7ADE85C31FC7FFA5419775E652A4AECD5DE058FC379C85CF6C2A276346044C45C011F34FBAB3B726EC7FD7EFD1B4F7CB6B17B321D07B579D3863908AD8649091A4FFDD78834042A52E987E47A5DF218B09E002177376B13285E3D7C259FAB3701BAF88B6A0C0FD80FFEC32EA914015518480BBF76697827E44B5A03991EFA2D08716537810BF74CEE4315923C31E20D2CF4D8D9433469870142A5BA1F3D1944EA41D277F758E22E238AA8411A7D226418B81F877EA31B895FEBE48DD8C85B6C9FD136311362DA03938E6A041FB6DA609F74191C37610F0BEE8BA212D544B8E805997A375FCC0FEFB7A6E90F0323EAA87F6A1BEC2E3E70CC25D197690CE6C8A7FB22B28FDE8FCF4CB51C1DFF5BFDC31CA493F3DD194C18874EDF394C30ECA2C47CCFCE16839CFBCAB14E3DF3BDA86B8518B9147C741478A272DA04878B37A1DC1EA0323731EF833DF5933C7E93CCC7050AFA85C9D12B323B902006F1F3A6A5CCD73D63FEB254655CC5B81CC3ED8935FE4F76A2C6F9D66CC093D3C3AC1FE79DEE1C689EC57F582197CDD2D45E23B604A4C9B320CD9F96390CAF169B11F069446C1E54ED74519C007C2BBB8EA3F8C2A8D1C96EF575DC716792B22309304D1013CA4884A7441B5E428B98DD54114A21D9681254C9FFAFD8F5C6D173AD808CDC35F7F8A6D748668358DEC40AAFFF2C79802BEA6F99F147F9B3C8696BCD1C942B231E02E8C7E953A4EFA7EC360F7FF3CB1D28FD8660BE83BB15F2840198E358915A593E649A6759F897069C6A498BFECA875FF77405CAB5E6AA0984DC06E940415A1BB5E1B84FACD8FE75083869B8AB9886770E5E4EC50F45578AFBAD139C5A9683D02FAF79D68236000F34EE3BA7037E5F42F850B0D58D613C209FF20B3BE6E5AAE0D37FD81D0D7D01CB03589E44361B50D39A4D3943E75FB4253E63BC2DD11EAFA8FFC8B0D65D269E7874EA4A46FEF04E09D6E4FB84416D71FD772C06D5678F9BF7902FFA26DDE6F749D98A4E64CE7A9A020EF144D0476129A77680106D4B5B40BD3766A7786A624A7FDC54A9B90A3E98CC603919A43B28CB22ED8FDC500AB851F2E36A905FA58F2B3F8FEAC06CEE54CACE45D7B75103577EE1D39D5632746E0EE6AA0B75D3E271AC12FD4488699F0F005DC5C0F172B6E6410807B81373624E8797EE7850F69D4CE22C98EC4F94CEF4583D2CFA8C85AC66036CAE727BC1C48960BFFE9AC0A85190DB72997976B3568715457E36F2B5FB8F063B466FD2B36AF63B7CDD2DA4DAAA1D08A88B48E3F533D474DF483011C143B05F85B8AA6A30DF1A356D4C237314BA02F4BAEEB8232B2A1A100EB5610B0FC4D1ED9E69F9D8AAE7AD43B76A1EEC16D01D74BF3E7AB768B5D8369078B492A480F4E724938024C4520513571826BCF6F56C06FD2F7C7B9F66FF78FFB0048CCD62CED80AEBBC991E531FC4C0B373BECFA5D1E11E3EDC7725CFD22F6903704BDDAA941BEA45B1EA2413252D53200EE57D2379A891D6CB32EF68557FA09CA736CD6FFF6D9A803AD0582C68E0B9C1D9D48A14909611643DDED1281AED5E53A8553984F0D99A2E0AF932DDD89D5364603546E05B444909EFC5ED243989D2792017543F8EF2381B5451FB757B7C84DB8096F3B6506E2EC6CBFE20EB1349BE84D3F8050C0D319EE48516859E0854BDAB2B6F9D6895B772A022F9BFD3C09CA16EEC2DE4ED3E04EF1CDFC76328A6D48940B25FAD49DDF76C786B592A6746251E91DD7E9B946C50DB0E0D46CA30F1E42C8BBFE431326674560336BE864F8806D85D61D0081AE2A8CD3A500D1AC00D17054346434E00D0AF7FECB96219AA01D9F8D42D81F9749F46110AAF137625CB99FEE1F521F6C2A26428F32AD5FB3EC39064E63D5EA13EDA71EB371ECF87F60CD7D9E6FE49540B6F25D916E688F9D17E38639054E69A29651F740140D7D082CDD6678436DA3B361DCC011B65E9490B9FB1DA8EB7C2DCEA9E9A7C7E0D418C05AADB991DD9A1D0316E922044351C9C08A2C90A98F221171C9C83EA6FE7CC5A5BECB628E27E11F0E06B512D2FE44A834102A8C665A0112C245EBF269828ED21820ED301EB5418BE1332D6C5D05E89A7D788255434C7C886AB4A1A2C617626406964949BFA57FF8FF69780218324832B54D1F09BC5182A91822BD7B97BF521C1C48B2FE566BCB34347B2DAAE884CF8D81BC9B5F421F2E62B0D63C0BEE761EEE39D1ED7291F63DE9174E6C89E6EDEB957464743E96FB835FAE9543DACC953245101704740C1FF9C77DB1DB9245820F484C941C2BAA5254A0A01A4CFC29B9F59C92E1710E277B965A0598D341EF7F30F53E35E453E5D1499D40FE7D5D446C8A772BA87BC066CD2308B8C544A0394D2AD9D2A35119E6DACA56D5AABB10B3F33AB4A0A7048BB4E9D6B7FF7F85A4B6B3C47645B8572FDC04AB05EBD97D9DF8757EE8FD99C6B1550A2C8A8EFB0A8F6BBFE7776F64154CD99A7A5523C681F67546BA8E50F58E2D8955B4A0AAB98714AB0CDE5C05F6FDB362E3C6F23E0118426E3043F4C3808CB7579CA4890B51A7E677089AC6E910D2A77DB7C996FE3F7EC49D01E75242314088EFE4FF11DF18F44C49413C82093B064623D92CEFEACA1F42AE0815BFFE60F4095164AC6DBD8575BF57A7E5F9034954E7CE3BC0F04D617BEDCBCF4F5A2731D301748B4D74CDAB6149B66D4F401DC3C7D61007E026592E6E9F9B09564079BAC47948D45951270A9A0CD9B06528A5502EAD30F500F2E8C29CC36B1DCBF19A7A54E73F81900BAE906AEAFCB9E2B9BD05CFD3D2A13A08CF072BAD52C60D62C47FCF1E3F1FC9104703A8CC6CFC50C4E4BE2914CB9CEE8D3FBF8D3ED969CD7F1F22D239F5C8A104B050543E0D5F3A8C93A5EC0545969800E0C18C006C44DB1039246447D645724E177F7709C91BBCC752B5CBE9180C4C4C0CC1FBE2E5C8DE49F037C376EF5F794A1BD1E46CD40FCAD19F417F402FD75B3DB8BFB6A435F1281FFF0344F007185D6A4C84DD81BB57DBEB135ABFD14F9A4BF883117A50514294E94F2D60FB6D9BAEE4BEB326C6CDD8CC786B2258875D4213458E5BE1C1727AE5A8D967FC0F272B965559FCA6831989DA6A19E1DFFA94FA6180FD2D4B3DCC5AC4DA8741204396572F5E0594B5032F143559E9D60990A4FFB10224AF170FD477B6A3B516F657E53EFB1A4DA7FB8C319B2C9D7E49FBDF6F328EA502D1682737C07A6E345FD3AC451264BFC53A75B11B1DC3107FB233432FC95CBA0895F3C4E5DC136F0C7925B1E21F9607E7E19AEF8030231662C8FF0EC9D516BD01FF089391637C7E1159C5BD16272C6E27A443917AEF7E683136924BFA00A58ABA5E7781C05BABD91216B641CE10EBE4271639FB4E4025459889BD713A67CF450797DAFFF266E7577B3636CEFF61B61F6A080C4933E82065C9E692502C98CA85C73F3FE7D505DB6FE3CFBBEFC6112D6CD3ED5580F0F56B9640D7DDE4C8F218159CF230E02169222DCF4131CC384B66356A57ABF00655F4B58798F6455728F529EC4D4805D078FB4646B8E7B9021F9787ADD8F0B769B1E527073C57BCD251231C8FCFDCD8AF84FBCE7091E0AB46EE96FBF06828ED473767544CC7C2844AF5A699114C70F988274FB85BC847E9A4E76E339F3927787CCBE92691638C41AA81651678C0302E075F144E64A8A73D6151A53854CA0348186DDC2EBD3596697CCF230629617B434204A6057ECAD0D87278BCDD71C82677C20B21234E25E7B4100F94FCD46AE79EF247FC6EBD327F0E1D5D16D6488C3C355C5D4CD028B92010716907382A7F737885D72B994C6CACA48088FC45EDE9E91F87FE654ECFAF06C21A7505980FE5DBFC239433BABC5190CB84E3A63CDBE18681CBA9E83127CC8838B82C96ECCDB770EBEBB73D4BE6E74D3982CA3F426F7F085333ACBCE69F22BE3F5E17F892062F345A13D4C669806213D7FFE5329D24D2C9AFB40AC97569577FE140F94A298E41B11A03138E875BA8D690D5CB6A9D61FE48B99FCC90349BA74426D5F2068C5BC6DF4C1AB523B966F08C58234CBAD22022F8E87D1E6F3958EE041B91614E2FFCC167F39746042653FF60921DFAF0F19F666681D09C55C65A70BAEB54671D51C453063811A0DE1D5726972A4E0D61BA18CF68B5F83B490415BA7EFE76039070103EEAD96A142B23D5279C4B049F612AD24D675B69628835D39DA77F71578B7524D9BA8E00A1EAD70C82AEBBC991E531FC4C8B995EA5295F69FA971BD4D527E297AD6E6FAA72A7EDED6C15E5803E3F1BD29FAB80C9863B4F0FF9D8D7132ABCBBFF4E6A4DBA567BA5426E617DE7D8B94AA31227D59DE097FB7B581BBA1E184EB6AF5A62BC7DEC0B8268C4FFB3C565A9722607A9B7FDC2233EA961FD811D9B13E91EE422C61A1BC4453F732874EE021CBF3F87D0B0CEC5B3A1FFDEF8FD338F465D08452520C24BF9D02C031656E9F9BC2C14BF71FB74E7E33996902863140017915FDC6CA6F8BC2378FE49BC5B54AC00A7918D1DC021E19CB0471CAF6DF7045923984DB8354886B41CF577ED37A10EDB46246F02B8893C442C792805CF51C701A6FD8D19187C86777FC8E3B0B75213DE7870AFCAEF32EA0EA4CE4DE28AE71B3E0014C198328D4185F50AC90E71245C5AB6C344BAE85620B4407C788DE171FE77C78E07101C08040281A6FF7C7F2D921ED85B95B6F317C0429AB23CB6A6AF0C3CE771E76F210FC667FC592C83DE054DFC0F52CF6362A7C1BAE3C509371FCFAEBE6133EABF2F8F32771C0064A40269D4E2EA24A9C277DF1678AE3E20CB9E0AA16EC8574E8D574D77FE1767A1500E40154DC35D773FFA2D9FCDAA8CB94BFC57CA1B29C5352A2497D5694A9E32682276DEF2D50221845DC863984543F93E18D0CEE4768BDCA1A5787D96E1F92B24C24887EC6EDF077EF1C69266C0057F57E2EE845BEBBB56305E5EC5489517106B7254CCC541983252FC4BD2975AADF97D24170C0E09BDDFB452F53373B8148098F6D0A8F2CD14BBC03980FD0AC685A6361B1F71A3901C7C15B927E079008D2956D3940BB2A0B90A6F4E64A03698B8C004CD8DDEF3DA9F6F62902C99D437E718FDF91679AEAF287823FDE965656D6483F54F86076600879BA1DB4BD1EB1DA01E8A552F690D8353B37BEA83958CC9EEF80C7EE9D5EB4B2F24456FE1C2A08B30A4F4762EB13287A95C7946E8FA3A9392B958B1A9ADA26A8EF958A8300182D6AFA9075D779323CB63F8D9FC464E77FA84B04AF6FBCD9AD03B6E6E8DCE2304BB4BC9CF25367FD38BB8982FC500A4876801E3B10F3CA3CEA29A3474E2DF1F75354EA5FFD2380D6CD01ED413C9B6772BD21153002F3D07BCD803225C27E66E171867C0C751C2C311BCECAF21A54EE8B0DE9FEBA8B6F4A2A3AAEBA0D70D91D0A928B26B10E19F266C33CB688C358108E21E3111E441CD74FEF42170F505A5026D4C617F8E25A854D3F6C1A09D98F5A4763CC15C28F22C9A80394515A0D2B8ED433BA1AF469FB878FCF66354A2AA670661FDCE69B9204BEFE503CADDE9DF08CC2475D0B8545324C085726BE9B5227A7DC5DC6976D2C94116E357431BDCE337B2FBD5246A47CF5DE8DAEA843B06AA341484A970100A6E8BB3ADA21F0CE017EB7EC6503C02FE8A29F934A5757D8651FC7253B3B241DB9931FE3887C8F91B70CEC00DB5BC3CE45C89BD496EDFD25520135D0A2EFA17BFF1F6898A5E8A0770255107378E5472EA86141D47ACB20A4646CEAF95A3DCA23325FA045A09576FB21A29F0B71EE71ABBD7B2817941B0871AFD6AE9E3F32FD57FAA3D39B1E5A20AD8690AF30092D41FAA15D5F58E499584397EEAB1FAE4FC8CEC2918F91358DA5950470BE71006D160E2ED7AF5827B1C540D88A12699D673354975108245CD74E0523C4D929203BD914E605FAA87E37E18C09D44FEE217AA2787C1F46BD528C3495CABEB4874B4952D4A84E238AAAC4DAA1DA08CE4F9F191BB74298AA9EF7FA8D0D51606F4F78667A37F039AC4DAFC32DA1C6A27E244CBE683179FF3089E9D669F000F30456678F63558D4A77C1425D6FF5D977BE52A2BC2B201D7928F6647634AD5694613D5CDC427C26EAA0FB3963896B89CA1DD7113A38046058F88EA6FEA12792BB40F4418220211858841C42112AD43B21F0CD838A977F3752B8605D1449A85DE3115AC6228D86958B92720D3DA0DACCBFA7E05540E7EBAC60DCDF9B130FBEDEF6022D0221AF20DDB9CDAA8FCF83AA7FBAF627D92E19E6DD6C638616C84B75E3090EE73F80DE5FAF4B355A2CD669D2821A4408BEAF18642C12D1FF7484AB2BFB4F74F8BBBB876D822DDB8CAB3BAAF9144063F0D3FBFF95739BBE2509A70CEEF5DD26917F300F4B2F4A709BD9D8C92FB7DBFD2024989D463D99DC9BA699C1CF53954BF061CB447C0863ED4A6333AC10B6B5F58926E68657F43B8169AA08E32EB511D0B992E761A8B7858B98475EC73B59785436E2C5D1105EAE7D006B81F06A4F6C1F26C7C66B6858FA686F02237489DB64EF64783D38E06F22FCF5B33D1DF00B622169D217729849109453AFBAB59CF2469057DF43A8E5E45B60C2E6354E37590124CB9247201A6C2A114CE4A65A225F17FCDAD71E23EF4F8DE31B71317EFB201E9BA9B1C591EC34FFE629719B25CEEA8BC66967CDD6A68693545E0DDCA3ABF4F70CBD12217A80D203EC0E368EC83B99D0A2ECF0F5C315A991EECDBD6B4F294F364219C8772F9378409161B54E2B84ADEC10F66ADE9FEF89C02E65C81E99962C3FE27A891CDF59B217A6F5A38D7E53017DD2CBED67BA2B92DBC5DE95FC0764E8691D4F192DCA95C44F41F6D88ABF6596BFDA5E5DFC009C281BA0CE3D8A14EB0F0BBF295BB1DE1FCE3075A9F6EB6842B17F55A8BFAE92357061CFA8F896D1D05953798C62F4CF9B4C9D9828ACCCD6F3C13B47BAC12FF653DD2DCF9F595CF7E9F69CD0F81BDE404803054B64F4E1D2A08FD1CDC419BDA5F87013394A0B3B1C516DE430A2CF2C79273042356CE58BAD029C40D60F8F8AB9288ED4739FCA3F9457F26B22FB0FC36C17C39F5A123EC8556A0EE486B374B5E3A9DC23ACA7708C90D5028FE597475FF0970FE299993036A137CFDCA5C72B840BF1547DAFBF7793CCA918768B0DC37B22ABA93D2D9FDF2F1059EF988CF1DBD9A1B05A1B3F20D67C8F68D68C043A03C4883BEAB555199CCE8C6E9BF8CC13AF186B12FC4249808A1C254428F6B81CC8D5228ED695683F8DD47092A4C0DCA394250D5A0BBA11718FDA81AB450A2FA5283FB19E2312E31102B081802C728F00F6E8A3116843A077A1338457B1F805D3C4C5CC6D2D788E96754E3C4DE0C06533F06C89D958DCBC8746369F6665B60FC40365BFFA775AAF0221150E24DB832D3CFC894A88D1A5532BD061837F006F1A15BDF0351C69DA57D194C80CEAC1C43084B5F237742280B0586A2C17C47B319D580BD19024B5F23941BF66643308DE375EB3818D3300E750E80946C4635B24CFD18CA5ADA8F037472191327501B353A647A8DB338056454C8319BAD526C6F86436F4E012A8ECAD4AAF06536C710816918DDADC3A0F5529A0F48792575603ED6072D4490D6273E011E3A5BD6617F405A3CEF907ADD565C798011B06F9F8F72683CE983E367A46B6F06ABCB3CEBCAF931A96ECAA8E18421223689203C630819E015A8C6E85836766709D3D79F5196F017223B96DD3D86AE86BCE20CD54CF95F4D8FEF333918D008FC61C246EAEDB88D3E3664D26194FAAD7AA75D273537288B90ED1957DD265678FD8AC89CC60634939CE8E12A6551444C494BFCD66718219213385E484215711CFD8F8A7CB225C8079B3EFB116CA0797D01C6408E22499637F54438C35165FA9EBF7648A6959B4D52D359B4FE12072A11107F8AD1CC45424029C2E95574851035119C96AD7E8B392B883A2F4DF4C3005F62500E998155A6F827138EE88D861EB6B1B3B4C45AF480DCCE30CE9E817066C0552D4CF445D9934577BB366337D19C41DDAD1756E0A61AA42E2F13DD57F6FB0D12F5AC72C3A82E063CC25CA3F588DAA87B9C6CDD5B6A8422E9D132A05B7F00828192EF18A2872BD5D2AC7528CECB55EABCA0FF75C341FF0571F029B4A6C26673770EB52F13B30665AC00BD843A82570B3C492E8DFF43AAD3413B15055748E33A7AC39D2CD441832DC3BC1E094F6D0AE0C9A25193AFD227C195113A3F5CA10AF02B9855D02A30AD46CB9010DC16B5C5680DD077504646A52733A6BF2652FD83F05114F3368CF0FEA1DA3E383862D6EA651E76A11E9C284F8122EDBAAB9411EFE9EAF286A042C0BD877F718BFD15F79B8FA1E3D935D5BAB0FAA888A37DC3FA2FCAA40AA359F67B2850D94D29E6616C74760DE5420B953BFB018CE1D919FDEF9F6FE182A31EB56CB0F7E433E560AC3BCC156418C44774FD20897F5469DFDB0392889F11C0C0D54D89687A58E35F8C2921078CAD0049592C4C53AA939ECC7B0B68F4D7789B08009159E46E8F044E7C2271C2111CC27EFE88201135A870C5E83B1D778081C76FA738658ECB7053998EA01A6192ADD5DF90425FBD330FDD73907846435B70AA8FA4A14529051466B1CC67B863C6E4505B3C5032AE22F5E247FB23AD4A0EC624345CCD384B29B015AD8C28217CD9C72EBC132F0B34E5FD7DE0691C409A4F5B5234FD739BC84A9F36DE84FF59D908B1DD0CF006540BBC2C5BF8B584E9F32F28C3E4A682D75F01862ADC3CFC99CF9096C72A0CEDE058D24778B478B41B5A88078E117FAE8BFD4A71A6791A49B97CDE89A6D21AEC3272B0FE845B1BDE29F057FA16D05DB3C6DD716C696AEC1BFBD123EA9C3C7738FE6BBCC192EF5B7A610A37DA41394865E472C9C75998CADA2F662250F9D1BFC96BE6CF333FA2B5FC2D53360161E9D74C82AEBBC991E531FCE40FA71B56700B3FCFB0AD6844A840D9C67AB2FDAC3B7DDED8940A6AFA1F42FC1A009061D5E0D08CE9F2777F85F0D937BC253C24382EA2AC93CF3FE0087F2E336F9686508D72259A274D02CB2451A303DEE8F27FF715386671FB616258EA71701B6E3C9B07DB6E968F74F2C32D0C155912CC9E3B9774E668BE3E671267D1007CD3034638808857AC9B105B96956FCA742A0A5396082EC1D66BEC7F8A754279E483F3367A04F701CA793A294AC3F60E9681E864EB3D92702D461A9CE7F9E38957C054A27F3826A04FCF3DC9C8DD0E5BA25F98BF0154B28054B9154EC22E7E0D0B54D86B8EB8897636626DFD92B53C0E422FE90703C975FA0C44241549C2E191E5EC83DA07571D4131B6DAAD1134BF4DEC9A797D060172B4AFEAAD3E2A38F6F0F4B9D77906188428CB247BE6145606D12ABDFB99F8ED201008040229D2D6DCE0B4FAA1ED5AEB563DAA7E0C31C31372CE84E5C07F55A7ABD088FADC21FE9B544E681F9DA1E523EE8C59723921A8F8B8AA054369FF0B46F8DA2B7645728555A9FF38E687945E358EF0271B27CA0F243A51F5826D3AC0809D4CF82211FFA2E90F7F5C5CE7AB52F3B78207556C5172EA4E0904E2DA19AB8400B6DF630BF40DCF2DCE16072866FE84F653B1589C4AA4BA97BA0FE572AFD72702DDC870FB4CE7E16EA907EC782588AB0BAB738C8CB1955DA6612A98F1F93733F9DA5CF938FA15DF212E08E8183E4E0D71C0DB4D4EA6C013FEDCBDC87D3A09FB8F6D9F5C58CD2AD1EFA1ECDF3A07B9AA2AE780F5669F55E181AAA21A4F8AE32B0D5A68FFA20FB9A3BD6F9E9BC919E8C3E3880F1C4EE16E94BBFFDDAD2EA8918EB11C499905CC75239816363E22761B244B4096539A9CBD42A258C650368F5B34593E221F3A74D6BC0BE71161ED11E6E7382DE46B41D6EAEDC685B6C5A356E8C39BAE79BFE1C2FF3C5F63B27ED82A7CF9103794560B5CB9869A88AB9D01D40454AC170DB19C1F4B0FB1C822E14CA8E1052DA5F066DF7EAF5D8CDF128A3EBD0F4BC460E84C8CCE05D3991F670EDCA62C83892D1C930D3C15EED972086CEAD1747CD1B4BD9BE6B788C992AABD91F58201D7F40E47199C89413BCDAF5D9B305B8F322403BCB9C842BEAA25EE31CA0DE1E84E8428101C080402814063B1CA053420A0860CCB7248B29630FDC2289400FEE7A37816A39AC2E3E589DB64F8910D5B9483E2095E7C87862877680C1658CC0F5994B638BC4F0654F433D27BF3B106F094576D70F3B7B63FA61E5E4CF2460E83F67CF445DD703D2530B93F21CCFB448F99394D20D9FF57E7D62D6075F42940117F0FD13879AC7664B27CE7EA847C72F7FBF11E7BADE37F47378D2990940D7968A64D51D6621A19523E064A595650FBC858DA9FA1BB1371E633423F188060E93F73D2BE7D733839E5F3DA1C8DF501A172548453CE8EDE86E70C18464A012CE297D3D7627E938027FDF759765C180AC8B40E279AA4F42BB32AA39FE2D404DC4C82AFFB4DB40D076B132A12C780A52C38A7D49F62156F4EE39979D13EE2DFBC2F927F5DCDCB744847E00A67375815B6C0404A03643E9565107E97AEBBAB326790A950E4EABA18CBBF240EF1265D81B2B75CE5D8603DDE84EA20DECAB56779C93CAEA0CC97ADBB79BD40A4F2021DA686E41810AA781876D86778709966246D54F0EC120FE5D25F21CB9015C82A640DB20ED9806C42B620DB901DC82E640FF207B20FF90B39801C428E20C79013C87FC825E40A70ED0D1D0029819442CA20E590AF900A4825A40AF20D520DA981D442EA00F5DED06841B4213A105D881E441F6200318418A12A0504F0C4832045881504060120FD801D6F1041102A8814C40A028300907E8C1B409020481024081204098204418220419021C8106408320419820C418620435020281014080A040582024181A0405021A81054082A0415820A4185A042D0206810B4EA442B637ED976E6B21C9FB1788116E50579443C546444151A063CC583CA44080B80D50B82102F483E7843160B8983C4431220BD903EC80FC08D17E4F8DE50544236215B906DC80E6417B2877A06065180284294212A1055881A441DA201D08C870A959038483C24019208F900498224433E42BE031ABDA116812462DCE0721E0280672C69D20F0322D74BE83FCF2E8818F94EE3A78DA22C32019FCAE3DFDC8576B896EA1EAFA90700B1C4DD830C5D353E7EFB17266BEBA6E34678948BA7CEF0F59A322B7BEC39038F4E84F5291401E3D55561C38C4615BCC2B4BF494EFCB2EB0D0823A48C99C72DCC55A1FD6311321FDB6459F168E589FEA7B166B4EFABF93A15E08C3DB9F3D62E69EFE2EAB231585379A1C08DCA16787611EEC765726A4AF67C9522FAFE76F45B5EFC49F2AAD987573E12DE7B8AA9250675A3F7ACECFC4CD1FA91C6AB1CAEB84F89AE0DC8B15B9E2036F118C07E26A2FDE9AAFFED656622D5AFDB74D5ED5BE48F83A5B0C250478932A477750EFCF356BE246E13B678845ED6AFF37249F7319AFF0A81B7E49D503B888FE4FCE78A0BD87BE394FC9158C8669557C4E807CEEC5C9BB724B6F0E2649E07539AF3A067FC14EABEB1E353D237F703A408176613C26EF37C6840E3B0D03A4F168CFB1B91A9AF3C5D804EB13C247E803964E131F35B70103783FC37111B8FE4E19ADD1B7B73006D21D99BC4CE1AFA138FF4973BC54D5E4F63E35DCECBEB825CB0A068F705112A0A20140510E2D12DF9C509D5B55EB6EFE77C3CADCCF2503CC1F9A3C6AD0F67669A91A6F126D7582152A04E7079E8E19C3EA2C8D4AE6881EE3F7DE4814DF03B8F752B561BB317BA797E808433456090F885102B68244331E4FAEB77D2493ACF84AC1FF611648BB3E58DB0851822C93F7FA2884DD0A930645A3584F4184437D6443F18F8B760AB5F1B6A62E98279FCA88095684D5B4940FB6662FC7EC6A0D8B63CE88C0A447C69456E6CFFD6D5ABDFD580045CE962FB1F3D88F582DDDA56CD7E2DEE39A42002F60BD846F71C42CCE72B221750B65C550313B45854C2508C5BF24A6DDFDAE448221BD60986124D3494CCDF93DD5CB34C937B9DA7714C1B682BB957C00530446DF9C8E8F8E7E676FDC8B87D536BB86B22EB5A07D3287042E80BA8DA3317882E1DA7720711FE03FFC912BE79B15072BA12E12ECD4189845C6604A780A6CE6F8914A6F6FDAB86DD662368D628D69F0E0479777EFD5C296CD4E51B0668B57EE066EAF724B0687DFAFB8DC6FDCDE60F2DFF83AA90393A453825FFDDA965279CFE550C849B1B22773D966591A86BACCB04B1327B8D02FF2B5B4544F371C0585B82B7D943AA2605DA7A2F21147EC69E8DE580FF7AD036FD75F98CD6AA1366A4D66D99B7620B7F6439712C6C40AAE7787CF6C3808AFF5458F996DA556DD1228CAE1FEF502F306A53F5FDDBDEBB8C1BFEE42B19EB01CAD1D6C16EC4DD3C0EB6DF9E85AD4B4E497B3FC391647D34A047AA0930623113EE84CAC5292513EB1C080412931A1228A1C2D612C07D04F937FDFD669538BEB7B9BC93E09E8D99975A76892AE3907ED70DF1190BA36C8006B6C845051AF846633F66F0E93309CA009C10FAB42F89BC83490C0B5D5348BD44429CE91EB467F1D7DE9181946E42870DE203EEE75F10674B97FEA7C704CD10006E13F8F607F72518D216F64CA2415B4C430865EA6BFB3DF6B9EBE3B4738B9617459A08630727412583DAA1E92740D0AFB93DF3E50CCE45D014B47CE4AC803F3FF25A8CED0E471B824CBED77FAAC0ECBE1126F883E3FC0B0E929A9219569047749EC8328CC7FEC035D20D0FE964371E908966AB0272C6196ECA4A68CD7484DCC1D51BD9BDF83AC6FB6A7115DBFD2F4E4E8EEEFAEC4668A2D819E5A8E49DC9C4DF0C84D9B099226AADEDE22ACA5E75082430E279E325C0D0FC478B5F71E0AC2A33398B2F405BC74EA261653FB0D42534AE5B659AE93EEB8D3303AC076A830CD01541CA4962C6ADA2A3C308B79F6E2FC2758D77FCADA9FAC0AE80944F062F8AC401E1AC7E544A41B56A4F1E8081744BD9E17A6C0D0FE1CA5E60C27AC07B4E8B13F81B63161D88945D1D6CFFE314720CA3628D748E18C59925F37C20EF0F8CF9B98A0F78A182D182397A8285B9C87F31420671051FC823E243BEEBFD3EAD21BA051FFE364217611CB49484D7497544E78B8941A1251A0050CCD6E437EDFF43FA5073E2D653CB2D97970703E83EBD70BD5C5E4C6DEF55C103C81DC96940449B4523F62788E75DF459DB492A632BEE633C336B8BE3CB24379709AB08A223ADD06567D9323C9BD61E4B76B0B0AD0D12A4B49783319B3FFC784B4C2EE576FDF559C3B8EE0F0C3972998ACFE6CAEA8E758AEDCBB37DF99C7F31AC142561C7D6F93EF0434BDBEC5FF479A4E827AD2386F7107F039FA5E0FEDDCB55B73EE24766D4B8FCF0AD1FA097E630604E3520FDA6633A2622E993CEA7E096183B9B4CA137512F2B32A4835A23201BACFD0859D6008BC46C0D7C31D45FDB1391446DB636FFEF7FEF84D88D9E18B043985E61DC5D8A2E3D07DF2CF3978BE9A45EAEAEACE0DC8A4D8C43F90B5BE81D8C30981EB0FF1D3E872B6AFBF5D9C95484710B8805E0A8DEBB9797E4A74EB8F136F1CE7F80996A53BCD1501C6A8C24E3AF9AA8A57F8ADCF63CCD74C17E5394BE61DA75529219500BFBBBA5B8AC386D5BCE7923008E7A10A7B72E77D1F3A59D9682B3576D968AE38A28CFDB8F1E55EA5AD69C1F62DAAFCA86421ED24706FF2B4ABD06168B98CC351C83EA37909D1A3C6615C2F44631A4139C31F685BC5860AE6B15567EE14F571E1EE89B996BC89438D2CB0939E26F7FACACADBDBCE42DBE8A9DD3F7262A8CD3EB8701BF242C5F61BAD11F2AAEDD6ECE48C8771F199BDFFB6515D438763FFBE7AB655903118B2B76F55B8B6DBAE75B5F11049A17B9E8F251629AAE1BAD4E255FD8F3E1D33A21E920381008040281425707798DC8E8569944736924BC022C8730CB62A63CF36C73CF07D8CE14334E7064F4909C590C8E458C4E1D6AD630E7BCF83FC71243C0E8A8E8152E3F14FBEEEC87E670DAF0B5A009DE99FF093CE35FC15BF4363696006C1FF208C688DF7E86293379B31D4BD5F679489A1BB40767CB616412D8E489E3ABB08EF2A0BDD6B48F91DE7CD7772DF0D4DD41A1DC6485064DC71267AC94072C03704214CD78F32F13109973F6D8ABBC4AD8E5A222FA9D8E90CC39A10579032A1DCE3F99D288697721E549F2A45A2EFE9A8EB04F753CC6167E31287371E55FF87829E4147C445C919BEC06FA6140447D6D50815A4BF0E071BB46EEB3D5CAC05FC4A2D46E7DE44B66EE4191BC040540EF6FA497FBC0A25C0C817C9A15634BA2A97873F2F7F967ADB6F44FCC1A50F34A100804027526612EC41AD3A52721C8EEEB8D72D1CD7C853539A1913231795A15800FECF4277695BF5FC9592D88FB67E3F42F25972071128E2D168C3C0D8E9B0CDCDC184F7E0EE8EF9CDAAC7B0B823354E1047C96EDC30516B43D989AD35C67673F63C422A298520D52936905B7CF0157E534D85080814F30179264BD700D48F9491632406E03F1805D7B6F88BA44FCBD3302F50783B693F4081FFF7FCAF729D3BD2733F85FA73E5703A89F3D3FF4FCD235D22202E3D60F5128AF2959BBF1115766129ECD3FC979A407E84DE20B7DF08A5AEF0DD4FD119D23DCE81D16F3752DF180F2795722F266B1C6A06A74E9212781AFA547E902DB52DDED95E414C1A9BFAF0FC0BEACEF4EC24B79D00B4E20DAF810A016C8E5771C37A4BDC7B476C6AC392132D90947098203814020504CA98A093A5245958B0BA85436F24755E0B95460AB14C0A43CF2BE5E7E8E32AA0CE658390CFF6249D86587A121540BF87B9FE61EA0DC279D87135D6A2B446991104E28FE563087C75E54668AE2F43B615EC98B8BA3899C3391FD3CF83DBA45EF5B25EBC9F89D23D6D6B2CF6B9C061593B1C81FF7C0EE2D167FCDAECA6DCE4D87962799F61272A98F05F773D57ABA00190D8443B4E9D6FC65C116D2D5A81DFE18739539CFD9E1E6DF5B5DCEDB3E84FF7EB210B22435CBC005B0A147A527A0489E0DBCF6C26AECE5FE1928674FCF4FA157A5206F64E5AF87DB1475D22C33C8A1B0BE4B2112CDBB815ABCFB94F61F4BCABA7670370AE73B696758CECD85457226AA7E7C886AB61F6FFD031012C671C582842943F378F87D2018A8CEDF6996F1B8692FDDFB42243928287B1E8237B3A32E27D812BAA6942DFD32FF57A84A038765E4FD4FBF1FE1C45FF2F1AFA88FCDEF5ABA8BFA6CCD1FB504CAFD9F6D3A8E7288E0B35237CE2E9DB96E16E686FC590B88A82C9FE8920DAF326EECA8DB2BE14FA472EDAF1599FEF71CCF6714F8878D29A6BFAD836F5F1908853CF85EC509D59D1E5C5C4486E080B205F4EA8A0CDD2F70AC48553E8CAC0816FECCE76686C5BEB60212FD6080DCE40319D2FECFDE4861EA99084A55A41F1A2C7E71A85E43DDBA5717911F824F014E878F65DACC45700BEC65F7C533560A12730D7F5AF73968FD7EFCDB6C9312D90281402047AC62EED40C2DC1A607B838BCE7333A7FB807720DB069B2CE8FEE4FA60930B9D28E4B26D96F6A95BC955FECFD50CE8D1900453CD8AD98E78DF0D02F563F39A20B8EB622AFA99A74EE681AA7F3B3642CF2750A67EF204C88C29A5D753FC3D8C20C87184D2E6589E3AC41DF0F0676C8633889F2B5B30E1D029CCF5ECBFC3BCA5BD5147E3CDC9B4DC5511E3512D803AA82C4171619A3035343EAB3C93B8BDD7ADFFB747143B18ECE36C707303A43713A4A41810B501A0C7FFF7AD21429EBE1ACE05ADBD6B9EA3800D99E4E63D18710E680DF7F3FC494F632B7A2E8EA93656EEDAEC60BEF4F575501840C1C128214FE3EF9B639CD6B941D6F06503CD1CEAFDD594D271475598D541C7542A44070201008A4F3059346E9ADEA94718CAC82CFA09BC1B5FC97509AD7E9D4785CD82D4FC614FAFA69423EE37A2277E979E2A1F9420A22D55F01611EA2FABABEE60B4FB5533B95ED4188E39CE7F6A5332B98719F9E3C73EA0ACF509A3AFA328363A40BB70B2B3548D8575FC3FEB598E164739CC39F11D47619ED0D7E8F6EE35840F2CA52B451F09853DE7DC7C93E56E4571E870EF9ADF1C7C9817301167770A2B7D366378E4908F73E044C4F4C8F87198A07A8A52B1A15A4F58D661B59612F3A3DD5217E7BB6A940522D9E5224CC7C5CCF4A134BA6DDEB00137E49CEFEF2A23B9DE3FA5F6A58C1D4B779A65FDEF9BCFE1275B9DA757D4A160B6204B70137DB800B6EC567798CDCEC2C10BED3D8FE793CD5727934FAF3781D6C6B77E9D86AE5634973D795D0994FE680CD766E4E13EB0D1889FFC9A782B421CBEAD88EE34A50232FE55CBECBB893BA93681342BEA54502D3D956B4C9865C5D78271096014922345E8E0D32D836860AA40663499026EA47FEAD6F2554D9E673D5E587095E6547B7623C9DCF0A556BCD3BDCC8F65F890711F7010C84AD52B1C57CE69BEDE7702D916FAE81B6970F4BA056CE4CF77CEB3525EF0184E714BE72B0E2D67A466523D6DED9AD430D8435BDAB15BAD70C7F645686CEB706DA408D358B22C6DFDAD61F11D15FA27E246C6688F6FA6055992A036CD7CD1B0D1C09E98C47FF980217DF2762875F3481F61561724AAF948300DD29C8AFC18C846ECED9A3AAA9E02AD954F0B2938CAD867FD0FDED9E4942F497F2BC256B9547F171E031597FDB5FF147E8DC7F84F111A5428079229A67C525422AF207D238B3863763417D53671146BD63A37D1BEAB4CAF67F0AB713BBD14C875969949D1FBEC0183BBA117DF3BBB849A509E1E4FCDF1014A8B944915A2DC5B6597BEEBF70F4C3808EBBE2E740E4F25A6F85750BDA4F73CE7F1456E7F6A8A5086ADAA6DD3CBF2EFC01A49709E3FD266AD210AB34CB169A9076D7BF554FBC51413F7174E97148BCDC984E2FFAF662E033797DE961121631B4FD6C95B2721A1921F6B9C8E6CF752187C91A140AF8B373C40970A8E1760D48D24863795A22E6FCF3F7788D6806BFE6A3AEBF3D95D9F1CA21019CD317E4FFA8F0EF3D4B9035FA58CC2FC5F3E103B9C7EE702B8783FFE2AA7CDCE884F34AAEDB1DDE10EEF97BF6E3F05F495F1443BB5C80F4139A7CA9425FF63AE2047AB55E6B307A11FA146DA11F0C14D09E187D62FAE674069B25EE3491D391FE50627953AC3FD12E4882BA11747E02F0A8D64279FAAA26171CBE0E70D4E49EE51F6AB93211E55830A490A78C7FF27AC72D98267573E532DE0D852D09B127B8E40E4F8EF07D313EFBC49CA14A95E4D7654D13A4808074DE47A428BE7F4BEAFC8B39A0DC87BF7B947EA9F83DC26FA20BFFA4B276436BA508D5295BA77B23AABC28288B4874671BCE285E2A0F0E1CCA10F2E83E5B40F538D29032B0AF0C737122E8B4B8FDEDB27814666D5D57E500D077FE27A6EF88756ACF0715FB588F6D000C4C8339C4599061A2FAEF79FF878C5B16AC3A8DA02FDB7807A7E038E692C69A8F00BD3F6BCDC1D1587B419134B1336BA5F7AC920318ABE1BCEDC82B79FD2376672EE566BDA00FEED127B397E0E879CA9A6557FF616AADEE4397E3479D58AEC0D2D0120B477A82C5CA7B833481AD2BF862E71D9AEFD8D325C87B08C489D9BCA17346B6EAEC53EE822462C38E79AC218060E9A794E74CCBCD2DE6FCF617B958730C96A104D104119A55FD81FEFB9714D14EA8404342F3A1E5C4779440C2AC9F66F6AD454765076F71B8D6A6AC1D3D2F13E14537B6905277D01AE20065E8037AFAB782943D3CAB7F264B6ED29635E148A9DA1C7A4DAE74A8CC9F422300E9538DF33AC51F47E5C3665875A2FBEC29DA783D6F6DF984B5370AFCE31E9A1108268C814143C67E72787338E8A104A0FBD7FE560D32880EE71F5D7FE764F9DB765F301AD3DBB666543C8CEDED7E9A33418891FFAC1340AC85A04612DB9BB104A8F67A2BE30834C5322E7D0ED2ABBF2CFEAC563EA273ECB1B0352DF9752E4CD900790D13D4C226AE9F468FCB0CE5A128B4305ED3A8E0876E15353C56004DB345B514366FB145F59F443EB76101FEE87F082ABAD8047EA57D5BA3A21A53863C852BE9DB21856B7F0C670B9238299E07D0D2BD0906DF9564B5CFE6E854A5222244C38CC1FEBCE1AF0B1F15C2848A35D3B199CFD04748169213C742C5356E946180660293F00601E25565606BC8D2EE11956CFE1E45028BF44E3B3B56DCE5D7D66758C54A4BE2B0DB24A5608816696C7024FDFE2A0393AABBCB32E045F963B617B1FDAA649F1B0BFABEF73F1325B954719DD1F77D7D68992FF1A2EE9F0213807FBB3172F75C8CDFD122CD8C12BD345E9746E184DF4C1567613B718CF1364B6F0481A68C8E9455E17FEE7A04B730EC3EA32C9011D35E6CD2ED9F23B5E792BBCD2682AD52AEEBA4DD2C61A6F919119CAAC3353C515FD7E07F0E642CB7EA895658C02F6A738E9A55A319DDA8B903BAF5E3D92B76B74BE66A3453D58CD83A1F942710528C9ACB7F8B4A6804F1D1743CFE75C888D6995D34AA97D72554DC928BD0C80CD63218D9FE686CF315E730C5AE4FBCB39AA34BBF608FD2F3D5EBB5981C1D86AEBBCBB235808195287022F1A3BA9778F2CE44CB7309F697EE23C63B9A90558D79FBF91F1F114C01A796A9732297D65FE8A7B39CE415ED42835FDFA4E8848FB97ECFAF5BC8932F5953881EDB49EA05AF037A2B32940C0C5A364E9CFAC5E04CDC5B90454489370A38099B46ADECF4DACD7E49B8A7DE0FD7902E4A6B4F9DDE839001CA4F743E47DA0246595F484D8810F7CE15FD9B0760C77ECF6FDC4A9B6CA4F99A343EF89083256095C995836CD011FDE5497D6531DB3C07BC0E5DC84B959058661222A5686B37A06CC098524F9474F3E5201AC58D48A805EDFF51B3CE112BAE086E70E0A9D3BCA439FAC68581706A194D00CA74EF9EC132CB063A716BCD0504D78420501A0CBAD6AB4B9FE95AA3CAF48996227E97BAC071CFA3D7798BA2074D6EC2BC791A9E7C6375BC55738B80001D6C4AF3C0CCEEFCFD7782E80C69B72D1B1E7A86DB9671F75AB33DC2CFCF1CD1507027F226080E0402813CAA9D6839C1BD6B36A4AD1725BDE010D7F7D36299AFA0D68C897EE18272BBA941E5D779C6A04FC1BF077300B00EB1BCB67A27DCFB4528862B1128BCE2E7E5F4644A64D427B1BCA40C047EB363B80EF479E1B670340DC39CC467881DD14B5039296DF418C0FB24B9FBC0E0BCCA0C12B8A662111700DE9CFA97B6410CD2350C5EAC7F82CF97ED68518937FA55731B7AB5110FB23FF2B641A2808C3F4BD6AE717CD5497753C23BC687EB8980F53BC95B553FC9DF1DE77B99B4125C0FA118CA00846854C98549825D35736E113F06C3D1E5CEB3E6967622D8019588C2752EC1D23D0482A058BA876328A2CE01E386B8C8382A154E6F7C411DB2B715230588605BB5E84BDCE3375BE95C1D72AD4D5B12F27E160A1700758ED699DB420AC410E7C55C1C688F5109E509BACFE01E750951B93410FCA2CDBEAB782EFA49984B91C63D539274FD905961CA48F1EB09AB78CB6AD948AB2B4BEB1B09FB7872F1F96B7DB4884CE3AF6C05D1548D508333A86340A85CAC74393E9C2EDBDAF89AAB08EB7A312E58CADF440A3700F5304013FD30809DDE709BB37C26E3A188BC3E446C38B52BC650F7E30CF32CC81D1EE5DC4FA60090DFEE7DD3691CDCE2FA74418E4EBE5819FD013BE3DBEBA25A6D8B4C2FBF9BFC7744C066B14C9B61342AFB3E9704993B563766D674B473C48C9593493517FB0EC9121E9E3CE99F847F3A65AA536F1A0EB17B472D42284534E081BDB3A05168E9534FAAD2C7F711755E3E9E2322C87657DCD49C90351D47B9E59415C706B10BDDC216110879371F5CDBCB9BEB01211C4F9B7167DAAADFDF33A4F937A9135935977749197A0E8FB6438D1529C7503B1182CA2E8D06CE0CA3D13B5E5AF4F3C5708C71C3E2F7E4EE9FB2B98887F90E9F3677548DE3E1CFD071768BDC933C0E092BE585DB219BA50788A836AD90CBE42EEDA30B17CF71563F8AD7C50E5B1292A5ACD7E4D44A9E3B5DC511F042ACFD08CF3B0CB4EB06B1B2CCC59AC3543719503494C12A94A18BCE545A9FA518158D88E7A453123D258457EB91E2CDAD99A82036DD1482325EC8EE94C78B3EA722922F4ACF42D4A5B598CA3B283314BC4E5D7A2D3D09F8E7E10843B16F317CCBA1F130BAE1E77BFF98C237C2F154A4FA5977DCDF46C73D95EFD7D7013998AB082CF09459F3917A7BFC2053677316EEAF1FBF24D0332890A9EF4F91C1883A573D9D3A10437EF6CF7C6DCA89AE4548676E5AFCF3670F9CA6E95BA3F6FD6BF26B16CC9FD7CDE8E611D5A7D7B24289FA8EA8F9F200098C57B0E24AF92178DC98DA49A64DC2E08CE3AF657CAAB3B1EE5B1EFA4B5A4C5710DD9333E211F2DCF6E6786C117B4A2E8CD32D726A38C05332404B44244CBB9E0CE847970A066294D53DBC7B4816745D1E8BCA9F6BDA5C032BEC70DEF5F45B7BA83A756989130007FE1D9384764EDD3252E3590ADCA6AA9ED0D7CC578E96FC985D83BF7857963B9DF0DA20381008041A918F9D6EF9C232152934C4FF8E8C84677388EF24A2E25E9F20516A338164A77918B62363F2FD6020EDBE9A1A7F72BA6903259122CEBE64EF86D30D8B4ACDD225745EFE9C9DFF371FA07E80445DDA1DB264159FD3695342E7CCDEF0D9B741F2D9BB6DEBA78F9874AE110804028140C2341B92EC51F96C109A3ED0F8721878577B52921144A2C6DEB29440366CA65CBBE3CAFC45CC45FC1C95DA921EB37493241BA9A78E2C1E7C13BC04CE3E997ACDAF6C15C9011ABCEFF927CC0293253C26AD4FDD39B16D4E7CB7A4AB634E6AD69453E5AF6C310C0D4CC1EDB39D4FBED97CF8B438EFB485556D19A6388FABBC0289E8CEB2083C7B1665184A3E87BF3F54A11C2340EE2A9B220947DCB5B24AD59A4D4648E359A230491CB321050836CD3D14CEEC181950CC665D2646E7C4EC95910EFE635174EF08AF3C884EAD94C4691CB722834BF84908AF902A2BD8F57882BB8D4443312BC0E35D8C1E38FE404EEF23C47659D8171C7701780679C9BF833AA2832D1DCCBBCC6AFB588F531E0C483B701712169CEC59900B9BA4A663CEAB5FD69F583B9B60D814323F3CA6B123022C539E3E626C5A30D28E461E256297ACEF627D05767C510E05F31AC74DE9F33229641C56B163B96E33107CACE7C0A8F0632DAC33E97976EDE1F36F8EAF94F8196AAA52E4AFCD8919F79B9CCFD2AD285F4CD7FC04D715E77F688EB5AB227D727ADC1C03E2364036925D0D4873365D7C24162AFAE45C187968F595EBA1308096DC6E223FB92418E1028DF6D56B1AE684D5D889EF17A42D34DB9C92384A7AE6AF6D78FF52FE3BD0C8CFCFA3DC37CA02EF39FF64C2E4BF6D31546020F64FFEDF1C6099A0DB4CAE77BAB1BBDDD5A8CA97F9E71CFC66E3B3698F7C52B61681534DFCF2F46B1E947061E47419D1E7DBAF81786079BE39DFC0F4874CFAEF713EDB931A7CE7B502D927DEE32F331FD542DD75CDC7BE34AF0ECAAF7DD7687857C1FF9746316E346FED2AB93533265F5202F247582E640138AC001C383AD28C4124434ABDA0160F4F068C14DBEBCE8C5AA168A83EC3D055A877DCB82DE780912C067FBBF7654B909F75427F6142536A2D4FA0313B216DE591ABF5B02527FF7326238DFCC2E85394F1DEC423266C8D6F4FD76DBC456BFF49FEC4C551ACAD70D8FFF496640A6930531AF16CF6F8D2A9F2E54343E1B084B8CABADA34F01FD521761207D17063DBB31806737C492D8D198DDBF7FF7A63CDAECCCD3874160518ECC64FD0D1CA45BCAB6750C25AFE8D258B746EFDFE4F34A2E25351F081F7AC0472252B2C98A07C31440F759F2DDD7113DC5EFA477D23219BD32BDE53E3E3049192D27C1157833444F05D8BBF910140485A4805FC287ED9275D53D2B59FA610718E3A05AD15C7D0D41707FD0D9DC7FE918892A60051243FAA3BFA7FAE3FD85F1C7189D867F3003E6484FB8AFF8EF9FD594B6B477546E81FD7E25B0FA86E60A04E84E13ACE807EF95AB53F249775B7C1F40BD1CFD6D50F0364C3B03CE28C33986595BBAD15DF593B49D77E29DFBB5FD0C6FCC90FF2CEBE1707B80AB8F01855AFFC9D725052623EECF9DB2D094EA76FD974B8FFC5E058F3BAF2EF842705C1814020501CF4D9D1EA02E5BF1A248023C896E956D9C03A62BD6409FE765A2EAE2B8F822BFFFB53A52CDE1804C3157548F4A4540ADA9EFE2D29DC1B4E3A2F545D75D4D1C66E5EDDF1C30C6D75244314761AC9659BC6CC852B29E1F8FFF67B5CF05C45D14524F8EBA4150EAF5BC5086A29DF8F145CA3D7456EF2326DB607E5D6279B27442F1C6803C1A9FFDC2EDAAF66E019E06B2804FCFF0D745521254E6BF2C6AA26A26E424C671914B18AD3DBFE6A200C72DE1749CD5DAFB12953D2323E2D52651DC33D7F6AB4A8DCE6EEE35EF5053FA4EBDB373905776A3D7C7D379C40BF29101D77D5DC47382BE65F6D569F000D866F94FF211B5A5CD76B5BCE55685F11D804A9D5F7C4C565A4C324FE55E0274222708555A7D93E8F8E15FF5D26ACD1969465928BCA5E4415794119431EEF7FEB25DF718ACA6DD99916D76FF62C6D6FA1637238128E69C3770A047F4377560703CEB8118A7B66E8B283FA8CD48744A0989363275C8664BFF921639C5FFA336A88E390308CC08D303EA887FD119AA5491DEF7F36DDF65BB3AE37968E60FFD051E1A195752DB86DCFB0E69B88E84EE2FD4BA3B26CAA35F2F025BFE2CF313E3F985732FEC9EAAC215C437A0B29C26A0AE6104A1FA545AC73EFDC5A3A9397A406728723745D22759097E71BFD1327EE8F5E7C580FF310E04859F927F5072EF28CFF77E56DE42E433FCADEFB4955F7B32F44CE15E869EE7F3A11594348B194EE8BBA6C130A60106A507CA22DE5F51CC2A60A0292EED776C6CE665A89DE71D67319A57BFD4F26321C26128E30C074328A3335B8826DD442588938020343D968A59F6ABDF9B4FCDBDF39786F04078872CC2AC1C5F992619602B191B140629BD30B238F237E2A01DED830A7C78B20CD2ED52ECB14D3D398A6707CF464125CE01CAF7D014115B2F7B11EB5000386C7638E1B9993D2646454AA3842B48E292B9EA9C9F1D84150AFA0B352C5447A4004DF54EDBD833374371C29246AFAF3A30A26D3F3D8AFD5D035F8E908CF73CF44DC4E00D5833E42B562B069C01D91420DCB93E5B03F2D61FA85D1280108A9363A8B41D8D04393C1B27F258390EA96B0E788FFAC9C8EABB04E22A6316B6E240F956FBDE61E9AD02875AE2419A7D7B0E3AE815EE198848F68A3FC5F7E5EC86D7D928F7E94EE760467150B7BBA8DAEE009ADDE27E5BC62FF0B108001F0E667773F578B4E24BB878C1A9EC0CEE845CF8C1FA6640BB37DB1EF7DC9B595D85386A9B63DF9947DC8D82DB06CD5407C7CD5FFF9F7FFF197C909D68281B447AB597CC2B6C5C40CC54DE4A25EC0F6E364E9D31E1191E465B1812FC197FFDB1EBE89287E688282235538FE44152F9D8819E989B5A2A43882211EF07B34C940E5BFF6F4337E94F5D9104AB1E92C1836E2EFCD4AA99776458C607900DC0B89AC15B7E5CDBFCF247C0D1DE4C16582FC5F90669535823C13BC58711C6281D3FCFB3F7BB281508807963E62E77D7ADB3ED2B2CB145A31E35BAD9F7D36F3ACBB20600CA54B8DF0C04200C888AD4DB7FF7F51ECAC9BE426E170E3ACFDF30DF9A8D88D470D135B6A28BD210E1EB31651C6328194225BA8475A4F5AC5C695EE5FC27B8B332C2615A1DDE1DAFCE5C7A10006FA3FA30B55F07E2B51966ED9821F16A11EE397E8FCCC22E49F15D3B0629ADB7E05E01F09B4CB74AB12DA9DAB96ADF432976DE7958A5A42242A0402333D56C9268AADB31A05D7D7D3F7073B90452D73762595F843B111667040FBC18060D77FEAC09A836D4D5C30F5A8D81770999DC6E5EBDF8DD3ADCCA604833FB18400268D095FD04F9C7EEC0F55F12F5F1DD37424129AA851F1BEC531BCE5A546868C621A8836F411A21E70FA45C1F336ED87FD7D7FD55F300181BE962220CC42E80F51A16A5A8BFF73505FB517AB5C166963F01F4FEF21017FB21F861F85823E14251F0E5DACB37E897B1EBB4826C065ADD45AB02216B5A850752D0EA4B46521D0F85D91363F8D9B7D19FF83BC268C106C4ED3B22FFCA4D4AB792A3D54341FA3F345FB734FD9AF37B3581A34F579656D3EC65ED14D40DB4EC3023948332154694AC89F7044277A132C387FF6E4D7D64B6709C90ABBA8FB64C8FD8393A1908784AFAE61C9F0AED2E935829B5F38897FE2493DAA6AFAD4936A46326289BB921F27B561E1767B8707E19195BF85C02963F921A8E812108EEB83C0880C3E025AFD608093F2F75C17026EDD3711A2F2EF89B96BA78958B63DAB4BCCA6C3E282618F7DDA80C4B1E239F66DB0259E0CEDB2A56CCEE9C6D4477F0D723121F67496DA2CB334721008CE5AB22A42660A3521278375EA4470B5AEB9389A2C32E58FC6BBB4108D563E230B23E5A188FD8727B2CD2235AE269C89F1850A5FAD3ED21B70D5D1F48B482BE24B4D765BA0D5A54D43F57B01357F71F93C8CF477D5438B141BCEB7E2B88227739D5C884B5C6B27F956D8CDCAD326C5FF5693E61FAF3DC385DD58746996ED1BBA65E62D53538F2CB720F4CAE827C56139A3BEA60321B5B485F0ABA614864C34708682A4E70A6CBDE81150A3B3E1C4FE4F3021244BA64C7BF54DE797435EF9289DC937CA7972EA4F205120B8D4B8F4840FEF614D2A5325E2F6F58EBBEBA4080E33E6058F234CF47ADA66A61361BCA353432EA18F90738CDC127FBCF89DE4F2DA2721F8A586044CBD3023341A34116EF703F8720BC42B920AF9AF118CC45AC4B982053D80B133F3F04A80B7B641B4F189B04EE33E32880A0C018310E81544B0AD6C6C4D7ACCECC6BA8FE5D4ABFE79285B87F65EAD29DF435D8BBD2EF3067FBD216B7D4C49047005328BAB03B69366F747F3561570C8766B142F69353AA3A8A3A21708447CE4E12130EF84C089C340E2ECCDF144E28DAF25112EB4D57251323C2E842DD064EFBD168FBB0487ABDD55FC76EE42699341FCE59671C018451880819355C114390F9429E394374B4E0746F219E1BAB1B8E1EC6F6E0D6F31C6539541800475CD678476E77CE196AE1FB0785C5B0953AABA08E257E3D377836A1E75C64C48E13C996443095BF727DF1884153CF7F1E92ACC37A8B830344F8F3964DCE4EEA419BC9AD9F6A2503E08FD73D7D1B34B1AE2B3A97E4B045C6D3A73050DE0AF4859B56615496BA2ED2391AA0B5C7A11CF736BC47F1CF9507782EF4070201008040271ADC8C5895088030E33CCDB91986A32280D3679B4C5D87ECBDBE6E537CC64E7C07253BF63FA46ED03DCD6380E9F873E89E3324A7E37BCC2FBA1900811FA5FC8CE1082AAC7A769BDA0CD075F43210FFF127CFA4E3F88B2E41AA612DB21EA9361403831E9D354A88B3CEB44BBD4AD532C9EAEAB764BF9BD2ABA0BFD60E01C756AAFCB61A3D8E1EE2612CE4E74A15B1473AD972B7912F8F3AF3A51C3321430C7508DBF20FD85EA871FF753E1C90B3E5869FABC57A8E3C8B27A3CBBEF3F724627C2E6C55F2BB2CA2018E201EF4E93A56385819B24307E3182089172452D632E4D6A3F1EC72262A798AC622580846FDFC0249BC7E46EED23CDD2485B333942B7BF92108766A89AD7451EDE5D074EA753B24403290810F3F9AF3ED1B64675070D639DE230D9054C4C9FFA339EAFD17BE9EFE4CE095EFAEE112CDFFBF73E360AC125C06CBAE6817C58FC267945D29063A851D180261F9BA30261BF86CF6E701C30B314B8C0519BC141FA1A8E3BB191D1CF09029D08A7DD380E68E5FE5EE4C6EE05B8F3EB3A0AC45546E26BCD59394349A4B0DAF2B21F27EC4E083ECC0EC8ED28AFECCC54A8095BBF0AB230051E3ABC84594CA35075881D1EA5A1B5D84470FB87380ACE48867E1BF9C7FF1A676D35BB6629FE0EE7454B7449D07985443F18A85519006B9754875B95C2A28C0DD4B1BD3EB0B370061875A8887C059F235EF300F2F1866E73CAD85C036A74270BF1E8638C3F1BAB03D71F25F56322FE6933A5EE012983E163A5124A6482B63F795B91CC7BF82F3497F7876B76DF62B96C0F3060ADBCFAC9D258AC0AE18A9ED7301E4F85558BC85D72CEE9F34DF3A1F84F9F8F7F00A9450B171C4FB4A2596C7642D6A5B7090422B7BEEF69374855161D68BF8A7E3F656C0DA1D5B5EB9A8FD1F863214FFF617170081B32A018B4F7E4CED87A0BDA84CA3DE33FAD7E18406A64D907FA28E5DEB915F820BE98B52219C35317E2F1678A7C05F58CB90A2D1D40DF4B590EEC04D7507158A430B95CF7B63825096B4A2DD605A91BF65D2FEE7B35D4EC119BF003AB20A384421C08AC40310DF2525C37974C44E00FB7A40DE5B7EBE7D4A8127CE41FA2896F97F75584A510B551B8523EE481CE2B5CFA61C049F177E4423F150D49747B094E6CED649E0549745222FCC8AB5E9D6FF8BC3D3C8052126E007F77FEC6E72DA5967FEE155DE06B17AD90F62FA2A6F8342B8B1557129D7054F41874829EF023099599F6648E28722A16D28257ECD5A2578805DE4CD34F2943F2072CD89AC6C0DF67A3169ED9D910757714E50FE664C606D095BE5CA38BEAD7451F67A99807E35697D5AFD2FCDE5BEC738AE80784872759D7A5EDA9A3EBA3CC37346B47B07DE5B6E7C94C4E9F183E23A3BD6B61D231094BE90A17C7A6EA6E6B927980916CB76371EE0D5DCBEB4380468242FA52D5EA11CE09E28111C872BE2CF71C367A5F7344A72E667C054EDD82EB57D233D72A79D8744BA22640EABFEF3E1395FC52CC9E689614932124CFC306A7636D1626FC51E183F5FD4A798DEEE3DC3407AA4A982BDB89600DA9D0F35EA0CA957E9EFA9DA91944919D3A7541EA700A5520CDE09709C4422E6B59EC51E6B199C793BD1C8085A77413ACDA467FEA723A8731F1E6CDFC9F1347E7D40F0567CAAED1EBBF588D62F55D035A4E71D69498C117F257B7D723C591DA95F7CDAB6B93A2BF867186AE864FDD95422632EE915E8EFA9796EA003E0B7041A4B2BAED616DE5462E2F864153086551FA8BDDC17F076BD9A298CAFE683870C73C080A79988E2E6F6480C522A1FEEB8FC1B974C84E6D77A8E44CD1BFC198F47A1E869076CA04BA9C363538A9EA58C8902BA40278DBCDAC3D543A8617D355B7EC1F3EBE3521E33AF10A064152C85C58BB3BBA94A7639A9301A1B7D2A59B69E5B95BB82EC7E3B6CDB529837E19F13AF2B79DA24AD5B72894F64E6880F63DEABC2645FDBA26B5F24AB1650F61E587807542A13D8DE386A4E7A3818EC0DF9B0A2EBF16FBF323EA141803761112CA99222B2FD1F808925E66BEF8B09C73857D9E459F14E742407642469E72E8510389BCCCDC874916936C26394C3E31F9CC2497491E937C2605A0622998D7A069746622CA6AFDCC4CFF3447FEE9D64F937A70E0E69FDEC22D7CE06FF5FCD407D991046576E623EBB19BF757DF7C348C43F8B9ECF3768811B8D9FC85D60F061E8E35C9F5C6A47F49A9C9AB3E64726CD1577E77AB348D6A0BD5AB2A47DD40E500082D1BC1523D9EFA3C969EFA2714430D1486D2A3E61CBE69FB923F2BAA568A3269AAE09F3DD94484C403ACA282171A7F23820DBB650EC91A426738503A028A25AC48D2C715D5A717C9F1010485B52F2B3BA9832F5F524C455E3C524C8F0DB3CAA4F252D569870CF75E2C743A8240CD88DD3CE7FD64F45BF5BAB90E6D0847C5D87C7A5055D8E6E7BC1082000694E9E638A4F94FF21EC8A220659F27D6CFD35D55FC571684BBDD174D455A23DC0482FCBEF5827B1B8931F7DE4B62827DBA5D316F73EC2A9FEC1AAB4CB6FE1C474A8C3BB5C8A3B0C438B8EA834D10865906B1A159F3757FE73213C9CEC85F5966F127EA85B01A15DA6FF84084BD90A8D1659FD584086D9E8908520C0618B01F5F8D1360B6DFF49447D8147211FAFE45E352DD164437FEBC60ED423E68FA02F875613FCDE4120B2883EB78FE3E7A77FEC8D00BED90133235EA8A43EFC27F4FA01BCC7799759C93A3AEB323BCD1942CB5C88E294ACE091232D6C856EAA842F80BD5600C37A7A08D207864CBF5ABA54150992409CCCF1952780B15211D967E306081C65F687AF1BDF42708C590B431F92C454E13F273142452F88A4039B003C504E47EAD24B4054A902AAAFC4F3A45D4741A2BC0A3FA1A6DB7529017439A9A9BC60FFB7B84E9DE17AD6273F6EADA14DFD8C5B168B8C29EDE139F226F3811D7A98D6B28C2BD1C91110F64A5B9266E5E8CC98D63D88EE64431BFEFFBEBFF9E27201A74E46E5BC7CB322D0304985639A39E7A70FE19F96698F3307C961B767DE9348A86CEC6E1DC723FFC1AE884D660CA0DD86A2D400307501D2234EB28D184E9EFAFB024829267CCBFD011454FE797CF7853C7E8E09A0FD723A36E242ED4BDA480F48464D8CF8B8D4CECD5AE0F17C9957D9EB7727848F185C8C3C7BB3533883169928010D5AF4C35392D2A81A0876B73294528227A1F5E33B89D186D90BE9BCDC0AB0D9E324DAC08D6BB0FCD2D52BE5FAA2B969D3C2006BF613D6F8171954FCE81E85C33787C14BEFFF1A675EEAC1892DDF6A76374A3C06EC37985B5A7251F19E2F0C51B754E514C87EEEF7D509B080D3FB385F196361C9D866FA7641A3503C2040C78BFFFAACA8628DCD0F720047EFD131D9BABD7373CE3E3858171B27081081CB500AC9DDE24A6D16960F05FE598851F576DF119C627232D8E450C08CE3389DE31A29D70FB981A12087D84F8DA5C1F3F283B707338BF82C9CBCFE3AF3FFB1574D92F135D9F09E68370CB8CE626AEC42441059DFBF30E419BB2C5735721B221C58176C6612D158533DEB2E9A3B5D2EA4C8B83B1FE712A0C1191DBA6C27AC5BA5B43C121D34CD610443F8B5DB8DC63FD9BA82496AB75FC9F78C381CDA16BBF04CF681A083C0630A997CE01D9B8530147A12BF8FEA12E2671AE6D83A3D91795F379E35C3F6E9D4C6DE090BC403EA25087526F215B0E052F26049ABF033A2F5BFBB2A7FAC0972332A862D826725904BB4CFE5FFC6A3524D7C82F7A4C92CE6D38BEF53200F31C229B61D4FAD07FAB891F54D305126382790EB4231FEAA665913DB5E5BB3263E3065048D1C3CBBF93A3121EBCCD7AE7B219C8C74C844FC1DF0D605264AD508001524C4973F3154CF8915D4B466023D26F14DBCE7992E0556849355327C291452DA0F713F77C5C71805A37BF6E3546DCF1EC240751904E8ADAD1716595DD353558DB8EC9E11E3E6444973746DC108E5F3476B5EC9A1ECB3CDBC202D709233DF56DE8BF0A18A7941DAC5C68547DF801C8059E1B12FD30A0085F9DBD8F1E4919E8AF3871678C892783E51D7A844CE5E0F394912C6D9916002AFF593C3AEB13E37F35BFDAFF4767909EAF7273A94600C762338B19FDCA7AFB42AE2D4ABD4A8BD1A4C2B22961E36E5FA997E942A29290BF379A09FDF99BC404733808B782820BC2657E54F52F1589BD1F06FCFA85B28C37EDDFC79A334A89AF3424CD729DAFE5151D44B3F4628465DDAB6602B0078152FBDF2A3CE7163BFAF8ACB2442065186657389E2EE24A44E1B758D775F0484571E5C8FC21EBDC286E5E2072AB70B64DFC4FF2D9EEB6198DE9C3FF105DA9F1C0DE0CAD44D0F064D83C8AB266986669B36FF233B005103CD3279589DA129DE8FD081BA0A3B4BEB9A4B38C6263721FC65C44FC3FEB0A56CA9FFED514C9790318F5E57738B8B273980363F2BA2D90EA3C5FD847FEE126F53E0004E6C3B96B7E69E9FB2693FA698839DC8DDCABAC31753B481A74F6EC58E5FC2BD06C0EFB20B8B29F066A547750D7B128764D4B1366DDB0A46466EE73311ECE95C470B1305D6672BD1E1F8221A6DBFAD9521FC38DD89DAFFE85354B4FC6BD363C899821D18BFB8063D28BC94AC3A094BDA3408C177E34266BFBDC22BC321AB9AE4541A609847C496BD3CBE61DCD964808214A5B4016FB3772E7B2D7D7F8D132CFFB774C34534707A890C94C519FEE7955B2B236695CC4EA18E536569E1364B5BB88B73AFEB7A0902771CE142A4BCA53357F6454FC34B182791635662F4A011071E5D42028D6524155BFA9350FC01200CF365A9E154783DF1C03B3D6A0DACE4E847500EEE8D35A82F49577CDE91E4F6320351DD59C78138129FBC9C7BFD2354E4255BE15184C354638E916936DFC8082FEDDAFF2B0646F2BC9B90AF361A333B73E2A23149E0C371CFFC3DFA41B096B08D0F873712B449A8FC0FDDECD35477996A97441D5EB776C478FAFD7C98B1770A8CEC4F77315A06358190CF180BD27766CDB3C376565DE646FCFC85F21F9575F745BFEAA1654709E991085FA3B80E041A51285524C62C9826F70AAF3DF50652E875252DA83981CF588D3A7BECD186E38F1D73F74422E1AEDC6AC3E64F7549DD2C72556509ABC9D9015B182141C3D79D253AB7482493B528A31D68820B015F3B7947509FC92A3EB4F24D87E08A3D0B2779E70A4D3B3ECDF41208E50D5BE328483C4E764A0091C95767A29A42A9361ABF5B9ADAE25F91FEBB1FECB955EF4A7867C7DB98BB3A8ED57A67972FCE13EE1EFE69719F3AFE30B80034F28E369853B42D46293982737CDAC402AB00110FF0A21E71933D2C0CEECB31EEFA8BE45FA6373208FA058E0A21B1483C53F939D9318FD5A82F5D62BADEB210FA77AFACE12A585B0FA1B0B29BFE982E2D665AFD763948E25430418A10F3FB055E09E11ED19CFC34C7748D6240B302C6F6FA8A987E5674DE264239A1ED697AD61FD5E63F1213F3F81616E00FFABE821099532FEFBB2BDBA0C373D662ADB068CE044F85E52E369F170182138BD6FAC8C8877765CEB50170EA1D8601413FA9D0796B54D229F82C93F61A82CA8E356FDC16540C85DDB5A24EAE443FF4545EE1A9C9210A67AE3E1F907EA02BA7B72D5C4E40BA013C5DBDAF544EEEAE6A30B4D2D3A912DF0D7ED277B08CA2DC29CBDA3BD36DA2AD73B7E0E02AA7869561C64FC4C9D5BB3130A2207AD85F09EB6CA6D40514C263BDE83AF9F3F6F8D639C166A473CBD7C571E2D923EE213C4E2C05D8E084B23D848F813E55646E61B519E2A41B3EDCF9074ADB5560B80C4AF70A24BFCDBD0E8D78788FE5F8026AF039B0267A45C600D530E1CD11BE12C9F14E11EFA88701D0D7EBFBCFEAC9062555C385C11123F2E239E87F858E65487A2DD6775BF26FA79261B397A058A640F4DA4296BBCE39F4714FF2597F76E52C0C7C98B91042F92C85C109E4E71298CB0AA306EE322B30BAACFDD4D803E37037413041D0541C3F558AD99A1C6202839080AB7A642D1D78B1E6D9B012332C69E4EA2B432D31241BE16FD781AAF151A71203D11FBAB5CD48A0301A02F628F22EBAC381C0508EBD4F82C993A30D3B5A973F69244724BCF292539DB89A0781E6D3E2CA59184FEBDFAD27D155B637B91CFEE5C1C1D43525FCE66D4504E38541FA49946DC7749C637AD8F78D524B25FDD388CFDE3D76B9448D5A1AB2DBC928252A35D05DD40013BCF7C3B8475245CEA7A850F8D8B5DD2E9A2D32FA17162B68A41D95BA0F415789B794AFE684162BFD70A07142B84F4897167BDB2BCD18A99AD6EEF55175100BA58D15AE2DB2FE52F3E9BBB70FF830E435F333919C09B3FE8B71C88EEE8BD5FE16C0A691C9A44E916F4A0295B92EAA8B42D0F8D10C73BD2FCE4A32EB34E9F5B3AF3325DAFB20AEB9BD16F20AD439DFE9412083C7F01FDAFED54E577183B402AFEBEDBF004CE5079E6E9B9483F0C98170E0F68D912F33B7716D5345159BD11C85CD989FC43DAFE74F412B1FE4F9A1CD03DA2D65EBA081ACE674C5AE031AFE7F3867FA6FEA0A768959BEA66324CC20B8040201008D4A08A3EA14630E0CBCB852B7AF44EC7D40ACA6D169A9CCE48EC21593CB6D25912AED34E0A7AC71F87C9ADD2CAA1B83298D985F37A0B85893F977E453F7658B6D2FBC808A8FF1600C89607EF496D070EBEF721EF52E29134916CC4CAA9D9FB8A9DE6830BE1CFDFA779F78E16D0C98FDB930C4C32AF99AC0392D3DECE5520915D7E939B14CF60E78AFD3E21D55452FD78783BFA0036F297F61F980C001BCF45129FAD3FF7287A82D3B275D267C57403FE2F058A6C9838259CF32C68DCD3E084EC7FDF81CABF31CDFB2F37496C8291F0627E60D6E17E91DD9C601B302C7AE8B1846000032A035E6B5F11BB23CE690799C2906D099BD50480528ED3E8B1ED56077893C31F803DC5D9C2FA8DB372FE28484955766B75EDCD06F1503BE8B3A813875FAC26078A9D16FC007D04DF442DEAC5EA3D01A985383D367E7D4A5BA2131C7B552FC82910AD21DACE0A30C311B979978D8105DBB0CC01A47A249F9AEBEF3CCCC3AFB9E250571463F1915B5E87C8DA5FA6D319C0C83B221BA4492FB8EA3743A7913CF88077A06C6D409082A9F2C9C38E260143908722B9801C8A0A883F69E58592DC84C0B3FEA893BF8F1CCD332E04C7B610A27DE7F53471EEA19004577BA17E6B1D2E16860B07B1EAF855DC1D172014E200C1F628676CC2B78D65704B485003BE3E8D7C0C1693076F7E5E849718069C1912E0393B5F0F0B736857890223F9C84E6000023DB251AA6D95A3B9B3DF7D4A23ABC055E6A1A7EB70B8694AD9AD2BDBE4D8611A999B4A94F3FB033FE3021D1FDFA0C4A4141D9383DA5BCD35ABDE8DAC2BD72A83DF2A8A889E7B38F1D870ADF5C300C8B4A9D78476F1EE3B7E04E77B5D05C9FFF3D31BE6AD3FA1089F95B71D4ED7A180F2AD6E46AE6A5A684FD47DFC5F141124C16E2A62240A3A5536FA259C7535C3023AF2F213A45F8EF6699F530944FA9263858BD17DE2E2674D7C52C7FAE9405F1BCDB57529354E1F97AA0A50C18A9D3FD9F75DAAC7AD5F48D090452C846DB98F61A059C8359F55FB8E2EDA32DBD7FCE38FA7ED59EE7772752E469D8F71EE75949D4BF635BA13F5D54729CF68AEE6EAC426CC1085770C964B9F4440DFFA72C79CA8A788948199DE108C086C7273FDEBDE451B81BF7C31A31A05188186F7BD9139D9DF3731153DB70D7DBB014D849AA1E185AA7F0EE27964C258E235831AEFF6501725A734521340AC28BD8ECF428B8F6688087FACC7A636560D2A1AC7AC302D91219537D127BB224111114DF9BF8C8BF907A304DCF9CBEEC6F88D69500E1F6BA4D662151772B208F07312A0CB0CFC2DBEFC67C7B5B5E498B87B39FBDFBAD3C7899D8E6583261EB379C9AE984EF0730E60AFAACC27660AC7764B5954357C67AD97A4D5ED1F4CBC3C3298D29D2BDAD10C6CE40B997764E5538AD046CDB0A5D39293BF1003017659B7EE434B666FBD743E1AB569C2DB1C77517D5591EF97E5F6888EA65D9F830BB052593BDA7770369A42D4413FAD76F099B8A6E6F0B638DEEBAA15A11F50E2D39F3F8309D8215CF8DA0741E9A694D31AB46F29E47BCBC6192D9C7D581CFDFDA2A2173F006A5F88091B21B543983E9776BC534C85CE8D51C91CAA6AA302D8AB2CF33805E722C97A8D12F666C72905194BB6B168553398A666AA2C9BAEFC9D5073EBD14E8128F8563D2D067779DBC9EE565738C58086B162BC98F90E3B4D67B7C920B15356A988C84120FD389E9A1382DDCC9657FF93CC66641FED31186040DBF6C882B568DF23B10C7BBBE626F2FEDD9C0C5377B2EFC8F2E9D2E68D89B01DC0FD36627870E429F56FAEC278DD4B23E7EC17CF87F62121B6A2316F29BC16B22678D430908A6282BBDB6E7E0013DC942B9717D3A0D4957C9868F5932CB6A655D0381CD017220AF6609DFF587EE38E72D4734FEC8B6DABAAA2F0CE2B24FAC1004141C2F9D1A0AF5EC63B7B55790CBABB4421311D6711BBD72B13859321BD6D3A203B5CE605B624CAD2CEC3EC9D9724FD83F1DA32E8CCD83C8D3C945F3F35B99404B6F4FF6650418B6687FF858A4D367FC936EAC3CF16E1B262B14E22EB44A4D26CD91CCBF46C1CFA7140C02AA477987D4FC560B34E588101EDE3AAC5A624D130ABEC27EE4891AA5FD40E80C1F29161A820CDEC653FAD46E220CD7FF39D9C8D4E7991C393F9C3EDF884F14B3B9E6F1BFD77BC73D8581FC348920C608F081FCD017E4E434A9E2076035F2F98880B1EA2048D96D9A628BC63B09F7ED99B9B454EA597C7D619249CD45DDC96FF200B3E2240F50DE8F9A3A49AD8F4A50401008F1F573954CC56DBB14998EBABB040EDBC85F5B3317B03BF92E9F7D57C9F6A2C6D55F2F7AB0F0E95DCE0FABAE21FB5B0B762A998C3222759EFEC0D20B67DBA21499630195598EA372D09DB22E810292E3518871441A2AC2A9FB036D32545BF0103D9E9431E9177782B4FFFBCF01BE24F5E9B9A8ADB68E61B4FA8BEB41A17363E769F1B0CB88DEC9988890B012E84D834B8525A48AF674626E29517E91EC2AEF78F5AA3D759E989CFA227452BD0434889A15DD115E80A94A325AE9C94B29ADC28D3DA2205F28597799DCE106EF94547CED86B9B7D046D8CC68FBE31B8E61062779632947D052416243FC5D51F490098B19DDEDF73ABE290399DFAE682FD1FFA3B55701FFCB5B952C934ABB52A1538C19DBD1EB9A6F148C857A381B346426C3AFEAC1FD02DA6C4B12E677B8822F373824EFE40012DE4D12B61AFB68566501239F8CD9EE2A100789F57BC1E9F4B59B00DCC2AE7309DE91C3138F3FF2C8A225B9CDFDD3CBB5B5175424C1A99D7732F3057846E76B759392A67C875E3BB79CFCEF164D0C38F2AC269EC084C4B8052483D75C42252D41A380AE6283D4A3BFBD006255FED5F3DCEEBF38FD40A0594EF1B73A365DDE29467350DF99C81802A5EB22D7524534C72679A9D97FBBAC2DF6F8227FB4F1C2F653E70EAB352CAA77083036EC93AEFC9D1600132FB4558123A2B48C68652ADE8540C949926457ED68CCE09C140E83AFA9740BF2E0C07312145B42F599E293A72292E4DA2B6D5F52D36267CEA3D8096B76CA5D19107B9DFF70CB133784B8EC9EF3ADCDEF431E9CB5C57FCB0EB05B6457647AAFF901643E0C936BE47CB37F8447CCD13ADD16C4885C9B0DEF8C1A953766FA49B171598E5046267B4F0190DE7DE98967EDE478B3CDD690C7825A5A0374DFC329CF76557ADE904CEF094623CDACC0FAD914C8599E9611A70D7D8FAB1245C40F16FCAB852A8C777D444DF784872A29B7C62B3EB33A640F912F05F2BAE05445D0A297D6CEA43BF3FE7F700313AA21FA898C9C9851B0B92CE658EC0A249786D511D711900EFC42A3B0147F607D3DF47EBBD1A6D70798D44DC9ADDE2DC2EE9BEDC83EBBB319E144C007D04E34483F95EA3F643E5677FB109EF3B8A61790F5ABADCEF46C1342F34237F8EE7EB1B991EB69F164EFCFCA7172DEA3D8D28B15911E0FE3B8CB2293F550B857860C87741C103BD5E6CFF2E1745BFE1DBEEB706EBFF62DC53BC330A2FB93A9E7B3380135B2C9A2B7C5E3EC1B1E59F5A6E87042E24BDB89F33C5BEA2B0FEAC0DA2165438FC86D103E396BB24E7E6879FA1B9EDA2C5A57583936787DF4F6D26D8DA709397BB5A8E2AFE1FD786290A740CD68485CC14E63751C4EDB556E1C16D0114EB1E0259459B23AD76086BE52C6FC255840D8058C5C11D06931E3D58285EA348CCFA9786B63998A798A6DBAFEC1708F35166EFC40F0C9D5E01560EF4112B23069B06DE0DEA140BB7F0A64B1FC3158B0E94BF2ECC80F81D77EA7C05D5E94ACCA8426E1FDB9D6068B53C0B20EC968AFED91E1F24488A6CC4A4CA0A06D09F91C154EA75A598381893E12B1CB7FC908EB1C36C57CB5AB9A876BC1F0C5AE31545962EF4C00A37F8D3CA931E282C5862B4A5776DCA33997460BCD3E09C5EAACB3C440DB6037305ABD749FFD7361800DBC458CC96C55BF49565F594A20E1198D8C06C2DEC232C678D9FADFB3359C102A8AB597B026FF11D91EF99CCD33D6E1766EC34E2F727769FD3B659C93F1263E7014621959D6DE9754D88528B75A7F2A0DCEB784B6CC702E1482EA521111E77323280081A786B70AF8458F4F71636EF70773ADBB9B2F5833CDDF8BFD1EEDAD772966E80238E2BBB6450EECB9BE9C72515E3AEB31301773087211422F0E44E35526EC204BCE1A252B7CEFC52457513CCCE47EF50DC2D682D88934849D2DE7FADA6786B6107FE7FBDD1A3310663B49C4D9A873C98902347234B82C61086C12E3FF99B165453005F83180C8A4533D5FF0FE5D076A9BC861F9E9B771A4E974819347FBD6E06E5FC810C9F49C69A9FDDE8972CD730F1B29E428EE0B1A947364184407BF7935FE6190F30180C06C37E426D7C44ADA7EA44AD863CA256806388CB553AC1513ACEF7EBB0C64BA991EDCE4090407FAA2A2805AB3C7111F4B7C74BF92C1752046F0215E828F69D67150B8D3516C1FE3B0E76F862E88FB4A7D58AA48E2CA0EA125701A741C09CDE9C958430053A1D53DC731C0E6D67B70D36D65B2E2EAA5FBAB0A291EC9AD659017D44297828C8F688ADA0F6A8589BF4BE48754531F5A5B9E8C1DC54750964A0C327F2436B4D3C3663F96F76246C3A2D9005C99102B1782966CAFEFBFE62BDE11D97A3412F8A79EBCCF8E4F08DDF31F00BD83CCDFAC1E4B2EABFC6F14106683DD8A1087EC471DC206C39E056375787331667BBD8796ED169D7EAF53A31790488ADABCF75E924859EA254F397F4BAA9C32AC1B2D634C17C397A482FD370D3E9B087826C63C56E46331D2C2978F26861EB4C2252691EC6B2075BEF8EB4239FC836C2C2237722875F8F90221BAE34EF665A353C8666A2855F7961A58B9C16A6B0FE9DC72A1D09A29B91C417F6502380979D25342171A20968EFFCF364B9944C9E026870A466A23EB424595224AD3B0251F663780B684DB5A0567D402019CA91CA0FFC5B21CF001DDD7DECDD3DFDEC659DAC9D3D94ED885C3CDC9C6D7CAC7D820DEC7D7C9D3D3DC09EB69E1E7E3ED6B67ED276763EF6BEBE7A13BAE2EB6EEBE9E1E0ECE36EEDE7ECE9E18BE664E3E669EBAAE1EFEECC15C46DC3EF606B23536B2CAB7F04BF347E5797E8410658593E1B86A1D33FE94EC3F95C8A48BBE7A687445CAFCCF72E17DEBCF9EB14DA03F3CEB74EB037062DE058AA2734AE17286ADCBB7B8F593FACAE9B7B1511C42017373BEF4E719BC7429670A6415C076D79711E9384B541BDAFC22F99168D34465B8405B26023F11417022438A09AB54502B25222BDD183456BE3A43607FD13756F4FB0789034C58CB7C73F6C6CB5C29F51097288AB00721CA7493D4641DCAFA5C744E6F994256B962F6A83831CFFC7F41BFA736CE7193111CCDFA1B9B35751C730C009900DB94266451BBBEF17E274476C5FD82E70B4CCF915C4D4ACD5555463BE594D60635EDC857731F889F077F02F00D92F93A2B37A2E6DEE47051667F6B467CE0896F2CBB0ED0CF7D45C150FEE59574E5B4BF6CE1FBF24FD48115941DDB28FD4E6401B78E013704081DBA3367E53C69FB31F33C2FD55D918F07D3F9BBA191A03D715B1F8171B1CFC6810FCB5BE11A0A63D512417878067ABA43D7A0C6B068809065C968103AD55DBBB89FD10901E1321B93426A19EF4D86AD83A558B898866FD739C96FD43327302F70027FFA879C6A1B2E376AEDB7544960E04A980FA43FE29A79468EE72FB1FD6471F031CC085DA56768D19C795D1A3FD2A8BBCA1BC1569308F0144526A2DBF8253FCF20309C2B748D3B600E12C7D06EF332BD23844E8D5DFAE713AA4DD99A6B4510BC6E824DF857CF0CCEFB1DFF50055005EB0668792049C23F7E7E7695B393701EC112B256D3906C8FCE39FFBB9FB8309AE8986EC210F629B8514B418DD003D1BF93E2209772B9FBF92168B8928E2CBE27A12CB04022AF6FE5E335BC161D30F06C2999CEBA3A2DD2DDEEC4DB988CB9EDF8E37CED5A4EACD65AF23FC03F1EE6CE701E9A2C92416A59956D4343E5A400085611DFF46E6EAFD177DA8643875F8E73A63724768FF59946D48AFFB5D2F4C0EF4EFB7F46F72CCB8724CAE39DE64D3152109FEAB0FD68D29B6DCF800238BFF37E3D5DC6FBBC9BC0FECFD36FBE815A4A75333A87F97A4FBC462F832546100076FFF08F63B8BA7E4CC92E81FB97366E3F1E116E32D7FE15D472DD86DB10ADA595B3A5865A85E55BE7975613E83DDDA25D53C7F07D82F0125A887D4CCB46AD0FD107094F44529264B343FEF7F6DE5EBAB6D7179BC892B27FCA42C8956E612CA75456088FC02C87F73E927E93775D4F232FF61FE789F919D5ABECDB53FBDBA6E487F41E4227ACC6920DED047887BBFE26B318B4969B648A83856DEF177B4B787D2B9D80CE9D463F1CD59580002CD828EF311DC07A22A70CB48191D799AA76EBFBC689ACC78FA322F04E941F5E886A6439491D6559665EFAC0858A46A87FA95ABCED7C81C28686BC8632CDA507995E07D5E54F147FB6F4C966648449CB2E1E540F0076C6051FA898EE2EF77A9D31B737925562D52FBE26EBD5163E8F5B2DD0B55BF09F6CC30A900C4843EC56861C2835A2FFF20D16F3DEF2C03680449080E3B675C3427DE79E6ABF0688DE2F42439601E28E3240FA187B1536636CB0F27258E91B94730256FF577E9696AB5370D54CD20CD3E1D816345E0074DB86BEDA7BD1A8A6EBDCCB333E7918C6C499393138E8004240701C663C5E5BEA75CEF7A8C4087FE5CE1553D6832FD88B21AEB4C5034203B3A0D8F314DB27D3F53136D8728EECBE5DCFF045EAA835F8D3C20300F71F84EF6CCDF77927193E94286D00F06729F271D1316DF3BDCB043503F1F15B49B36C8B2EA8C61959020EA8E97D3A939039C8EB6769FA20696E8FEFC95E08AB37A4F65CBC0EDC8E04D677E5BA3C603CFCB6148A6B3EC3D1591FB57480BDC4E0ACA66F17F34F537D18C433A1B8DDCC1F3D1B2A4A4F2E5D3D8842FBACCEA1711A2C945FD0A9F78B2B9466EE291E32E3C0844A4C4B35392CD444EF9A6A066AFA1919566C73E6FC370B5F3F6A71FDEC83D4C3924674FE1345BF9763F1099606349D8A51F0CF826981897CA7DC2E33DE080F0636B3C442C6B69F28C1FF8F9FFCD5825F21CD9057C8AB02B3184CE80241AED95D9073F721B65E7DC9F5EB699D61872DFB25362F64120100804027543210FEDD1E58D31E0ED11F8D840FE6CB1BE6E51DA8A1B6C40C6FC8D91F2894B5D9B39EF05059905292A6680D1CABBAA0581D92666E1C0535F45291DACE5751EF8A6FF0990A4E0001D6B2BA7B1CB9EA0FD5B3272E8AB71C472746FD3253572A6F8F857AB217709B6CC9DAADF8B6F8037A746CD203F97C9A7A1EA84BFF075419F46233E7FFCA1F07D5FB0AAE68B80B005745F7525F31203DE1E859F8CA2D65F1A0462DE5C865818EDE68594BF74E092EDBE847CDF41A9C539C704FECF49917A10884FE9228260C74E78E682122035BC73B5663BBFD91C1D4B7C780E9BDFA443BA37DEFB6174241F82FA8882E60447A72D4BC7BF381F5D338CC6D7D1FF1A7E2B528F8F3F6A339F165E49C08AD2CB6F4A4730C4019703BAA5E50DFF74B8E8C25CE82C77D8B9DB4A0437E1B1BA4AACDF1CBA71C4F301ACA6817DFE45CA3593E534B26C16272603C40FBFB4B84925F84C7F0928B62ABDC32313622EAAE87B2518816E7EF2B17C22D8132F48DF73A7AE13AEF50218A1AFB1A860942BE86A97A09DDB788670B3C27B10E954F978835115B2BD1F62C704EC4077C3E585CC090058BDCC56531784A17BF0012B4D1B6F77A2A8106F25CE3A33F2DFA6B47E9DB2BF6A4EADE35EA93423031C2EBF32DC510398DF54B836507082DDC2722029D244B0ED89E25ABE35E617A49F7359084A3266186FEF59D9ACD14F2C464F466EB93832283BA4FABDC04D4D16B986122B8D6FB55B7775F4A5069E5F150922E4C9F082552D0402893A13D93621D77CACB287FE0FEDB729128D99AB172A622B46D8BAADDEB4DA6A8EC0CA784315E9B825958B5DAE34E09CA74C3CF28EFCA3369A7E1AA47E3931E729C1FCD2473A3FE7C8961C195E45791E1DDB2B7324AECE95E1AE7848C96C0FE65FEEDC6991EF5BAF7C864F27E706B9C5AB61768781C1BDCBC906A6057EEE9600F2A7671C278A41677ADC57CC9CA67F5C018D21C8B6C8789B61E1D97C52FB42929DE056464E010F42BE36026DA53F4CE4F4792A9B47E2108E4268D70C1BB19DAFAC325EA3199552B3FA6044487DA78CA3646DBFD5F701598A592169042FFDCB5FF6D3ED717A22973E86FB9F6FDA53F8B6E11C141942445A955CE3D8E3B744470526649BC714ECFC6E007B9AA21234A4E129F36710FC6EF5AF69E128C5F9153DC4ABEA54FD8473650FEDE4DA6B21663E2C15FA90ACD4CBC0E3D2C648762FF9DAA132B348E37C7BC1B74995C4A31DEAB1155839D5C371CD6A15337865E92989AFE5F87279727DE83E96F1ACC4F33F91D57559DDA4967E3E5694D6EE79A50278CC44F72FECE0F7F2D448262F179EB3E63EA49342EE4F99275A345A389BDB646080F26FFF08E54ABE720D6D4D3758CEAF829546BFDA2000D03E1AC24CE22D28B2D508EDDF3F1E058F59313A056B40A502A395B62E0DA77877610B2D68CAB7FF48D2E6722ACC2C1DB1A34EE5120ABC7E9813C2FBA6A9C403F810D34384BED101C47C2BBE9D2F64B0E9CAC1DF9E7A75690DE56B8D16E788FCB6AF8805170AA92A821FFA328CB577FE5704187DCC3BE40F975C37724530C0807E2EC3E710CAD7EFD46C6A4D97B6EAB73C019E8622610C42F96C5099E10CB43400B747121AE152E6F7193CE4FFDBEC3524934E5B503A470087D6B55CB7EB029352BB21ADA7B256FC1E2D6B0EFED0FE20F8DB54889C9D9032A73CDD70D8A9F2951AC572E47502F0F508FC0FD7E6035F7D928FCCDEEE715B9E2604AD20401E946AB92398609627649C32031324D83BC48BFD69BBD6EFA92EE02E736B5AC8273D8CE39E6579954DDB36C752B123268F41F63C3BD7DE7F0E20C19D7143FA5B5192BA56E7B2DF3713A912C596F9FE35FF78F77DF5D1844DF8B08DF0D243D0D5F9CEB63BBAFB8F905AFA38C9CB3744E3EC8A1F1ECC45E1CE81D435672FE77FDB2EA9029E948FE97FFEEE019C5CDE729D3BC1FF8EF6C2C4B06597723F27901CE96D085A3D33ED340DE5267B0609AE89DCFE4A106FA18F889731D83408A7CE9803A19CD9295B44B18D252E0147A02BE483AE804F4CA9820C0DFB96AB60ECE12F7275AA6E8E7AE3F1E2790580AA1A0244D86D29A996A801A28F15F8F047F890682A5827BCDF23BC3738060ECBB1D3D852A4BE7221A9E9B1D48CB028200244821C0F16583CDE689C9E0158651AC85B2C16C17FE6541E2F2A0DACD3A00E481F4B94485F058BCF03D44A187C0AF2835176D461E6DF6F20B181B11FFACE00265F9BB9FF77C2D30F2E7881B038E0648E908901146011B712792859AF22D078E4D47937E88FD21B817A21BE3B385F419E78336E43814F41266C6126BCB4DB2702A241FEC3DE9BC6A497F43B09B6AA21646713717BF312DAEE2F18EFC4D5374496A1F4C73E382E571902E8387376A87D103FBDBE61241515F0F831356F502C3135B15B83BAEB3AE7A933E17191B192927B6B6CA9E88A96FCED7F2CD993FFF2DE6819C177A5EF6AB9E366E587A71A08F797135267106E922E18A16919A0269961824D2FE9DAAA7EF262F7838137588817394A82F9F6CD47B5C1DF338636E18747AD4CCF930AD2BFB6D790D095001BC7AF5F8B680D1D505DE24923C62544573BD97692C8FE6C50612F0FAA7EC42B068140201008E40D7DF0608E85BFDD05C5A0C7D1660BBE5E36C6BF5ACCC4B37046C986A1D6A54556FA27206D017AF919E4B0985D0FE7040572AAA45E8ACFA51C53355D0129736F4B4B29A6A8912DBE19AD9A06DF298A9D007C86F65ABC5F0D8BE6601303F3DF8C8335EB245DB72250C9614695069A0538954EF0637FC243F2BA5251634D3E201BD57684B44B25C1C5A3A3F5EF27186680F2B7760A84D4F092DF0C3AB4CDBB1F06C08B56412617175E0FE1EB4497BA29928EB12525E390B456575D7FFC960AFAE20AC0BF63F29CF296D33A7E991B44FC26C5CD94C6D2F47725759F5BABF5B5FA2D10111EB22EDE87FA11310C18FD30404E9CA77A19F238851CCB18B97DA2ACB0F069F1062150EBE8E78D2D2EDBB7401BC01AE0FA99C9FCDD6EF1814A6CADD6CC8870AC25326CF0ACB4653646F9E3647841275460D40C50BCA9A05831706D11F65C60294D816C852D874B38D9D682DAA1F0C7E6BBB0D9C901EA326E9DF27198BF30240CC904529E70620FCF4F3A7AADC8ED0110A4ED88BF87E5C73050EA59379E88BE170C414600237513AA32070D40B1D3A14679C621918B2C8E93730A494211944F388EBA2351C5053117D49F3A4C2F4ECC050DC95516287F899AACAFDEFF140CBD5125C295ABAE7309731B90FF9C83B2F627DEF6645B01BE76ECEFFA771E6D0291E9642523C7AA26848A814D21859EB2310162CE5B14DA5A440DE544FD5E51735A6A3B46D8B24B58BEEF2FB90D7C8D2184100509335BAEF4C682AD86410D702E79D4D189919A90EA98CE275114EFBFF1181D83FE772933DFB47ECA498F6210CAB9814020FCB487FACF7A527775AD61853ED067A37022F52DFFCC0DEA4DF94260CDD84DA01E53B52E3089C4CE4857237A39D4F18AAC3D501AFF235A6E6B6E0C2569F3D2345B4A89D92F7891AA5FA4D0D296E8168976A73554314994D72B4DC3191AF265746EA12005E5D765F5ADCAE7D93385FE919FF0634DF3439B5864B76B85014269C8F278592D4D29FF97F5E6914E2FC489DA07389B123809619BC94EA3C1D6EABCB6A15662213CCC3D00822E611C63BB9364590062A622AFB6B124334A6C2A5FABD06B17730B71B710D3DCC1DBA9608D9677FD5E08467B6F6C9BB43683243AE8CD476DC9DCE6649694ACA1D996EE4F09BF32EFF2FBFBE607391C01A44592AD2B8AE16BC9E1FE703177AAA962F2C55F12FE3385436ED87BFD86E23E9D642D2038100804028148BF431F496B61B108D7DF7B0B8E28BDC3609DA48656302B291D2B042B782B9035188412A51765F50E2126488FB17A278010A6EB6B396448E9B1AC10F479AD10C79C95EFFB807D31FAA776F3169A0F866F0302051B5A8160AFA65A5652DA362092CF4270B04F57026384A3A2C056523A51E0741B10E84B46BA0D08CEDEC094D70AE97D17CD0604BAE1B542D0B30181A9ACA848ADA8C80C4CA3ACE0D2A36C4060F8773220F0DF470B6605FDEE10C2238596960D0851C5C0D40A41CF0A6205E2FD0FE3275344E9585181D33F6B0C2B105554BABE96FDFD20B002FD4C54644CB438C601DDE0112B1B10D917CA4A4A1B9601975EA6A565606A05B292D24ED74AFF6A16B0D74F94DC8A92D88A32064C90AE9591AE65601AA9A114DAE47C8F6C05D2B192B682F2A5D059815E4D6D4010D168BC1AF07F03D32870541496A3C51F3F1A9B10DF06043137E41398D98020600353530F3656CB5EFBD80604F1B101817F1B98A66BD98020B0E8681B1084CBC0D41E15AD4046D97ED9C3FC32B4B4B30D0852FFB683A56B595145816D3F8015C834260AEB25D7B06E088B066B47C5827546E9600382F4FDDA2236166C07EA57DEDB089087581B1024CEC0609983997ED151AFEB101B1B0B7E770C8E5C084796017C7A2B702CB1D171362048B781A95656A671B26837EC81630382537901A28C1CDCD3286D1B109C596CB415553CD80604393430CDD0D2CACC78D980302BA99838389C77E1472211C8465F2B500C58DB01F851181C2084FB9201BCDB01AE3E2EDA54211C0F2F33062BAA57F17FE3E6703B843DFCB5329D2CDEA2B4E7BB1BCD936605B2824443D3B5ACC0D104301B1054DCD02A329A2043CBD48A2A1A2B0ACE0604D535B4014175D8E5D6C0D4740E75884AD78A32AC2B9515886AB629ACA81CB011F47B5DA3A349D35DEA4D62851403B101417B23DF073DA26D40D08819D9093A1E1FF3F555E768C1886309B2B460F104B184738B9E6591A3D26D25FDEAE66D40F0043620782C1B103C4AAC0D08BA6BA0FCF433DEAEFA5775B001C1F3BC99FCF6CB3BA2620382978EB601C1931B98C6C6EAD980A0C96C1AADEFDDE4E92322D6729DAF1A7B44B1A30D089E71D542F816D2E78E08FFC9D006049F6405328C67E86F05F6BE0A78BF713B1A985A512E0F18FCDF81E11BA26C40506313655D76E679F48C025B51C519D6E3976154BAD68F07D9B301C1AFC68DA288019B2DF335AFA1A9DF8D144DE6DE5764034240B10211C75A21417881F02706A6C4B018025F7B15362004FA98181B10FCBD471A22DA0A02892634E1B5B001214845DB80E04E0C4C7D238660168860BAF0B640708A762139DDCB14FED18B933F7CBE57B80BE95A569431D856E0283C1B10429DA11528D68C81720DA313C0DA53745508E571D13620044203D3F855B90211CF59B212C712B442E88D77918E5620D368F7BC57088786B11FC0DAD1FA56E06870869615551C387B7531820D08A1DFC0343E66D40C8888A3DA8010E1AC283F10444FE155C6E86B995A81AD20891070E27C249C8CFCB3970D089131CA530444EBF8523FAA68731588724BEFA0B136204432035387B9396B5C71980D08D1C40A246C05BA7EDBBA0EC107C3B706616DF49E05A800963568C6D00AC46FB54306B3F5D622AAC0B6067D3484D9D6992928615B831CBECC89670D21C8D91E809686F0E5DCB4399740B472BEF529230F0A33B406CD18981A9513CF1ADCD73E67A5409AC81871A14D311B1E8C9903E1750B0E032D10E113B142AEDA1311A06FAAFA34CC4EDBE18348E5E416FBEB8878E5F402A2B9FD530DB72003598336AC2185DB9CB1AC41C719E9D6987A1BA047706D6A0D46B382C204E0A2C0E9D660C48C746B2C4C03536B3896D76060E2FCB15C3AB35843C9C6E00BBACF0E6262225F1F69C804A5F1C4316F9035721C12973F3605AE4A56C6FAC2CC849C1B4AAB0DCE19216F773490A93578D61AE565DC9037A73B1F0848F09C1135A9C010F4232014D6E8121884352AB6BF72D3C020CA1876BA1FBA9D5D22415C7ECEB74766033020E6851C38159120F914E4A4C760BCAB5670303D6BC8B7746B1C490353981525D88A0A960185045AEA519E1E18EB09CBCC488F0AC7C8A2C747179F1F7C6B381A439815259635E4DED01A0C82C5E84121313A195654E00C6B381A03D3687046FA9AFF919946E945E9A45B81C1E9565460580CB6351CBC61743A9C152541343863599347AD6A13CE0A1CCE1A8F56A0B8409A17A2B5B1964E91172992C5CE96024051DA96598157C17E087AD34E84705BA4EBA5FF196FE9D0A90843EC8F7AC059233819865999729241F5A2B1F1ADA13F575CC4BC11595C44F25A2623BC862C6ACA222CFEEFAB8B8ED6B3862FCA48B7C6F9129822C3E64CBA97D464FEB5DB7CF845CF37B0003FE9A10A8660D8CA1A392280C998EB5C8D1E363E0CDF1AE1CE50CB34D1C5F14C131E39DC17EE091015B1CB20CE629743A2440190FCC975EACE18EF72126B45838C34B176B7601412B25B43D3184050F8956C2BAB7782352F0F1251313E838A214404E20A5C1BF7ED8C678D22EAEFB5491B60E65D9F97C8E41DC4425D02633C5CB929CAD9F2AB5862E5C8CF34656B0D7F5A883C5DED0C77ACA4B4DD314241693D972503532B284CCF1A15398C9105953F236A7481510D0B0B35BAE0A8F6D30D660582AD0BCE97D8D6E882865189410BD4C3C2B746235FA130BB9CED72686E8C3BDAE0264D64BC05456710A20B496354A0A123DDA3C68437019DE0ACD1DFE6B58862087793C4E23B82ADA874924110A9AE56543AB0AFFFFC40195A195A5A7A938161F4273C08F68B52BA11E13F7C75A2C05432019904979C35C6DB2FC95A63FCF9455DBAE343B202596332445B630C1B985A637245C55963CC1898666959634A45C525A1B5B0C6D8F9E9052B475963A21898C682932624B66811150517071F51C71AD3232AD61A9334D5861A4BCB7568B0683BF02A023143537B6EC51AB32DCA1AB3C0C0340ACF1A7320D24EBA018F7F486BCCF9286BCCBAC8BE52CAD0A0D6986751D698ABAFF4F01EC342C6FDA1D201AFC61A8BC1D01A8BDE1A33E08F16D6587C4976ADAD3187D3F85A5963C97F33A4A724BCA6F8F8EF2DC4B28B164B3369A2A53556E42F6DACB14CDFB9953556AA2DD58E8D7E0B16F74F4F9095556CFCEFC8186E34CF527C7442BAAC4687DF24ACCD93F27D20CDF45A9941ACDC7DD1ADB189A2ACB121B6C988CD9B0F3666072BAAE8D83F84D89A59B0358EC0368F8D8EA37D452B6B6CCF99A7D668342934879920C4AECC825D1188DDEAE61206628FCC15152A99811CE20E42BA9D8931E12090B184D764AC710C7FB91E6B1C17436B1C676B1CAC3FC0DF038FDDD11AA73ADA7F34CED0A25F6BCC973D32B5A2A3E196B157848D6F8D3365688D33698DE3B5629E00648DB3F53ADC310F8CC1A285B8E07C71415B27DF4AED9CBD1C7C8D6870A8F6BA2C6E7592C75F709BA852D1D2EB2BA798AE96D6B425D5A4D84CB65DB50218EC7C3DDD6C65414838A096A205CB78C75B3DAA96B4AC9234959EA7AB7D5FCF91C39BA1AD26773D6E70E0D53D2E477F5B6A3ADA9F15D266646127DEBADD4716E6FB0B36A4EECF321A6D0286421E033A7DAEFDB4EEDADFC167B6C1B8FCAD7D26D30A8F477A7E78FB6D422220BD87EC5DB8DAFFCB3F5B3EE8945871AE3539C0AC36EE23C11E48D6B9E688F4DA47EF44339C5034860688538A059E5251979D569D3FAABACCC3496BC6830BB732F3B414BA1B921F9528CBBA2E585792BC13D469B2A427A7D905292458DE175E44464E97FAE362E6779A50C688986D04CE11C155476BFC88E240147890E4EC811E3077E0065891B6E2A2327C465384EACAEE95D721A52C12A1602176C2A536FD3040037CCC2140DCE03C14917857CFADD8F03E8377774CCE4E28655A6E0EA861E101387AC26699A6E74E982C0F268F286A3D4D4E698587CF981BC7CC786D64FCD28B424B986343844682BFC3C4EBC1D917BF15BBB445523C83FAB28884BF58CC95C3D25259DE710324F34E9DD747FCDAFC81122EF17B961377DEF4303DDEDC0AAC13A62BAA7E8560883CC88CDBB90535BEDFB8B5A87667F7DAD1FDFF5ACF8177B00EA00CEB5BA65FAD968435A4A23714F2B7E5A7DE0192E96BFEF30BC8A2237EEA178B51C0899C128EF0278E06D71EDBA455A6F19D15965BFC3700E7FC66B3AEF0EFB208C7F9BF189C9FBEA6683CF82D87561A2587501BD22241A8C2C332D4509C3633E5BEF4BB91D85314376E3F5B2F691001E660268E0D8BF5545AE5C30AA37262D8D04F4DF2A59F9F26C27C78DF3FC74206770B841421601EA1C0D0E86EB0E6057122B1253C66FABB2B9D753E76B9B464F4381DFC1B63ACD252D164B108391477F1236BFD0EF8E74A2750663E2BB355C713EA2D57453C88B558F9F1D470BEB729D37E741527EB8493AB16FAD01A14639C60E81F9648D3BA50BBAAAA7EBB3E24F6718A9F5721F48B654C7EA97F1F8815EB1FC091990AA49823B612AE7A955661D479382B1854F6C5B28EC435B6587FF58501BE1389403FF7833F47B2F6C4D18B64425D36FA500EE0FDE4DAFE13263C24EFC858A59CBC09F00B21ACBDCA06A367575D4E9CDB24B78FB83473A56732E822D8A6538BA91B78DBF9BA588260143F1205C685E0DC032353A28C996311C85E621AFE45FEBB4E0D4179FC760762ACCBC04ED34B8E7DBBFD07DFFDED95AB13CD9FC8D2806B102923BD1FCFFA24AC1F2314C3657BC6882B7995477F2533AFF2CEA2F0431615600B670EC9F8BAA87A903A237698D463429C9AFEEA790754D2B3E8BA741588BED3D65C6967550ADEFFC8A7F1FB0DB5E413FC0C2DE62DB468E5FE0FA72985C665C2B8FA61C0FE318E566D6811CF99561C8FD894A0B31BC519AA1FA464829B3E2EA875C16E1890075FFC31D735969FD11F76461C72A544187C182077BDE6FAAFC8683D9EE9DED8097F05823EC29FD338EE6445F565B3C576E8DC8275C2C7226AB1891FB837AC80CE78026A92A828DAE6B4456BD799397E93AAAC8D8C1E9D20137E703608197AB4D9804C03586714F10E158819EEE1204FA3BACD0F48B653C0B49A1FA72E4147B2657E19BDD29FAA867DA512FBB183BD15603E62A8B4543C8E1C531323A486BB5F945B3FA50BF2CEDFFD2504A997E3F5710FE0F509A81010393FB3D7001BBEAF81C54856A562A6AC164D4B20A81F8B263414418BC3C97F4B28EE8BB04D2D4775BD5AF1D643BFB861D40D80B44E52DCECDA7A41272758D2D5F0543EB4B06DBA2128CA200FAD816CC13E5943112CE4421B89298E3FD3249D7CEC4B977EB8F3002D6BD40DF8119607AEB0CC5DF7573DF0D3828C61AF12EF3E06AD6D7F3FCA79917A73847E48DF67ED2649265236BBCBC3B0AB145429BC06307614177058BDF9B72ADD5F687E9D2C608FCC28CE88F34DBB94CF17F4F4C8E476C2B775E718F23C7A3471B2BCA2EAD97952A9C7B9829713FB235A815CEE6070DBF840B7F636BBD3A55FBD9DA2FB7ADABADAFB49DB597BF9D9FB8006C1A1AB7FA07623B50A65464BA85F56164C74BB4E7AA123D4E310434E71AA391B02C88D383DFB3B5235C8B01017F1FB3F36E5FCD5A48F7F538D909A56D88A06F0BE49C0F94CCA9A18FC723413E09D24E87552DE6BE15E38DAB2A0AD14CA73050E5AAEDA8DAF551741ABA2CFE1F0A7F38C71292486214F841E565F13980BC0EB2860EE0056562BFBC9A88A9DB5CF28D8005E86ECEDCC8EEEC19C3E81221DB8530151ECAF23EA4B78387F779F87C4407FE4C9535D8AA5BF18E6029C1086F16B3D05D30CD86EE4659CED623F0C08B21C1B39320EAB2B926DC993199B13711DCD903E274132698ECF141BF2F36F03A8D005489B513B90F745B1287ED47A36C0B87E27CCFE6AB1EC14A53A99DCC71C6B6A7E3CF67B6289F007FFF6D73E645046D3D50E41E7BE6EF90EA7599CD6BFB186C2D5326FAF86E0EDADDCC25FD91A5A3F6E30BFA4D4AF948CAD048BFE8F7607E008BA428ABA6C8F0C0F658124410FB91738A54B4F9D747993EAA22F1B3FE0CE85E0544351B00A4161A3CA40B6CCD919FD48F9A9ED6848F877EA572C3AEFBA6325DDF02422FBCC3D1DF732820BB022D90FC415A42129989B9D878525FEBAC09FBBD5FC1AEC41AA6A03CE659CCA4C35E074038F0FC15C414C3300037BAB6958FC6DF8087B6F4912CD2A33E668A93D33124B1F612C0734AABF498625009E8FDD8475419C6869E77808415D685722B55ADCDB8D42F7DA393DEE4B4D943163E556FBC2339511744D114ED2A1B7C735C1B341A6B7C1FE4EC932DD56D085EEAD06B4DEB8423437F8B89858C44A58DD04DAF88FBF7CDD45A86517AFE5F831EE9FB859A0D65C538CCAFB4F27A980397E8EF5DF371FC5B973EDE885B124F7879A2F9D5DC5865DE975B2D4B78EEE379DD0D4C4A59E0DD0875A24FDBB8BC1CB762886D04878A09085C085FDD82B8D1A9EF73DB778BA88496290A53E31E9F5A2CBA7D14E08E6CBE3A78C48BD1585586606F8BF741C9FD729E7E03C7EBB92F44DF73B2E4C6848612CA921F1EC11F69DFF6E050CCC8B813950E37142F621AA993339AD07C5288AAA2639834F605EA61232CE803DDEE0026945EC68C52549A219ABD849B353DF800B83A8A2375B3C57D2AAA07DFA266C55903753E419651E7B5A5B9FE2F4A10F8828EBCB55BF4D3A655FAD661ECFCDAC480712E444654B14AAA2CAF783CAB89CCCA69B00F9E95F57EAAD3F5825448CFA456137AC8E0F9FAAB15D8F0C986BB2EBFE84B07ABF26E02562E0B9D6D19003079C2C1DE14B76FEFECE1D5827D86E411AB1B2AA19BCBE5225E352B4B795870BB51AE1725A1BB43AAEBBFA32BFAED7B54F848E8F55A68EEF31CDEC8474280914AD85DE1DA654B88D9FA17AFDAA2178FD2CEFCCF59FF37BE4E44DB192723F0C1844071DBEC1972B1AC04E292A97F69C7B4ACA0A4BC7CADB5A55B0C3C81C4E9201B860AE174D32BF195D6D783454F13F19DB0EFB87C4A734588A4D0FE57F25F82F40201008043A0D5EA005A93F6358359B2A31C78CB2E51CF468D17612A17D1F9DB6B61B580818388E58D7A5D662BED41EC46429E8A07CB02BCB6A864841A456403FD4D350D30E01371D2A1CEE6F1E6AC2CF3B9377BDD8DDA6CB62CCC6894459C7FE31346ACC882A9DF0282B253ABF608213485D2EC5AAC64B7CC23ADE19CA759FF46C9AE2B5C05E490BB704EBCC62015C8A828AFEBFF0B755782D0A90FB88F93DE28C8A26CFBBEAC7D6A7E55C01818EE681E625A883D5C20FF69F65B5B97DFE500F0CCEAF36797131CFB85AE4E11A05A4FBC26B41DB36FC932512D0C98E2BBD9526C04D318D1FED803A2172D102AB82187587F38F5D225DA8E4C6831349D007A4C2AC0CAF7D905A85493A8D1580EE1C049B8CA66AC0BBB4A5C34D8349F4C380B759D707F41BA4DC867899F09AC78F130993033BDC3379D2FE63BC821DF4D97D00ED83CFD113B8C8073774FF06A24A4B14EE45238DC4CDCDD58B1AD37793D6410CE9B114A25F4CB31297D032C931EC6C7D0B29B1676998B15282D5BD77F6F8EBFE0C32BB656B69EBE0410F8A117945F53FDAEE93549BC4FC27FE052C1F8B4F077E657D77B46023C68F6D8029C4015F310B7656FB8064A61641F1914D3FDED6AB188276F8018C26EBC20D6DBFF742C027F43232252A53E389EAC3C3676E0C2644F240C20FCCF164E32E2258D5367FCDA82C0DB03ED49C8961486E42E28A742FBA993F9A9B84405BCA8DA3636A552E3F0EEB454D69CE9432BF6280B506A1373AC0F56F5FE127EF797CEA9036D6152BE399A63F39F7F15A4701A38443F47F58F430E86EADEB2283E68539C0902B2DF6F3352E084DE50EBD0DC33C491B166DF2C3C47148D99BDD5E109EA5002BD3164E55E12EB11B9F0151EA1FC047D73D01057FF92814860BD990E54422FB686806A57CFF8549C70D452C8C5C408784BE9053836F625AAAF9F9E83FCD13157F184E0C26F54CE60CA3DD285CF7120EE6EA5A271CDB8CFFA7EA8AB21A8528E9990B33D41E7A9F399C71D389E4E7019473F1E639FCF091B631880892FD7D49536523D75F91B9F843A6FE6E32642EADC537F1E0F76449A9A5CF8BF3DA9EB2B7BD8F6848EF437CE5ACD153EEC3227A27DC973FD7DC1A7499A13D97D81DBA1EBF53F8DC3357DD5C637AA4880CFB2D01E8DD6B3892533CC35E4DC422EEDD1AAE613BE58702AC343F68351FF2A32902263B91B84877F53601A448960CAE96692EE51EBABD1ABD5F979E323E654AADF53DF0A5009A19E7C1A4515AE88723C2B6A383D31460C0875344679E511A7D17E3E0A3A33BBFCF5DF719B684F29F2DE672024AA56B304180E350609363F374C5A309FB1892066F2487EEBF8FB27F3E1085A7F4467268461541B2662EEA6BC169870BC0D7BFEB3A4A4F6FA13DEBD0ACEEC646768A571A9F2E1212B249AA1EF055D6194F03088D5E2D48FACF55C12A3F9DA575A9D0F22219F5BDBE9A29EC61DA87EF4F612D532C36B8F58936B829218716899B317D585A44173F823AB25A671F779732503DF012B6B681A043EC9E786E8BD781E985DD8BABB16CC3EA26B57B7ADDC79101A2B3E75C8C26BEC643355720A0544A860865F82693A14065F8592B9DED27E98C9F83549370B04F67D38E12CC3EC95E81EB123940E0D6116FFC0DA1A1382E410C6CB70C44ED081FBDE548A0F1654A43DE8232D71B74BB50A0880E2D5DF84039646332076E76A15C634C91AC9923287FC3B62CE92C1C8C10973C85EAC0BFB9A98404FFFA6A0BE6CE8BE50F4C52EB5DEB932ABC4D7076B14422568C49F2366C015CD6E014B73A6C7A703D3D15EBE636B33CB579A78668FB332B533969B666AC2C563410B93FD7CA34362EB4F0D5EB649F8F64AD83233A3B36D9D1244AD62D6B3B557806C6F486421EDCA3CB1B55576EB1D8CCC8593EF5F8FF78E9E91393F56AE14873A6B06272EBEDD976FB16F4AA36BC42E98422F60872327B8E8150BBBFAAF69F8C7F4D72075735A1B9ED32BCA835E38DA3CB75B3D9A1FA5AB68D1E331C3D94FBA832941C5676F038859ABE5EB3C5D170BC2AF861D53B9AC61201C9FC1603A3E6AD74B19FE726BEB2CF72FBD527F6C2B5E2A383FFD87E59352E3D2633C0651CD9541D276C92E34C780918DE67D6697E9695236E8836AA901C41FFE9CAF1FB95F0B77B3D3CEDA8F4FD6027A4F11417B9B44564DF650D3F329415D2DC68DC95AEED6A536FC8DF4E11A925A1E63F64221FFCE7741DA040E7DD14C09C1F793F2DAAF54DB9CDEEBFC45B98D946FBB2E0D79A33AB4DCE0CE9D4BBC46518433CE0776DAA781D4045A163CCB9E1BE6AEC172A1C79B7205A5062D781A075862037049049C57EA97F5E8EEEEC2358DB7C2F26CEACEAF6EF27F9AC92CBA8A32632F64E04E57BB9BA1B2FE28878E4608AC8DAD1925887C129A2726BB6C214AC0A259631771F3B14436608BD362F73021536E1C8041FEB819E83DD6D443F1898DC64E0C6D40D64D48E09DB74AB9C9D183F4E0DACBDF9248390B857587A8307068C229144FA3B94EF09E56D25C512FC898D07F94547B47A0351AFCC6550771FCB3B21C2D2250D8BBAC810B0CF803BCA51164549EFB51540E8169FFB0F2A9438BBB1BD9149952179A94AAF8708B8297C0ED69864611D32E0F951A043BDAD15A2DE046298B3887F5D1A175F0D9383DA6A9A3AE4D0FEDAF5C4A0811E908E9929DCC8BEE20791902F9BCA76AC146E67FF3D6BCC103663973EFC42A4A88CC29EDE9B889B042485BBF90D081303A8B54A514B0DC2255D62BAE94A2EDBD7B6E54E1850F4B71D4915D379AA62C0F6BEBF2205A34240704211E6D46C84D134A3253DB49E800743503BFA6180ED879CCD62B34CD3D7BA8C37729CEBE2318B2B6DFCCD1B443B387E4F5B52F60000F177F7268677C3576999A5B845F3CFBE557CF30C25895F4CDD59AAAD171BE5163BC122203810080402812AA8AC255CBD7D3D8148847CE03E5D952E8885ED8D498F76A57E1309FBF4721967F47877568966FF62928527D8428DCEE9FFD9F71AA4ABA1EC4DD9D3FCDDF66BA5AF9308554EA8D380C9745ECE4303263CCEA792943F32F1D8A16F963BF8996AF9AD9CF543B2554F27D020190529AEF4675799288C7A7C034D687EE95134AAF2A99F5385339E2D3A1A95DD1D4FFFD9257CF07B8F0129673B8716E86303687F89C8FF1FE7EF1C3234EB0B050E1884BB85D71122D8CE20FFF30A64884723D886FBC199578D2A62D880251FF6250F1768A3FB96C4AE0BF9DB29D1A56FE5C084785754780270B5C4105171FAE59C7839922AA92EBCEA3A4ED55525E6C907A55C10D060A6E11ED86515E175B66FE6DD01CC9FA9C63838B9AAD7CED3E724FAE3C43066E967278744CD443E64984D7A3F0C90DA66A9C7171EAF3EECD2EBB61E84FFCEDC89D97BA336F892C748B49F60678D0948F2AE269CACDD6435FFCDC67B8CBDB93DC1474B71BB9B29B5B3FD22BF7769CED6910BCAB941E4C3EC5A52BCC3A85BD2D995A877F441D5EB82706CBEFF897C7B4637FE9116B29253DC7EBA5B52DDE49E733F0C788D78D0687A85A5AC4DE47FCFD50F2B2FA8A5E2888B99188261F9645EC1C78F00811D96E05009094489108DF39BACB732366510EBF1C5A761F77F264DDF9D328F3BA152697EF421FF782C3D68DCFF66C5B28A4612B861B83DB769940672091D2AE0571554A8671D3EBB165329E10398537802FB506D4F70AEC163EEB960CE12C85E623ED093CD19573F0C262361791FC290DF3D7223B2DDB83CEF1E4B5FD859CC23FE50E24397A8900AC8CEA7BF4DDD7BFBB078BA62A762C86A684F9EC78C962CA56C5CB4B78BCE318892D492ACF4D8E2E8B289767B16DF9DC875099DAB91BE34BEB7FD809F5D4C6044351AC1AB3F39C37F7EAE26C2334CBCDDED3240328E8F948353647C0872C52C5FDE9CFDE6DBC8D90E8405C35AEC355EE490382D370C3F8437B8DDF2B5FF9838BAE0BC5611E3A646A9855246241BBACA05F06E8B29829F7AD66109E8DB91717DA02F42E6B04A776297BCAEEB5176EE676A8C9B695FBE698CA8E96F8077FB2DDCE717533E31120A83DBC1ACBDF996ADBF7FD66379A9F02968B99266053BE16B5796160AF360C822359A221F909DB16ABBA031C080EE264C7D8198BAB0F7102BFC2FB60C19575EBCE991C5B5983AF5AB22CCF8637C0054F092274493E7B28D2151A854BC06792714A1765D91A4D48024CB6DCF48DA9CCA4F880BFA2096DD5533867B2D3AACA814104FA6F2DF3513757BD9F81F56227568F49B5A761953F88AFD31489F21F6062207AEFEA25B90910D73201521829B5E7746CC0E9162922CE00BF091B53DAF891A4F7900B59F8A39A30C4889C389AAA80E09E63A44822C718244A84526650A21ACE8EC81949E4A788FF056071D5F253DF4C3275CC779A4719C1B1006221075A3150BC7B1CE4E9FAB53676F6BE4937086958F5918B8FF13D9DF9040D390C1F6E5EFFF7B7C947201903F2C0FF2A8D4D14B0DF316034C67E2FED8C9126735B9A2AB99A7849ABC165F88E9598DA76EB0CAB5F528362E3B11B7419716583583217AA1AD57D42EA6DAC4544E42366726FA2ECA11BF14A7BD71890BC1A16C6318573B14565E9CEF251CBAACFD3040C4D908E47E46F7FF627EE746B4B2E008CEA8BD5D272159A0C0125F6C0E89F93320C0A8A7A34C225BBC64804B2236B3E37FC8DC0D052166FA7C5A2A6AC4FADDD74491AFA43D9E0A183DFBAF8A983317B5C2E311CB5BE27F9C0B747F44A68F24CD170C95FE104E864E786690347C54B9C4B71871CA5E95F9497813E7AFFDCE2D7984FF2F9FB39B7F20744EB43BCB019C72D52C09819B243B26514CBE9F32D7E43726DFA4D4C67183BB23E34346FC37312AE407F411D21D8DB093039A52D0F5A1A0CE84AD47A75202A34FE919680438A1F77F32B0D0FDBAF59FF065725986B1E2C740B4C94B3004A214C03B550C7BDA8ADE6AA8A1F89F94B40051F0E6E8925C2E75F7164CCF25CDE52C0A8F61C8D3F16FAB7B78351A2365CF1E4D62DDAAD8F9013B00093EFCD92BADCF464374B59F9E8F0E3C2D81A8D1DEC291244DBC3C653EFE1C97A393B2D0BC0F1C8631693621EEEDAC8A1F09FBEF5986E9B01A03BCF2BCDD7E7059382E43945CDD545FEFA3A6BD54DC24BE1693F2F9214685302FABE7DA4723D60F06A09E4C9B95F98DD23BB842F5346A1318A949A176BD0FBCFC9973C25FF5772341809CA392A6B1198788800563E8A6ED9F6D05CF0F605D0902808268B17A1871AB134A456846218738055C07E0DD69156AFF8224EE49A2FD38A9D01AA255DFF08AD0CC689F8E14F3E50FEA315E49C2BFA852FFFEA0399681CE4D4A5539D26117F41A9570A090B35B620A582EC84FBB33E07FD66FE82E6E482432083FC76B3C03FCC2888BE0BE16FD94B4AC7655F5B9A4177968DAE349FA401A464FBD7E2795BD973854EB17ED6C929777CCF6E36CC3D9243185970B113AE19921E68E401C80F08ED7429939827D7634BD1A457DF85A1FAC80E5C05D1F898EB09EB522363601588B44C7D5A3146CAF8F6962BDA07E3F774EFB60F5F2254B66DB6E004B249DDB0DA20F4BB32AABB88E8D41CE09B1BFFE663351DA566D7DF087FC36A75603874E87A5E7E3FC0710496E17635E909C029A69813327333221CBCD98DF72440277AA7351346379A137471F02011F5FD67576DF316AEE9C43AD7BCD4C0D79AFE1291DED9F9FFFC9CF94A4BD567176827D4F8FF1052701117B4D6C32752A91F0E6C3475B52290F324D5B7187F3AA8A926AFE1C48A7FDF7C6185AE9E649FB2F75D97AF41FABEE7945FFC7F55E79B66CF3811F354878D3FB9F2723988BAB448EE901B57CF2DA3D00E939F4E848F15F451615C238DC72D77086A0D0F1F3897C4575255850BBAB50DEC9A2A3FA6757C882267261FA47F5EC7965BA004B8A0D9A924DE498CF3F8B24F47E5B62C8DABBF97EA7D60F06A8D7AC46836E879EFCBCCF78DC05F14058A94B9BF0D441926293E603C4F661AF006EF09252911ABF176EF4B3BC18DB89FE0F424A8C3035B497E1FCE9C65E1895DDB382863E69EF21E268670BCF43EA8BAA0A57F677E78C7E61B71352B9ED1E2522FC37359E6FE2F6150CE87FB7C58254AE9D58C14D4BFC4A0C8EBD107FBDC3DFDE3DB541AA0FB6DBEED301441EF7CDC5CB0DCF4DB20286EC087683C374E2E183BA8FB84551E8E2A1A406999D1022101C08040281FA3C5D037F8BE845BAB9989BE69D9D0EA24475676537F273351C7D8FA0E7171F018866DFE7417B6EF5779282A3C44031BD2D5B56AA821B67C291A4CBAE19125AE30F9D6A002FE7415403B59DAA1C254FBBB95FD2E7AC76EA845B781C6331DD7FE063564C18C9BAF40C40FC7263C43B4ACA95EDFD1B946D2524F6190DE9FB9FB0B1FFCC3D7FBBA798B32309C6690A714008ABEF025FD3CD5D6B2FE5EEA0C82A43F2B6717755F24D6C2FFDFAA9F5B03D0EA0FF931051D8A844AB90FE03813D827AD0831C6CD69BBEC6694ABB0FA9593C6FFB5452321D1847F39072F9906BE1DA5AB7172C3FE807D393D40BA296CC27F490F765AF5B89E133433CA08CF46364E7AEEFF02620744E69F56B79374511BAB0ADAFF26F849CDFB3C98E2A80C3D4FB2CA37F142129DB0859DA9E51D5C17281C526F21086DB2167807DB8FF4027FC26080E0402814020283FF411CA1D834D83148BC888018A0587358B6513860BACEF1D86E8DCC3D2C99E2A1E16A4FC2D33997F6620E5130BAE91B77763EDC294A3289DE356A81377A3D0DD760FE9134600AB55CC8E87DD45D586D8B5BC6C0D09AA0B118F054254B80BAA54228ED3D7BE84DC5BE0630A185DF255885E036F27A4D502B799A5DB23F5E71BDE6877D48F0F0C3A1C6322BE187D74F211D5B3C1FFF1DAF0915C8B18FE37276D0AE2AF4799F3C1BCD45907CF7BB08253A0E44AA4169AE8218D558ED33DC0F8CDD00FBAA5D9D0CE2810AECDE5B997B66CDEBBE2887E6387115BBFF37EC345E5AD5A2628FCF822F96F24FBDB45539CC61BCB45559C66F353D296202ACBEA6CF9EC8B3562E208526DB3679E551F8D1917DE8F575D07B6C855FDCFC46CB8BC086A3F02692B95E66BE62C8D9942EE84CBFB6F3F5DF31B9F5D5090C122BE4A88DFE2FB0E626AEEF8FDC78FC4D97034BFD9C1FFF33677472BA74DDCBB4001E8289EBE4C508FB24F34DD6CA7E8A283CA66C69D0B070E0D8A79C1138EA917F99D108ADDB91AEAEBA010AA39AB64FD985ED5E7A9689BE6ADB9BEF1476046A4D5E420BCE9FEFFD93F562BD898531D5B0EC030223877DA8F9DC7A3D5AEA4139EBDC81A08671B1E9979DD22B8D6F76F8F5CDF4DA297CA8013CC04C2005DB224446313FA07D8C590E386341FD0624C8342EE79B8F4F2D3449FC54A9A356908F7B08D302BFF810A11BBF17CC0FE667F608CBB16DBDA63E1AABFD7BA8ADBFD4804459340789D3C8376C841738AC02B3E50BD90CF84C5D794D1C81FD6DCA93B2B062D6771AA82C56742BBABB98D7C5B69F1B029D6F1D8AC74C53F6D203E978FE5FD8CD779A10AFDB88C95994C36A3B5941A611007950BE42107E16A1A8D7409223D881A8B1B567AAE3A868B9F5F652286D18B42836C0C0B474018EC787DE2AA88EB9C281463D4CB7EEDAD1911278269E0693121936891F0FEC9F580175D774CE83FC0763935BC970881E75E6054DC3F71E9DD208D4C5B7E53DA7E1DA55FF52E5F20A9828206F40E3759FCFF8ED985AD8120BDEB5E859394C9A61E2D891652598CFE3024FDDF343FA7A4FAD95082889B6E7F2D276065B5519C9C639515B0508104233C9D9A08D0270CE737DC8C2758DA04519FE6F0F0778274D4285DAA3BA10F20381008040251E4E1698F03BFB1765A9DD0876F5E093EB68361DFA4EB1E31CF40A5D2F2ADFF92EA5FACEA3DF0F0F1DABE0D91286048DD10DA75AD7960B73A777446FF7543BDBDD8B6E5147AF18B4C01FB19902D0D95E7371DE7BB294F5694BBE59F9406131FA45D4291AF172C99C8572A012FF43C16F7022CAC9B9437BB5717CDD0B368867526299BFEE11FEFB3DF39AD06419FBD9E190F6A9F7D8ECA5C20133427D6FD30A084C0931017D25C6828A8BBAF7348EB8097E5C5658F8478BB84913325455B3206500D1FF6FF2EE2A411B6D0B5DD50AB56A1B6519EDA88C367CD4E839DD0FCAC8DFFC670424CEE118E578A0C7F5B6C0990EB1C5F42E4DA2CF11CA30D4D5742FCEB42CE5A766C827541A821A689E03D9FD1795846B8DB1F64734C078DAB5DCCB66EA8897C6D31FF1EAC415F725DE4792780C36CD6C309FE90BD21DBCC92A5F9E2C0D6FF560BDE82B954F67CF30A3896F38B716ADD3645FCCB658980530251BC6B8DEE066D5E88B5490959D773C835C2ACA0761EEB019B3758D7065E7523656D3F106D2275DA9F65C68100C13594CB9FCA0C27C18C0EFC783F6298C64F242F6E3959C33D92FD5EFF08C077428F40702010080402D5D5693AC14314334C113EF0667830F6FA799CED60300AEAB2F6112633ED2F3508045AF618E2FAA293A414ECFD1550133E518CA02C4295F1EF6C907C0DB13E9A9BF83E7C6A8DD3F8A4986257F9FF05D41EC79F5FECC20CE200D7985D489A40CD7F281471A0D142FC672CEAA8CBEA633E75E95EE8E2E82C0E2AE0990B03B7D293B01FFC06E7590E0704FD4B892185EE6F52DBE3D416C0CEDD7D039DB7B2781A4610626494919FB1D4F7FF3D02F8AB3FB48A7EB0486FD97E741EBB3193FBBEA1FC3EDB5455BF3F1E260E107E27FC6E4FFAD37CCCF8E2820D9F79525F5E81C7E14172C75F9E21BCD7556BB3A974A11B547BB238D8E5D957B08110D2F302EE95C0395C1BC27214F27A27F1F2CB316619B379FC17E608FFB67E8BA9D0DF016A830F66EB5989C9645073149C630104FF88ABF875150B4E995332249D550A88B6E7C245E5E027E3414D1CC2A9F1A982F64125CFC123AB8DDA673F7272BF11071AFB6D0FC26048E9EB4820C67CDB1519095AC111FB9FBEC8BEABEB08BAEF7D29AAE04C30DAC058D6C3DB37AE490CA150949B81598B3D5BE21300C939D1C573F3B67059A4EA11C7B18763F3CB2FC354F62269FE4FAD1C26328F9850968D3D8F981F0EF9F097890511A3CE834A3D0F038D938589523C828442674C72EC7D5844F57A1BB25D144EF7205E58D284398FDA909BF918897DFA466C0D1D577B16D33FC0F3B9CF84542BB7F2E1C02337F0F540FD7958374230E2BC57666490BBA86BC1AC13DEC115953B40AB471F1F14164AB0C8F107A540929ED6E73F9E8A4FFF45ACDE12F166E6BB065CA8B023080358AB221F8309F6185C852FFEC7CADDB656C13927587848E3986AA0E7C52FB1710156E125B6A04F882C720ECCEBE4ACDF29A3C9827FC0ED558E556015C10F746B28BB4772602A397B3C927335F9AF99EC5EF42149A36EFF7B0DAE1E17647212C170DB43E9B28F381783B3284AD0CDB7F435B3BA549715E1BAF88DAB714AA1389E45047C4A3D335E4D5AF8923931E6EF49A7E9F23992C52F6FB1867FBDCCEB65EBA0DFD2F7DC2B38572C43D3A7AA3B013244EA0E74071C06EFB063176A4F51525A526C2785F02C06D95171D2E25606B58C4BF2AE2BED8752469273F943A656F9EF8CEAA03ECD9683AD38D6DF13E2D676AB03A1D9F5388DBA9B30E381CFC1BBC1D3801A1D9A34D5B9BC3ECDA2A8FBAB46F275ECC97A53CCC9FBB656EFDCC1375CCB1FADAE2DA1D3FE12B04C35406DB50169D0391FDCB111AE49E370962556627AC7AA796091F559C523A48193BE13E16C653B2AC417FA08F18C86538BDAFE66ADB6733B411FB37969FC3A22A9F56A9AB5E0DF756900B2BE143145B410B438385827BBF253D124FDE052E760F9EC866785112D25B9E56FE5CCE077DF70EBB6C850DF77F8614DA52EA8430E60151252F8E765E63C878A532260E6CA0D68787358042C9BC2CD0F649275C19F0E243D4CD525AE2689D5A3E18D0FC832440D7F3C6AE963997DA9883075573CC7A769B1AEE43151254372692305A8E1A56FFB1C3EDFB9BDEFDA5BF4D7C7EA9BBD680411532AA0920EA54E3F54CD40D3EE814270FB554527519B5293BADB343376ED716047D1A29D0BA2EABBA873713DF19F4598E204D0A47FAB4A9D6BF1BA6FA5B75404B29751F4C300343D43E26D55FC8ACE45961425C57F651B06445A0CB9670EBB9B2306455B5D330057C06BBA30148EF47F5D12E8C3A9FCB3EA5120B5538BD64F7727D189CA8F78D71815AC037D046B44ABB0C7673E62D31458B653B38211EFB34F25C6D44DDCCEFE686FBCFD8B3CAC631FBA6F1223877E339AB083066A9EF5319C0439742BD1FFE78DBE1DEBBA3246CC12CE91B13A63C225E0023A710FE5C2791CE3D283D852672B941E8CF5953E834CCE657F2C87EA473EA306C28180CA03024D79777ED7A7E1B6D7E1A8FEA7ADF17489F64580681BD15AEE79459BAF2933BD7871D05FD23BC088267105C59E7B0D197130F610647DE2FA13B32DB804EFD42989266221605D5328EE755DA35287ADDB3C1880C975F7DB8FF35C6170A3AC7BB1DAB00F2AF8E176E290ECC5F2EB5F30F9E54E9178EE71CB8FA69E950A34EC9074467CB6AF77F10742B6381820272E40E5FA15677E79650D1B3D2A44D9439A44BDAFEA1896A2519BEE30354FFDC5C853A6517A2441210FF131CC7838833F699EA091E2996E25A367FA4AF58C6DA14B2141109187FBC140C2A32638C96382A304CDA450837C5DD212FABD5B0EF999670DC25C7C83C6DD03D0859D04B7042D5667387569B1E626A6A9F5E7FFF3C98C7CDD0C38B7FBCAE08E6F290598647D80E08F1EDD2F0C8B432D17F53B6BFE134B47A97E023FFC9846C7DF505CA2EDD731585E1A08EBA8044120D0116F730862C67869752C106E6E51A942EC5814F07B30892C9381CA983D36576F822274A810DFAD4DCE184301A9EDD94E1884B34489B7FDFA1395485215E9763F0CB028FD808FBEBF15C09FFFCFD07E7DA4C4E4D76C8094476E1A8FD53FFFAF715883809C2C9ED8270C1B3F232E5F5756E1BBABAE87C402F1DCD09D4AAEC2B6ED9435D7683870273C0EE8B83DEF41F4680F40DBDDAD7C5C9E0AEF560A748A851F2F6F14B3A4A9FBBE4E07EB2F59F4AB363CA34428335740A6F26B191262AD79CF7AFB9A651E8132C77D69B50A57D80ABD1B4050AD50D2C5A5A7FAB0C88E783A47F41B11CBABB54992182EFC294DF936AA450ECABBEB3321A3EA47FA7CD3E1362B81A8842BFE92434AC2B135E37E80A1E7D5F43206F7C9129E7367DA9C9C5E75D584D543EE521E074FC65411CEC92F3965758832F6E6450CD4D021D033646B14FD60E03FA5CB1DAA774CAB7ED3864B47960D7AC023293399DE35CB86ABEB6659D7E93F80016675E079259FB566C4BBE47F9117B6F8BB54B1FBB57F99BE4D24864643671EBE90873346A4F1960CA1DD25ACB6B463E4BF7EE751227FD72758E3ADBB5FBD3FB272BC124D15BC63E5C86158B05D4F5AFD7089621E989C21D6DFE2E1DC810CA12A91FCBED60069BB956327A4A3DC13D9D7DFD7A9BB35853F68706AC1D9F8078398BD6D1D1992B408F97F4916686F454122D52B650B745FC55078F0670FB95873078EB32B023CE268004452E719D3FE116D7BAC466555ADF8A8B99A03ABA292728A48BFBC43CB1FDC1D9D70691BB50B0C803EF8C6C0D53B5C6EE5510584A1447D012A561CD97AFCE4FD7375BE33396926C2B55EA44EA52F5407D15237638B0AF9DD1DFD1EA07778D71D74FEF4C611AEE0B45AF37764B3FF9A6FE93A17402EE9244B0AD12E88D50E09FFDFE3BB978459BB9DEBBFEC2E3EE3118A5FF5772D43D5316F50F1DDA3A9407E217ED819B1CFBA74C72C1128E9BAB4134796F101AF1AF1152CCB765C8C4833FBA15CE557C105A03F8F3455C87E137CF1F20FB3757892F467EA95798B65E7A2000B9D4693209B08908F48E234880153A2D652DD8D631876828806ACED74DA1C2BE20AC9AA0108BD188C01068CEF18BB22253A68E0A6E9AE5CD6F2A9DF76FAD225BD425C59776C7EDC18F167028C72730DB1300021FA4AF89E0A4916F7423BBD6864715E5893A6D5C5B568D00ECA4D7A1C00BFD3210C4A81F0FB9B98B683623CBC25590B85EDD837F0493671C08D3280854568C4D104972535D5C112F36A249EFF96BFD89F8FDD45FBB0703E76C4D1307371BC3A10C756D4A4FD0E083B2E5FFD30C07286CE817AE93CFC883557D684B6B68DED194329CD9DC30E64BFF9886473BA01D0A46BD20965F2CE24FCAE3D9895B9B829B5D56822DFF52D62B9C3787DA65A62EF84BF07C1814020101490AD33A09055A5075F8C1EEC4E964D48F29F31EDFFEECDFCA7BB4314CEBF272FB150CEAD2D4F12225B31FC7C2D452F4FD949685DC44806C125FD4E3C56858076D98ED31BEDCF057D4083978BEAEB47C1B3483A333BD81F5BECE2C709576DE32314F2F9776F51BCD08DAC977AA37FB5639C2E71B094190360AFCA83E5EA1688AF4E49CDFED7DC5133DE3BFD99399534AA7C94E9A1982E1A0475FC9D20245E30E2C4E01F96D8670D0F26ACC6B3F4DEDC1025FB5945BB7DCF7B350AB20C5E9EED0A13A00DEC4B69F7E1C30F6470FDFF9A2E94F501F726052B314D631AA1B393B4C3977B323A921F9C7BB3ACE71BE598EA266E2559A06C8FA2DD696C72C46C2CFF98BA6AC1EDB949D4DB4022D1475CED593F5C94D7AF928405BFB130EAD1F0475452A9F373B6CECA1D8F31A235E33B459CD17CB13C06C059C2A7A3A917DB0D807A96247BD12B51C605CFFDBC6845A4D95E227FF756EAFA4CFD3C309CD629D202A382B3A08FE0B46824A94221EAE71CA5159128CF447173C841EA15FA0D0AC675DE5339D316083BC54900173C75D65F5A60F4C36196163B7CEF4EF4A23AE0524F773DF5BFFAE87227A6D124BD10CEF35BF8C2AD1B59C47EF99FF0D8B2178C94D75FC4791DA8BE6AADADE7B32F50E88C44E0E29A70C69CF9AD749BA0D000D81D280BBCBE4AEDA46F8344ABF937D5636005E794F899EF77BF41C46724E2904BFA8B3E22CDD22937C07CC3EFCC2124A0EEADB32DDF3FABFE9E5CA52B66903233FD0D93ED4B3C1EF44E27B14D849D8826298DC3E1C71DAC33691589806EC44F87BC7E631BCC54BFA3B12AC40302A2FCB976F4B15577A8F676740BB684ADDA36D7BBCE7C25BC8C44A8A83A1B3580782982D83169446B481D87FD7E36823B51041B0871426A2EEF8BC07FEE4FB4DCBBBCE5C647B2F275238337C280872AADE8A96C687CBD8D23E6528FBA891834C230E9396021AABFBBD9B83C5A08B04D1EAC4F2E060D1A9012DC5D7CD9E1FF02166D5DFDCC55AD7E334746C49A967AA251E08455A2B41316A4E571E9AFF688BD6B309738C0045EAF1F3F9273FDF6EC9F2546E7141B7D7EBE4EF0A1EA602FDAAE991A92141820F1469593A43CDE8D439B6332E42C2C8EC5ECC4A7E123DA96FC802B9EC0AB47DE095E07DDF0A06534BCE6D4939F682D0E631EDAD964C50DB203C3CB05C3C5E9D22B4D5F573D75D5D4ADA0974A44AF1997D2806A838181232976C4571790F231086CE9350659EA0A0302BF926040FAC1C0CEE6CF643E349B756BEF3105CC4B99961737BD7D313756649315AB7FF80AC6F08023AAB6F2D2D84E2ED99F487B3894AD2AEE5AFD03AB59454E1EBDD5130122D23F, afterDelayedMessagesRead=763065, gasRefunder=0xe64a54E2533Fd126C2E452c5fAb544d80E2E4eb5, prevMessageCount=57905941, newMessageCount=57906204 )
    • TransparentUpgradeableProxy.STATICCALL( )
      • Bridge.DELEGATECALL( )
      • TransparentUpgradeableProxy.86598a56( )
        • Bridge.enqueueSequencerMessage( dataHash=EF7817B8F6F1B288FC8C0969A398563763715B93177F259AE5FED661643D5A33, afterDelayedMessagesRead=763065, prevMessageCount=57905941, newMessageCount=57906204 ) => ( seqMessageIndex=147361, beforeAcc=9294258F2511988D6D3FC040B3D9CDEC3E633B396661BE3F0CF7DEDAAA9490D9, delayedAcc=16B8E7AB6467783395D4E71421215F4B5DEC5C9235C80CBE164BC5D097DB2DFD, acc=DCAF861BAFBAC73E8813EC137BF912DF44CBBD7D233623B60CC0F2CCDB742D61 )
        • TransparentUpgradeableProxy.7a88b107( )
          • Bridge.submitBatchSpendingReport( sender=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, messageDataHash=E1DF7D3A9B97337636E130F86560C6E6D717A60FE08859CE7C4246F352FA9B5C ) => ( 763098 )
          • GasRefunder.onGasSpent( refundee=0xC1b634853Cb333D3aD8663715b08f41A3Aec47cc, gasUsed=208989, calldataSize=99780 ) => ( success=True )
            • ETH 0.205989156985516234 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);
              }