From 818288cd164df1fad4f727dd7369eb41b1dbc5f2 Mon Sep 17 00:00:00 2001 From: "random.zebra" Date: Tue, 29 Jan 2019 10:15:03 +0100 Subject: [PATCH] Add PIVX Testnet (#110) * fix PIVX MainnetMagic byte order * add PIVX Testnet * PIVX: zerocoin address labels --- bchain/coins/blockchain.go | 1 + bchain/coins/pivx/pivxparser.go | 54 ++++++++++++++---------- bchain/coins/pivx/pivxparser_test.go | 4 +- bchain/coins/pivx/pivxrpc.go | 10 ++++- configs/coins/pivx_testnet.json | 63 ++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 25 deletions(-) create mode 100644 configs/coins/pivx_testnet.json diff --git a/bchain/coins/blockchain.go b/bchain/coins/blockchain.go index 26a5347..6fd0958 100644 --- a/bchain/coins/blockchain.go +++ b/bchain/coins/blockchain.go @@ -69,6 +69,7 @@ func init() { BlockChainFactories["Groestlcoin"] = grs.NewGroestlcoinRPC BlockChainFactories["Groestlcoin Testnet"] = grs.NewGroestlcoinRPC BlockChainFactories["PIVX"] = pivx.NewPivXRPC + BlockChainFactories["PIVX Testnet"] = pivx.NewPivXRPC BlockChainFactories["Zcoin"] = xzc.NewZcoinRPC BlockChainFactories["Fujicoin"] = fujicoin.NewFujicoinRPC } diff --git a/bchain/coins/pivx/pivxparser.go b/bchain/coins/pivx/pivxparser.go index 1ac00be..fe72ad1 100644 --- a/bchain/coins/pivx/pivxparser.go +++ b/bchain/coins/pivx/pivxparser.go @@ -20,19 +20,34 @@ import ( ) const ( - MainnetMagic wire.BitcoinNet = 0x90c4fde9 + // Net Magics + MainnetMagic wire.BitcoinNet = 0xe9fdc490 + TestnetMagic wire.BitcoinNet = 0xba657645 + + // Zerocoin op codes + OP_ZEROCOINMINT = 0xc1 + OP_ZEROCOINSPEND = 0xc2 ) var ( MainNetParams chaincfg.Params + TestNetParams chaincfg.Params ) func init() { + // PIVX mainnet Address encoding magics MainNetParams = chaincfg.MainNetParams MainNetParams.Net = MainnetMagic - MainNetParams.PubKeyHashAddrID = []byte{30} + MainNetParams.PubKeyHashAddrID = []byte{30} // starting with 'D' MainNetParams.ScriptHashAddrID = []byte{13} MainNetParams.PrivateKeyID = []byte{212} + + // PIVX testnet Address encoding magics + TestNetParams = chaincfg.TestNet3Params + TestNetParams.Net = TestnetMagic + TestNetParams.PubKeyHashAddrID = []byte{139} // starting with 'x' or 'y' + TestNetParams.ScriptHashAddrID = []byte{19} + TestNetParams.PrivateKeyID = []byte{239} } // PivXParser handle @@ -57,11 +72,19 @@ func NewPivXParser(params *chaincfg.Params, c *btc.Configuration) *PivXParser { func GetChainParams(chain string) *chaincfg.Params { if !chaincfg.IsRegistered(&MainNetParams) { err := chaincfg.Register(&MainNetParams) + if err == nil { + err = chaincfg.Register(&TestNetParams) + } if err != nil { panic(err) } } - return &MainNetParams + switch chain { + case "test": + return &TestNetParams + default: + return &MainNetParams + } } // ParseBlock parses raw block to our Block struct @@ -209,10 +232,11 @@ func (p *PivXParser) ParseTxFromJson(msg json.RawMessage) (*bchain.Tx, error) { // outputScriptToAddresses converts ScriptPubKey to bitcoin addresses func (p *PivXParser) outputScriptToAddresses(script []byte) ([]string, bool, error) { - if isZeroCoinSpendScript(script) || isZeroCoinMintScript(script) { - hexScript := hex.EncodeToString(script) - anonAddr := "Anonymous " + hexScript - return []string{anonAddr}, false, nil + if isZeroCoinSpendScript(script) { + return []string{"Zerocoin Spend"}, false, nil + } + if isZeroCoinMintScript(script) { + return []string{"Zerocoin Mint"}, false, nil } rv, s, _ := p.BitcoinOutputScriptToAddressesFunc(script) @@ -235,22 +259,10 @@ func (p *PivXParser) GetAddrDescForUnknownInput(tx *bchain.Tx, input int) bchain // Checks if script is OP_ZEROCOINMINT func isZeroCoinMintScript(signatureScript []byte) bool { - OP_ZEROCOINMINT := byte(0xc1) - - if len(signatureScript) > 1 && signatureScript[0] == OP_ZEROCOINMINT { - return true - } - - return false + return len(signatureScript) > 1 && signatureScript[0] == OP_ZEROCOINMINT } // Checks if script is OP_ZEROCOINSPEND func isZeroCoinSpendScript(signatureScript []byte) bool { - OP_ZEROCOINSPEND := byte(0xc2) - - if len(signatureScript) >= 100 && signatureScript[0] == OP_ZEROCOINSPEND { - return true - } - - return false + return len(signatureScript) >= 100 && signatureScript[0] == OP_ZEROCOINSPEND } diff --git a/bchain/coins/pivx/pivxparser_test.go b/bchain/coins/pivx/pivxparser_test.go index ac7c767..810b1e6 100644 --- a/bchain/coins/pivx/pivxparser_test.go +++ b/bchain/coins/pivx/pivxparser_test.go @@ -86,14 +86,14 @@ func Test_GetAddressesFromAddrDesc(t *testing.T) { { name: "zerocoinspend", args: args{script: "c202384fe80300002228f5c8dcb44644b8073a6c25b8ae1edcfde3089ea0b6f654293dc833f10f12a9717e5346a5475a75c080ccc11b099aee5227ccdfb29d32a83e4d9e8edc90132f48dac02f18a1baea6bd2abceb3324b24f25b9b6be5508b25458fb94af8a200876e267fb6496f48cadf0a8122d762717c3e1f6619cf7408d2bbbbcd6da4c3176d378e30c436d7870ad5956e8bcdde63f5334e5b3b56bfafd823ef9dc0dfd5b0710108b0a5168bd1129e95045952c5a714eb9e1342ced93ff89430d3c9243d4fd0564c98d86392b218019ebbcc9042c659eb49007ee6be4a62ca56e70ee0fa8f9eec0d6bf985a52ca0aa6da17521761dd71569d5274316adf3964ea6b1a98efa3707e92b41567edf919beac7cbf300fd0002804b5cf2c39464a465cdb3cf373ceaf5500cc06125173fd874fd9d922ea89c2d7007f44610c80ec66966af89932118e0f5bc5eea4e674cafdf88ce10a928f1e2c9ad318b2a5b0151bd78017862b2fda2d1e21f61c675649d8b0078498cb9809426a1660e0787d6adae6e360045bd865ab15cf49911631f34481695d3d1d4ab79bc5c77eddad60b331a3f5d60226e9d426f0929d1d0d54d0bc985869d3edaf3eec9ed942a79c6e09cf27482f8034633d06430f9f822c5c4139338af5ee5247fbf88872446cb633af06b71f3b601c8c64a1796b690148b4caa78a90602895f98c2e3bc8dffdc338d24c9623260a60a28b758d5a3965b3c7a22c3ba8607a2bd6db3be6602cfaaec57ad0e59792956dd77cdbf782ac9cd57234587154487a6859b6dd51f319a1427eabfed483abde08805d9065b4f05d7ef430d7ba95cd036ebb1452267cab662fe25ee4319b0ab106cbe3602291b918e11e0da9f7d8765a63696e4360012d5e1cf26bd99466677c8e5003a433e43031162f0b6ac13c3d127e9966019f19968a67aa555ef0488cb7eac214f1794b9cfbc2d956d0dc5833bd3d3a5b727eb9376a4b39f2bb87c31acb5574797ff0ee6ca843f95303b0118142ebeb6a3c46a0e3a00d92fb0bf4d99b78c1f2536564e28967bc4094d8221790e42a47b5bac6b5dfebc71c6e3afe459d7ec3174251e4465e9b2e1427159edfa2e9ab9771ffd0002eed970d3b11056d8a3a27326b401f3a5c4dee991a3995346bdf0ebc9cba82fd890c86953f6b3045c6602e5554eeac02ba3b8333627aa5e1a7041dcee385d45b193e5980d5ce006e8399ac7a95f02e840c2606c1fe3e32b80126a3ffac49d4fcba6780a07694c206780551f5c8add1510b952cb5c5d93c81b508cb58b9ccf96df1e340ace3efee1e9374a10d6b1712e6acd3bf9b5885eda1abcf59a4e08877189587961788bc88c1f1ef9e4038ac60343a5fe5d940624754e83a3b29cf78bcdab71cfaa45e20865561337625d1d290cf251648575c108f797c3a83f1e61d4fcc250b688b00be36ea209f85fdcf816b9e280b39b7df141dd8af6b7f828836f4709a8fbaf481dae117e491ac87bbbb88f247506c58f6c41c49d571f535644a37245e234b5f9ef2d20824cfe603d2433b108792dbf718b9b29823bfa007b3adf6a75a3a94536d356b1deaae5d99693070656dc76be36310e55916f80179166660e6b8bc6291e465d83cd5da0c7d075ac197c92dc4eaaed74d10c2b0c33ad232917e04dacc8ff8849d970bef91048d63dbb44786bf22e1e2ac5895f0da9b3a16edcb0e67adcb27b43baac08f719f9f3e2efc22f46cf20eeabef0c8335a56556b38b18b5753c60edfe1180bab243ce61fa3063f598177928b5b880f1da5e503a50d04ca2fe4673edc39d8cc7a624e5589224f0dea47c7a71d3733d44a4a6185f33ce0bfd00022035c0e9e488a791c1d999703d54be5d1edde23c06660fe1b521dc8300ab7c3d8b7ebf9d75c4f677524315980dd423279e2a2f12b9fd4a8e45edc9a984b4f99397782729f9b36a9ed8785df4b75d3456fbf127c5ba7eb604a87d81b4a9a2148b5520b01af46627b385a8f2f2da53560186c66a86198b0a9c1a3c79b83526b7024de93616122db278d7d9982d05d215244ee5ee33fc6309ba153e043960653b3ef7cc0d470835d064eb106bcce984746d9d5f9b5ca89867f6ac333d16eecdb49136582318aab19b34196fe3d687fabce7815fdf7acaf4b27a9d493b06d3bb0f1ca6ed677ee014185fc299c42bb879be37337f39768d5323556a57c3c05ab111ae08a7b5dbfd1830b2ab2d2462527d864d3a6dd1034fabfd6c0cef20121dd521c53fa4e2ba33862324fee8b116ea83a7aaa2fd68f3d7d955ef1cd111473dcfafb535f6d26bdbe53fb62c401e3cae8c90cc50138435afba3083919e41096cc2f870220f03d8c1bcfbc463aa2069e633b334bc89b8f0e98fb18bb5a71c45534428ed25fe2647c229347c5a213c8c78e7db44b80465b929f0eaabbb328579bf5fa433e993810f761b2a26dcc7af781d73939787d346231c342e61eb45329064b8667a1c314cde899575c9a6a88920e3054744feecbf08ac651657f0ac9022d28946062a80ecd69d9503e59307be14316de92a519835157800c2a3c844abe7864be701466dda4c2d96ca711ccc4622fa541edca55cc3de28f476d5d2c10c89f1849e7ed3c836b9daedee0bba6d3d991f03f3815ac16787b736192bcc8ba2e9ae57846c0e2a1f09ea1807460866d88f74c2b1db9a9aaa007c76ae19b01f733e7ef96f0c6e11250c61ee0b4edbf2e3b22f3182775725fe18769a0dc240a531cf78b8de2b8f1499132d5733d6a3bed8fde40246eadc0fc9f746dff33492229deadc6635ced18ef5d37cfc0b35194a7966406856eae562cac3ca9ad76f43835bbc98636c36a89b605cb771b78f95eab172c428c11e554936d609fd010156d24b38e9ede1df44d6dbc1c7c94ba060321e07fcee445adde8a5b0cb493cd1a342c714f5291329005f5b212380e3d2962e47057c7bd002c8757cdd7e5a73206a22b6da4b8d094dc3a752174499deed98dcb0be75f3fc777a4c47c82bbdf0171c84062796f288318438379b26c4a64ec11e953d34fda80d042d5458c8dd9fdb49f367e8deb7fa027df47dfa281bedaf5052be13c7358b83d43b666614211fe22ea48573a480f3e73b9bcad41958d94dc17d5106066d6d2e9bbd035ce53a2ff94ee4709acad5d33a35abfac6081315a9ca9e466374bfe4332b4cc4cd85dff3787809d885aa43aa38a7de5ed74cd9b240451611b3eed9649a19fc840fe5c099bf00fd00011e3c123a51673507bcf4c198d474fb8c085d511c4af370ecb15002b394d4209852b08b72d311b301dd1488131e5e5343bf488e5dfa6848c2a03796a77aa7cf2516942bbb8205c19f7f19ebd6fc9d61729363cdc7548e2d5d3b626a3d83f0886755c0995b19476da34a7b7f162efeb4107780ebcbb244a69eeb62b8c9cc10b04d0551166f1f15079a9ae8f29df771976136fe2685866224d6514780c14226bb56652f821e7153db39c55fa76a45b6bdf99af9f0426290ccf375a1af33d80e98ffd2a5d62c8ec639c25bf4264e62e0401d2b9128b35e2e2eb1bf1cb578f3af6ee3d572acb9fde866cea6bc17d95f7e11150ebe3fcfeea42469c33b3275bd7c602ffd00013bb3f35666fc74df92514b111f50a73273a847381573c11ac963b7ebb949cbc690132a940419af7b40a3fa42a7326540bf4d65c770def96616ef26711f63a7a275d99c7c1e086f5086749539fd1455ba1b21dfa8a8aa3f2350bf3acfd1d177cfbf6d130e04b37e5f54936c800063a3f54b68e58857218e307ebf75177ea8e57ed4ff4f91d1baffe5f8917e0f1c50b43ebdbe7b6624eebb43584ffbbf994e0befbfe6d6d615e6765717aadbd386cc885de5a77e2e41a66afcaa895e67d9d15df23c162e3b9b7f03e598bcf76d9713ade4845f9ad78b21b26d77318a54b981fa06517ef09d3947088de9dfcc416637e07edf466aeb4a3cbfc48c97cb94129d9056fd0001fea89e47922312c9c25ace1474974b1aaafe5266dcb958d6ea28bb62049ec0f67e8187eccf976f478b71ce0020f7b239073eae58adb660d762d4e20b8e77e75db2fcf3ad9bd12dab974fbde61b1cdad592c8553cf0a5e7d790157d423895abef8f9c2f70511e16802ffe02f39dcdd8b22d726d33e2b9a7a6aba5b846fe0827a505215b18dca6180657cc3f8c82923fdc7ed9a3c2b65a51ef40a816597470e0f5cbe026127e9b0571daded399a648efef4ba481d793575c64ded2122ecd1d2e75ad50b4965b27adf86786220d6eead7cd453958eaed01a2d47d66a775ca14c61505f5e41f3f7707a0b563ab987378036869a28101c94fca791ecb8b7df23ca61ca4c9cd49e43afddb43aa4809ff7b9fea42d0f2040b87c1f5b967c20da51bf0f85c6f1f8ebc9bde9e55afb41f85f77d017b4a2a10bb3320e8b33ff28df33d43816555f7d7095802f225de6df290454e68972085b40af312bce41998498719d3f40e746e2293906dcbb73c8e4b56c81c1470577e80c7df58339a30d65f6286719eba17d2ef25214ce6835914ee6d51370f86ff54cc2a737145bdb18d5fd647bdcddfa28fc106fda0016a9d3fe873b6a232c42543f8f491d813f21ed8960d74e847141df16d2e0fdacdd7e2aa9947d923c320e3166a41b508814fb8a616c22a4ad8f1ff605956670eb20fa97f554b82152f0a4ccf2982b13248545e815403c9349faec3f4ebc688a983841597eece75a30081da81744046ca10e4b39b3aab804c220d92e1be90cf5f0de4ef02ddfaa39298f9048304a2a7318ff01d71a8822bbaf7d8e31368073e471e75c3a324d1189a4efc0a9a6d37421edc77d50f77236a96a1032b5cb52fe8a256d714a57b8f4117105041d037fc9480e278ea4d7c480c848d2c8f3140fd51410272772b71b1fb8c2d9c527341d5bb848b189bf1d8c5af29fceeda48765add979b09bf02041ee0be2ca8015b2c045e3658f7dbb149367ab197bcbd753217513275f092bc56ec8f2f9f4e1fb704a413f08dd4b288845fe69ed204eff90872f0f2282d5d24072242f0ffbbff8a9c93ce607b9b2186a2d555134c07ba747ea087238fe605c3de5019d060f1eb55d20b340dadf8f759eac6ab7576ff53f17a7a44e6ee353fa625d37fb3818a3f7ba2afc530c17608ff47af644b8f34d6601a1d8f1682fd2401b2d93d3192f34783085dd953352718f6fdc2628b0bd10f921376ee3e419b7f30e7ba1525d4d5b8624b445359d180681010b60abeadeccc7c43916fdb8f140025b1a3134e6bc5d9abb8360558ae581804a31d3ee0f96f1cb89cec27c17c772d041ef02e6b59a61b53c211b1ee4e9ce516cc052de191833b853ab0cb90e0c6934790ec0e1350fa3e037fc246ce8995ede9c9f0aa468b5a1eda71eeb0a7a9a44dc1671d88719b9512d2b59af8e68105e1a10fdb4b41d28dd1c60f12cef2d5cdfac8ce1727f65f43011a536ff803d386117aac5a2cb21d0af1e26b0208de5e769a46cc26a15b67e53e5f73e78cbed1c6984f7d6f45024f139917c6a2fd4c593f8df69f62729677cefc49d4c086d2d64d4e78b1d3861aa6915e5d80ecedb8be3779ad4ac1901846973b88a34f10db8aded44fde8ffc716bfc0c7ab32adb7c8af7bcf215679621a3edbe2d8939f165ff3125a61440e4255cea25d1725c512e0bd3f235c560c74b016ead88f36c26fd2401920a99652f9d37210c815f8a976839d61d2d8e63e632534be5783d6ffa704bc527415df751821a714f77e1bfee2b0aeef13ae16dfdd0b90c08d528b918ff461e996f1d58e42815690d97ddfa91c4ea249f017413f78770dbf0033bf2f1cc000ca3e31cc5e98e78c4d535c28102d2f0ea65ea8e12e01a307d6734d4517226149d625516a78a083b88190229a2f277ef5b42db74e93535fc07b0338f1c8a87925db3d92ab8a4b08c4c595d75fe2b8a6d73ffc63a605d7336b82f7fd4fe38c583a9d1bd1948b682ae39a86c8330cdde60d21e45c737a9b84f5af35ba291b8a0e2b19ca73c03580ebfd2b0bc81989dc6b316c101a19f401463e49c9635815336dbd3f77b5eb57e9c2795dac191813954ae5d7fba44940f1b50cf8da82dcaa194cea481a447aafd2401810d68e1f0c708da414cabc0befc4beddcf7d6a98e738088b1eba1e631ea128af363086cb776afb2e0d26be6555cac682e4f56f7db041d4b05afb09b0f39a3d967d7a677ba2521dfa9a7f79f3d9c69342d5264faedd3d65586dfbf13163d13b9a17d64c716e78c58d1ba034ea61d16e60efdc21522cf3b2514a29644974f3313366126999c01f3efb61f574970cc84d5e099a294a2f10a639f457931a02f45e6a0336e827da0871560611e56dffbd2e544adb593ab075e153951f5e131bdd401173ab862cc9c3be5078bb72492c42b63aab49920e40620ecaa6c1852225c8b6825841966143f34f700291fffad12f6cebc6cd22c0dddf08d143c701f6d98080c08f8f71a3183a9b8c71efc95bf2365ba3c6a4e960632252c347f5cd03d98776e54c96cb6fda001e426345b922ee1c9a6a7befb7764cf6da83a9422693f6f48e9d8f028f56394e98fa82c0bb21d3a691a49e1efdf1cf13b04a3ae141204f0e2f6c13f0de8922d20122f92ad7c9f2d59a8b19dc0fa86cac0680b44a37476e6bcf8876772f9da916f3050c2169210367a6586e55a439472dc6c056307000bba0f32f1535a28cc056a9c2f9e04f9f6fda9201530e55f2ac00959c893738e9a375220d072d1fe31b85ed904990a2c3fe87a032def61b3f9bb97884c6e7d1c45071ba72f6bd38f987965a3fb6b9cd168864e6d02d56bc08a459ff784aa3a73ba6b787558041bff57eea7e834ba069781e964be2973f20669c52543b142dc87b9e05a6107ac2594db04a80dc4f79fca21f91caa1a278fe39bdb9a7230380d96a92e6ed3cbd09b27f65be82bb5006020edf676db53b4086a249a44072c17f11a7e61b1ec6840943192753c5d3e66e7332a787e3d507660e536dce29d4f32586686e682145eecb3a991225e95e28f9c83879b42e38d4be043cf713484d2b3c7ec9bdf4675621a910b08d7de7efbc51de9c90d67cb5cb4be0732b5c7f1a7a59ab1e246afded4033eb0e6a580614ebf9176247d7199821e51e53d64b5643ce30c0e6c530b5c84bd79680bbb49969efa9e47aae229e13b3110f7685f875e858fe06be50a338df26f0925839fe4e773c246477cc0003dd8685d179fe276230690c35042f80e3dd08450be1f244524372036709b9c956f5a4309753828390bf270c2f59b26bd0bccb61c3f26d9ac9c40444606f9402217a020ee26a48fdd3dcad68729f8b379cc78c3ca5819282e12d690f995ffade91eb9ec3edc41d47574c9f614b8c8047081803df761d880ffd7325b73bd4526880c43613831dc5d3002e8f5b5ad51b667bbf6dfbff34a49e9d62ff198d5f5deea4345f813f408ce19ce07f68654cf8f19932e10064bec9017d6a2cf5ba0d139293d4ba9b71b74d63b6a6763feaecebb4fd65a8e7da10f98137942ed9ebb4963f3907f055950204d50e0fd7363e9814721cd53f3896feca24f5d544ac857e51610a627fb3993c9200d5390612b315d88b24a0eda3acab52028e2f224bd8aeae0f9b985c15da13c5220e0fcb3e8f296090250ffce1a35775a208b305187ca439495a3f21cc38b2c1871203974b08ac4a3be4980739bd9328a67ba15b5b7f216cae3f7e400d498c10d58f52092f5fa30da2bb1f5f192273d966427965437a28529440447bd96a49340c5bcd620bd103e4fe6084eb129c3ebb0c1afe65c099b47c43470d3011bf3e01b6bf6f6c620ca9ea458c131ec536f2f2cbbedaa4787045494e1a283ad4d279ab3eecbee73b020458cd770741aa7cd2c4583a2b484d835700af59ed1401a4bb783cae17a15d43420b9ebee9d6384d21acdbb3fbcefdcb24d1a1ba3c40221597654285d20b72c5c5f206cc3a66f93a0682e95c735ac08cf45a253f306a0d2ea5c35f922ffdcdd3724bc20258f23a294f005df3dc354cc1d3ea7c04b04b0d327f73748982176e45dbb1478209046f36c74dcc4cb7f59ca9b31071d29d790075626b1f2958a82adfcbf7e264b20ce4d42f09479c938378d0987668a704072144f5f8d10d6add28f27c4990305c720e9d84ac067b6c55edb53c9505abab579c11ec4d7125da7c05067cc0b8d7b1d3b2008eebacdb86009be95bd835aa34c7766183906a0c9494a5035b6c5ffc1cd3f3720a8527a09ec0232482d5d54e920c8e5cb270a99b3556d9c2bed9aeb9e7ef77a7820996ce009bd3e61496e7d977fb1fa7f770547415a19af106002ed6e73263a73d22065d7a01777b3f7475d4c197c87e4c54defdf4d9b19bfeee666bb706717d2af9e202486a3adf85ae19cc84e95d7523e056c48d17dc1c7cd52eadca5b16754cf6624205513c1bcf79af11aecb582f959350752dc30b34b6e4aa43fdc975db9474678262007940cd34b485d77b36094f4724a4640b55245edd609dfde35ab05c0ceede02920490d837e6c3ab275a63a2fa1b688985bb5dccfbd8058236d4f7e543d45b898792080304a1ebf6ab0b772a56183468b1ca1800d12af1384822711d626da86771d69202a4e6750bce678bd2d5d32acbb4115d2d62400b478246313559d24e811e068b220901b9cebd3bdeb1917c82581bdc09394ae5ec6b3cbe604a7c55cd88191018ea5206677217c27cea379fd02a893a53b65fa9707583209d6ce7d92acf71191f06f8c20c5aa1a752e45a20ce6ff9514a93eb8e2a3d1c20a2e6da8ead4e08fdb49a820362031d609cf79dd225908cae397fd528a3a1c790219198831da8c0e52cffe410a7320192a2ebafa0829d5160197b2bb1892e56e0712659f03f7c93fcd066727229f4a20b1e057358eac36e054912938c80d92876bf26709e2beef22004596abfa7e931d20efe65db4d0cb0cd83f87ce3de0046b40391436429c75372ffe43e510b33c5a6b206459a7884a1bc3ed6d6ab7e766f2d4abcdfca01f3e93a46e72b36334358077072008e98ce2698e5cf02509ae8a42ecdfd79fd6177c7f94af10adbb991c656d7e5820dc3729cc6773c069abb0f66470512e477cdb7d1bda133cc5fdc2bf251dc620cc2093035c85397af4a528d3bbb93071f48ecc418e8a6b7255cd755c7a2ce77fcb6e207a910d8ff9b0c94f15a6bd41ed879935fa9e5dd45cb0fcca1fd9d3ba02db489a20cfeaf4f8c94ead77ddd5fb022c1f226ef78daeb18d2098141f3bbba103854c412043bf1ebf028e4dcb2c49e180048933ee69e9937c6be45478d1b59deac75728502057763ff89840016abafae0890402f55ec14d72e0659fafcc8df4229669ccfac7205870fa711c94881cf88f10735e8e1fa62f949383e8c13ced1dddbd0ae940cbe9202732db201cc7d170cbe4fea81e5e3c0eb656dce6dac2af43f62517d78d7266352036f92f3315c6259a0eb9b8cf13b71a9f5e08487832c4eee7f28daea302684f022067451ffec357ed9dc203eadd41cb87883426183378b7dff4e0c86cf7d7d79a92203b7aa0f29a3d4633cde3839cda8467836d7d4ef7b7de19b74641a14af09ed0f1208a6a23ad4aeb120e5bd6a68ee0d84bc411e1a0c770ea76f6a427c55a92cadde42071e96930a3933a5f6657dcd7ce9dc56ff6c4fb00ba2b9802b8f0742b93612f7f2041b4413cd3478ed8aaf837f1f860f023c2ceba1fdee135bc6e472ed71b848d8c20f9365774077030d564aaefd9ae880b984d1c76659df81b11bd62b1c78e91fdaa20b74e8eb3b891d3004f1003b9b764be60c5bc6114ef1954091429ee48cfc71d06200ee9313878d9957d60146a71b04290db8e67ddf53451bede60776d92083ecd3120442a24a57b909d440fd8f18ef2c6f07ef428f12efee70f7806c240c098a63e022033480172831beb16e419688753b804662dba87328cad4f082da5ff616795714220314263c8af922af005215fdd11fad0814c17686d2ce3ca081063a8e1eade6da220b7b075ca67ebf96ffbde4738ecb2fc894347ce9bf8797d4a5f63b86ff6f0496e20edcbc228047fa8a7fce8bb344a0e9be16ed0ce27773678324e13e8aca26b02f020de15b6a5fba896b3cc37e2d8f310e32c8436f1e4391dd8a8510ad2e017f7d3f5208ad7c2dbe66cfa78694a91a4c7556790b4921b7dc937bcae2bdcde009de663d020dceaa91228ff54c694169b863a0bf5026930daf1602fee3cb05f19bd5ad4542f20142848e71350ac73b4967a83e7f2b9a2208e75925b5336d61ffe42ff3b2faeb820ac526cfd567af3391c352371b962228c8308a42d2cf0277061f2719f6087dd10200c24f6264353eec32a3b6c43e9be810f42aa2367255e78ddacf0358e741fbb102001d2fa095ccd0bdc88b965d28fbcd7415db9401213f6a0904100888a881a4f7120ed1da95fcd5f935a5cdc33e2342b67ad680ba936f4d3001cd9dfef031a7d6e0e20bcd858d8e0035d3494e5536d590613fef761efb5fb54576b6de4a8f9bda76681202fd843be1bf623f605bdbc853d07541ab05a369db17b728f34e348c828848c7620271c6a68ccfb3cce86cc8b45872959a10048a373a8d7876754f39ab62d9f7edb20aa3d579f878bf9f319e81104f1474974bbdecc1fa2c7664360836ef865495832205abdb9ec5dda9eba3ec8ad4ac142ba38f85653a9ce6be9c400504455c62ad8b420878ffdd3029ee2462e0b05780f57ea745b41a6a7a80f956c249014ec96ad58c220f8be3f7f3acc1a10967f23bcfbd53637e1f761347a514051cf71b6e8c5d125cb208fb516a923bfc188aafd435120ab0f2c466ef7a862015d25f68f1ccdec135d0720aed1bfd9ee3e03da21ffeec3992cc4607a05b11a43a49d3e34c5f9e2c674933620c81782ae7c77bd97e50bf2c1113251b472c20364ea5c05734fb8c931bd963926202b96a9556a015d81c002753c87a812104524a2658c2a449fc5545b31a7f3179020f8dd89e5b4eb611030f4502cf0605c15343abf0eebbab8ba3fcb0b8ab5fb254d20a6e60c472882279a6e3ab845f121881e022289a147bbdfd9b095c43e89b61db320e2b18654e28c65691548f5dc646efe2336a96e43b2b8693925d0a7b93d5d22f82067f2d45fe9c588be9ee0558e2e8b9c155bccc24a0d4a158ae4464508289ad999203b74568c2c4b7aa6a78a0dbc3a3e132d1282077ba77412cab157e83ad1559e0a204b349f5d9f926091404e3d7149d98865d9ac79489836acbaa1489d52c506d0b750fd0001a687e617d1b18cd4e94a5937f1bb532eb1aeba8242891ab98befe3c36e22e843d15a26b0eb1051df6ecf5ea7363e1df3f263648c6693797560269d2e7d0a33eaf50e7ab14f548fdf9553159326ae442b42cf5c5339341287a7d156f80b9c81bd69af340a1d4ba903b7269f542fea24ec921944908db58937823bb7a8d5c37431d442a7df972cc5d7b2b068ddec416a41830922a4080a74a5408e1b9bf00114b91c7e41d204a7917dec0ae1759415a47f79a089d7780d677576cbf524a58055c5d58748505fd1c7ebd909c32bc053751f3d46803167e87ef110cb5dfc482b86c5ca0aa5a2a400398fc192469b5c8a9009acc6fb30ca290eabbba720bb4edb4a9b206fa0fd0b25ef594747ca0c7428da86fcd587ec9e12b9b422ba5aa53c1074471f2036e1e28e0b81a00f2d1ec6aee2043131cc40f1ead26c2e3a1d8ca6d1367bed14fd0001ca8e35fd10a6426b283dd6f9b8ea17fa6c2acea64c19b6b6e6944625a1b55ff49a3a68c314f526d96fe0736a268bf740e47f8e3b737ca1574e2fa4f9f291a539da5a4380aa046511576a2ce94593ff0fe8a2c2019daa49bf507c7ec5c7da7891ebd3328495717463205ce3da032b0aae4c8e753a0a89562d0075bc2e1756eb28c6b47885e0581383b6aa4eebc0baeef16a04560c09e3340f52f2c955af9c91d5fff81f977aad9a5aa23f3fe17f79241ea31f713eff268ba3a8a70da53c1782355968976218814e4fbb4a5c4daf1786b0d0f126f0507f0b1f7c776691bf190a3b53e01982f78c17b8a35f68ac1fc20ab30bde05768964856e9851387f9377039dfd0001f361afb479f6e842e7256bd62c18c0265fd39170ce82a466c2f5687bea0e6862f2ee9934bf53aba75917462c9382b566869e01d4fa17f36c85dca452c755ea56fc0c29a1d097d716353afb2f2a67fd18ae365aff687c61ad30398011f0a40bdcb64570591cb831e8f625873aad27b34254a57759efa69b2b97cc0298f1093889030fb8eae89e6abd9532d93b356eb64f2adeaeecb5df9fa77125a7722be35e2fe489dfb7827537cf0d5522b9fa1820798f1f692750dc49b15f2f232b0e9b33971c02ece0ab630abc2a5eb39fbc6238f6cfe924cc02cd98be21ab4569e2cd0a0ee34bf6b91bad47714621f8ea4b93f40dd59ad1ef1d7c9ed5730366b15bec0484fd0001a655fce93873aa7f42b68fec87234021b1cb94742fa7ad06ba54388ddeea4f50ba8aebe52ff0e0178162a97cf96f3231e8c6ef0b48315eb4eb66b3362c62e7c91ab439645be117c153fa637afe900e12b12c02acdf99064c31d31ac4eb804ae113f12cac634fe93223509ee7a06f6a1ae71bab884f41aabb826cb3518faa22735bca7e7243cfffd1f21a9850ba88d94834f2664d570a082ab487d876192fbceb5f7aa5ce71b1f6e538cf6f04bf5796c3fa27dc4a03d03db2c589324714683189b68fa783cd0183889f0c7ed3e007487e9e8b92fba48f0c53e32eff2ae35c13328d7c796a516a068b6b8f4042f754fdceb6774dd04120c4f085e91c8f69af2daafd0001ca4df47e35326f7fce35ca8e6e9d519bb72921d4a14c2ffccacd7b4533d9edef1e940105afb6bd8534c93ce0522274382e4b486e35351464aa26e0d7b22d15f8b8123d070e1dd0d004c423ff298dbb049d425d604db5c0d18700fcbbf92fea8658fe04f8c4616ac72b8dae8984d7b69f6385bc70f44b7f93b28b6f010e2aceee60a04d4339aa6c3048ccaf8ed2850580526ddb784d8bb45051ab5ac72dd6cdd74986ab6711530a9ebdb9b5b6fd72dacf1499707fc6a5b5d9576a9743d16b9c7e0520057d5572a12cc7b20c520620f5447cf08138fcbbbabb5f32b99f29ae4893094da51b70f413d94ef4a8ff62f7b6663207e7b64ac666eae16e36841bcef09320f810956be8c599a0f1fa848ee8b9b8bc69013ff3eb5331247be70868bc62dc152027e0692b2c33fa8d5af172dcfbffd1641048d08ec04c7441ae090d769b352546fd000158c2d184c848f5bf9ba09b98ad9231a36151482940e21df83757a22c320fb96844f3eff321d4013803e0740b5ab96835e01dcc44a6859aa5c1bc082c26136a04b7847dac32c32e3463ff79908b97072f772056e20dd8224ed76c8b22f8dc346e02969a8db8bcf1a6dc4b0f0fe13f5e73a4c639639903df6f787aa8aadcad0f174a331be6fc31bf57b0350db3ea20bd2712ea1a423bf78aca4f576725c70073addc3ee56d877fc87e49955c9f3f9464098c8e093688dfde5d82b19da0a3ad9028e94ddede491cfb5f6ad71f9ba8c690385241d4cfa1f3c794de20b43d90d05f70e75a590f32950c6c58d16205c6942f7291646a2912db66cec7dbe1ffda9a5aa120cfec6b50a4d0fbf3c1223abbfbb89e803ba3e87aeafee62644dd9ae04d32bd102031b94c908321fe8eeba6b63abba917f8296f8e6363859d62ea6101772ec7542bfd000143a25f39122bc2ead5a4073aeb14fd23d3829d7a67bce0639c2b38f654e4bb883979a68ec0c5797fa149623bae4c06593aac99d1717925424d8a0a96f919beca3b930ded09024a3fa2daa2412f1fff41545820b99a41b142e870e0077f4aa16547333f0a9900b56d8c4311ff8868a2b90e7febfcf398fbe1747ae3fb866271d41d8eefd128ea6abb21c2c5738ae342c3bede37ee29bb9ef0d667631b48476c0ff5fe0bd336000f34c5c0c1ed0e42b81676293ba34481654d769f5d425bad13a41c7c3aaa386b49deb93fa83c2b9aaa0f391466efc87ae566e4d8172a49e1d2b33b8b0b9cb13416dbd669c69af63ce205a678b0dead0a870fb5d46ac4459ee882204365ac01efa220b04664f6cdc3ac6e3b2edfb562040d6000a20c4a9b48466864204dc22a8795977aae9aa962b9a901cc91a009c03328ee50f63a91b62b7e574b20208b91e6507b7eb89ce06cfaaac01b7555f481d1f3bfb63ca18ce7b3c62f28081efd0001d43f1c8e7394655dc27f068b41a266bebc9fd42289a4e2870852dc1db8cea80784f0a1ac8fd976e5a55e773682170dffeddb5d0514c1500f2b51976bee8ff0848bd8fa8d7d7a96f1f378498810ce8b59c3deeb0d740d41a013d55e97d1b7cb84f239b692cad6b4310c3afb7ddb651efe5ad937e968e7593951ba3d0c826060cf52e0f485b08300fcd951cdc8509897270ec7acbd0302fad9ce422856f87c73575e873ba44e4aee2053f73f0005ad238ff77d027a1a7e90835e5dff600d0049c08edd5119b79fff6eabd0543d2e556bda29e8fa3ac75399dbe522763fa280db1e4e470ed9bc7ac2cd8bb482ea6a8016b6e2df8de14b01fbe703cc1dd30956c495fd00018bb5b36278890a8d0fb92ac2d50c96558e22e3d08a428b0d8147ac30c574b7349e906a366f99b46dfcdb531812ca39f3895ee79f544835df37d391624b90f8439a3309a2fdbb055709d98a123cdc1f3f4db7b78f88a1d90b5ca672e9596df720f4ba699b07069821939d1488a510ebff155ec650a5922f6162b5df1391fecaf72c426721a96c6c6824c8cd860d5dc8c4d398187c54a08f50247c4cbabfcef4f954aaae440198034fc9673735926caa350d72ef32655c4a90907a7ce384852a531bd86a23aa3fc9188b3580a9c8ed8b1145be49bef1803286fb93762504f2bd9a3f29b37bae6fdfb3023cb05d9bccd2176e5440c35b95e410fa8d9b23967c109b20f15d92c7a723e9b727b0d69d44aba678a21eeb1203c3e00a7e99b94b575daa0c205769c237ee4ce5af24cf73281e16d041c7443c6bfb9061b1068731e3c29f306a203b64851b6906fc8eba9da2cb74beee0d0cc60dcec5dbd041d0d6c72944498e2e20528d14f87b3fa9bd16a8ef7e91cd3f1eb3321ac28237a18f785a9f5ea82aa271200d5f6ef8f14356f1f6716a779a432cd7b479c92abd0449c5fd0aed6dadb3b30afd00016ef333f8b546d81aa73b4d1a05a732b9b639f81e963dd2444e16e7ff5164fb7bd7a0b091505e069d4ca151aaf338d7ce3598b1aeedcbe6b4f681bafb425298c3585cb64236aca41f03b37ac179136a8033efc4f35a64d33e3bcad7860fcf473fdc6827e6f0fe0bfd3a89ec46466abc639fe12dde5327ded795cbd8b95122ee3402838d3882d080f8bc34ba11eac7acf41094d6ab57d966f8cdb1a33c8a35646dcb70894aa20cc0c3ec2abefa3d88bd5d0c4b41be77e67aca9e5cd54daa7dcf21e5bf52bbf1bdf7c3d5d9532fe5a0d08fffcdebdaa9bce5bde773afef8872c5b68db73dac3ebf34f15cbecec7ee34421c529dd0f6bdb6eec3b84dba6eee50b4a7fd00012974b63c73e269d7e59b5c6dee2fca79047179d61fd94d52e9e48045fff0ff9960eabdaa9b862acf54b2acefe8d39c58ce89966149eb8e3685089602df1361c07560339ff97eb271bdb0348a9c14f38a59b5d9e7ea11ee57da0354a404b6e2735b90387886c62b5c725ba53ff6d121aedf4e705d76999116407750959f7a9e28b28716d766aabe7e995e98fcdbeb140064870f9008a724556ed650d0e873bb4825b9346c00d4bba3f34aead63bcea1369dd819696a43486166b6a72976622b6f5584b91c979b66a89560eb0d07fffc08a35bdc4e3b6bb324382f86aa98ff583ac6930ddfc94288532ebdf691177004cec59b06a675ada0c25aeb666bc927cd84fd0001a7f2d70da64170ffda3d6a6c9521bf27c7c9d02d65de034cae0d7770fae453ddcfdea640a9bc7a4373c9da605c87eb7d8ad7131d6961d437f28c583b6c623d9f787fb7811989eb0397b1673e127ff2b6c2ac0f890ec600490744839cc385f8566088100712d9daead9545335295951617027d1847ec01b1547b17c44d2a1040667ac1d1be0bbb607ccbf9fba327b0c2f1c01c6797e2b4b534e794602f880cf695921f1a80f20f898c6dd6e1b62863a585dfc0e0ffc87e06280196b1858d10339944def0671c3d635bfbd631ceecbf483909829f3e04790647f9dae9c211097339e2b522c230f9b864e622471f5cf75d3cdb52ab80fcb04d8fa175c2723faeb8820decc7d8b16575215d1de5275fe990e5ae6d7ec47ae3267364faffe6de401a74220e91af0d0967de3336e4073069eadc657ebc56be2bf2cd2be2e37e87d0e635f682088d515ffe2c67832a6e9a615c1b16d3bcf612795e3c78d1e83fea2fa2eda374820f01e9b8a6b3fd67b610b9c625fca4d52007b1a4a9d4985488c84bf42a1cdb23420677ca02ef419ace61931dc3548f9445446290bd0e4f82ca5e96269a367d1897b20f6be50cc1461e0c6e5dc996bf527a82d23016e763442d741e6a1f126bf25942f20bb54ca990aa006c35d9e8b0add99c09ef95f74933128006f75f295938f098330fd00013764585b0bec6afc184fa6df6189753ef4d10a4d2a216aa50df077d8f7b4f8a1027b79a01cb2e68be9cde59c1d46ec6feb498b3a71b14986c4d9ffce5091876ac9d39b2c63a36359e220d7ffc5a4a0e8a04aef343f60eef31043a942e7f892c5dc152eeea6f22a9c59b6a21871fa8d6bc378c6c7d063aa53b9d13dd2c70dea96533e566534f2f156e9ec37dfd7f1122ebc4514f4d576bc3a0b9f72fbb685b4847090b96fda03fcb9901b9d24f1d91676b9682242eb634a0eed4b5fc2e98ecbc046bf1294cea1c13425be8cd48ef55700aef0843c99ecc5910890e65a40143fc0c52a31ba3a89f5796d607fd4c6dc592e22cc5e93192a936686707fdbaf0429ab20ff89d0f299307041cfc42c566e3da810f3f0f84c741217e899a5459bf6ddad1afd0001be741507c20310671681902f1f66d4251b47150ab8e7deed2d7df69db163b0181058b958d24271059fd29c2315250ec33d6340686734df274dd8caf8aac2cf28d1d395a49c484ba80a3d936dd81fbc4534f05dd3d5ac17690ee5b63941dda6b10d4101c87411afe468c04f43903bac5e3186781ef3dc8a9bde596ae2edd0b35a55dd04d02a7f48fabf5480c142122ee1a29f82bc0447e46ea70badc8dc1c169df50c0c24c2c578c9753b096ae0633ffbba5aba614b5853e42865ed18bee1f228b2a6db9c78303ee368f82d71eee0c0d77ee39c0dd99a6e958681af78cba904b90da03fb72d2f80e60fbef27d2fadd4a1894a4769c2704afc9c18c5374f21f080202c555dce0965572b82cebfb3c7d258c0acdd99b3958fd4f2d03e4c9e4c675c4d200508f57efc9ecbe332248b0d9fd7eea86acf68a5fe4078c52239acf0fba87346fd00017e12cebb21a6202fcb32ecd17a403ac5db6778a1f057f03fadd7747a25f2ee0a5da0fbee74396bec77d581fed976972bb910148f2afca54b97b163159732e46ff07908c97b2cd1fee5e7b3d3a2b7934106a4557f3b8147f3ed78f1d888d279cbdb035f28a8902cbd1922ee02000d226e86497592d801fcd40ec6ab1a169a5fbd0492262124e3f41209bc0ce3b9fa92c6033ad735a323df276ac583ec501c89af0c757f5953d7988a3c402f3a94b8ea25ca2d6cceefec0aa501d3311063913beafbb86bcc1ad2a68961a229cb17392600c6286ef0bb522bb689bfe77d50f14fda162c449fc80518b03939637c5a0c41d2dc21c111f88723400610028aa62350a7fd000148786792a75ef64a1268913ffdd300911c0f4b39d420d458234246b9e3919fccff5b2671df6b0a76c7bcd354f2758832e66c4f8a4f2fe9f52d738045cf06cf56dc68723cf5f55918fb80cf286dfbc4f064ebda5fcb7c8ab2d16e6bd71f28a4a29da026cbb218e6ef7ea76597cb79c878b88caa4ec0d637a182103620a0ef3c1188b0b34a97cdf61ffc46213b75be3283e66b6782c6bcee7e15cc83d22e8a40adba5527ee3a5a9c2242a5e7f82fd5397d7274f02e2d97ce96be82ba85694e4250b88ed410d506b16bd56b7fdf0d1a597d83cc2822f7faee3ca65ba4bdf0a1def515351adb491b7cbbeb48e1c78dfeaa1e13418b22f470547131912b799d6a378b20f908c82f16ea82ad2bdf548e10de39e1e09fc275ae9fbf476ff36dbfa8927270fd0001c42f2f8f9ad16ee8955782bdc6b09ea17afb32930038a52bc654e1b6f3242419393334aff0008a0ce235e50c06caf165f3c7de392049ef298c602ffe62be068de8b0c917393b5cc665607288ddda1cd3183a963ec44c8141542fd571bb557add8e7da81fbca77891f8ba6e1e43ac537a673a51e636fe4a6fcdac29e6204af7eeb48e3c1cbe5ef1b9a4ae6f649d2632b6e94898573e54cfc28d70ee5eb3d18ff483cbcf1c729f157f896a3775b141719970edf54fa4b18885c6dfe0b62c5b0bf05f4d183b6be34a7922f556e1fd03c7ef638db02fad4c60dad47650124d50c5e90efd5c9c65297612d5085560c7acbc83ebd6d05aab8f891e134eb5db2605608bfd000111642d8116c35784064c512f158d953e95d2e7c097f63e7c6da2fa8753a3c0232d85bb09ff4ab6626714ad9f20b7c34b8ff0f6393289238b2d90b16cbe05d7f7bfa9ad4515d8fd99a124b9936e93b101642a658343baf903b384781d63d743cc8721579c87b8f90b0a861c763ab4313c462e53067c424d093a627db1390783a4d6df01a85e84084a00f372e274f803f6978939f3f06158780c33f596d230990911c04e97af07c956e4f51801faff6f9dfb6c8f7abd16f08e016cddff306fc43fff737b6b40715869edb51013bdb24120d91cc7d0a99c3f177e499f2874917f445c87d480e188703246fe64dae343287ccd69c98c777423ecf82529f08d4c928efd00010a3c1c5a140480e608ccc1e8c79f4e0a624e3a2ea79868505b7c73023ee753f4f0bfd06373eaa2a30193f9aaf61804492e3a0bab77e12ceab87dc8e9a99d12074847dda8c92fc704ebc919f94d21e3bdcd23cb905878ee34fb95122667ab96d26a17b96e55eed06324064b60c6574a8af7f7fc149e2e9d71a38f8f998143cf7115ac418b7e28821e09f0b47fb1e313a280b4c07c6f9fcbec5c01203a532269137476a2871776a34321c54ee022c1bbc064e50afea87e73c4328d343a8a9f4e3a706e6aae714ea36dfa3cb3465b10245bb20c2a132615d231b3fe4da12afc44e8d8bfbf283ca73ef5e7e26a87b5c9dd2abfe91eb84d922ba1a2bf6a0ee2ea569afd00017a899d2febda3d75671964171367092d0eaf1b65d4b8a39eab62c8f3891fbd5de7cdaf706aadb99aed924d21e8bd3b2abbf3000aa6aac7cd7f5ce18359f5d8c4a6229b5f93411b22753fc753e708b3886edc5aeb71fa4b32c1b2631cfd26c0912c1fba36fd45fb9bc6c851d0a1b1d6626eb572db66d51a5a91b556f419c90a2ad58b71ecef054301c8c123e03de93ff8f280e802ca29bd3b5a6fa8b990eddecc0fabd71c3b683ef0083b43f9fe8c4a06dbb5340a8928d977ac729fce780806a0ecb84a16e0d17e59879c4d1d2f935ca947b0bd467b4d91767620394e4fbfe5376d9a3b4c601b6b9c122cb8a30ae642763c251d75f12cb377df4595ee993b2a8720dfe7d0722ebe9e3d4540e1a3bee257d90e83e13fb6fac49d32287fc93ee8dc7ffd000123500cf302259899b47f0702a2f52efc1294fa81d307c144440268b6732cc28715be22d150f6302141ae646d98b93f6034de28af910b94e4b136416cba12847554f5cb2d47a31d4835d3f07ebfa2d94ed710a367c818394eb04e803571a8f91e9c73dd29b7045a7f70480a57aa513f8bf667fdd216c8735c0c4647f847cb21f5a12952c23626cfe81aba94311193547584ace27f5760093e1f822d89d1a32dc486ebdf08fb280e87e8381659182dff48403d5f75605d9525ba3eca2bf5542edbaf66fab3979bafcae2d749acf065d29d1bf9e96e29e40388a1da1537a978a7dd47a4c8a44a9b9416015a23ab2abc895ff9a1cd7255a1b90422a544cce7ec689dfd0001e0c30337549c24af89de0971fe2fe6e2dab86ff992ebc79cead8eeb4de25fba47426531499dd49ec980b009c9c5f3a21e21ed49301731360b6eed3445a96c915ef0b23f3e9290083adb69cbb6f026835d7817568d453583facd664b800bb5ecf2912ffcd1d83dd67a1474f83d5f3d9c60248d798ee22c2316f699c6b8b68e886c1f0006d413d78783ca146ec356293f01d48d8c14fa2d411cdc237a8d37bd4cc913f1470c4de2231766f0592da2bfb0da8388e5147e3afd46ae9a39bf0dc042feaa697d631df24c3ba54ad231f486001e5d09cc06bb4e6a11191c0c4bca1b5410dfdaa85efe27fda8c1a67af50f696a9361ca60a7aad16119497066f64adaa80fd0001ffab70ddb0591ee64d92be44e65f01c8a405bd2b57d5f10738e43f5a1fbe9065b2beffcda8896102f13240875a1006281f0fbba79ce4f2e243ebbfb9f973177e09de0215e2d23d31061479367d83a7fcb4a970a0d6d660b24ae2167361167f88f93c81a48e9f9fbb8535ddacfd66f1d25eff079968107bb43d336c5b2f758c446fe05d2cc3876cbdf79ea0059041a29d31dd8c961546e453a6f8d92d20485391587d4ca1cfa69e94a491f8d9ad38c8063f39dd27fe89d6b44822becd57d37d825785da30b0c11e15bc44724ef8cd8b26ed5ae1010566d5a3d1242ed38bfa2cbe357e68bd59ddf21630a7d167da7e99f12519d04ede69e7686783ab2565a61399202714923a3aa83f036043d9ffd5bc4407db3458473cccee4870916d0f9639c85cfd0001a95bec721b247e84d5c2f836c33bed244dd7f73a5b91d2816f14d80e4678cff79c2053c89d50fae9b6a76d5127d2f43fc26f3bae21d34fe009d8c925bf762a10f16d37317702d113cd68b59bb2d2c3128c868c4d85939f1948981400b0cec49de82749c7f8b56fc60610d6663e779d6b4c28bccafa57f7cbe258c7d1b2dbd5c0e8901b3ccb4e8ce31bf5fd1474912e961d665a07a11ea57cb44ccdf2efe1f49d2a372cdb61236c4e7e67e8c5505b0de69fedf00ba3de16d4f4ccf71dcdfd31394c38d2f3f700a7ca196c61c40a98c94c476092ea05e7b27990d4e8a640362b9a7fc15b8a1a903517675b221ec028bea3e4028de65d05a96a92a96fb7e7cef083203d924d1a42f993fa47b19d304e561bf75130e7861225364212fdd7b374c7cb53fd00011293fc9f97b27c312f6339d186df32788a57eec1fe30e13673a9101f9aa4a027a2654bad71de73065ce703ef501f4b177ce940559fd75903ac6ac5b477f022d00ed7a2e638cfcd06556699e24564f983a89057131e5bef5d30c55eb4204470348790bcc3b2bd9909825586c67ea49f6b595731a0f2855ba32d394b44c53e7182124e7bb8a25df7b09406e9b341e537e14851a23deef49caf3a246c63363b61efaca126c384273d631729d63acb2392e1e6ccec7da38e715642d9c4672c99df285ad1bb65216159b7d8d9a0f0ab30f7ee95d1924ae365321357596996a47e8259b52f3f8f6255dfd9b5037920d1d23e8bdce6096130d28d11eebcfc6bb7036990203c359af1064ea2d9c7ce76b3a103c381d8b45710690d246ecc3a7889ed43f35afd0001fb69de86c76493d67c655b3fd10190e9be97a002e3afad7a613c0bf73be252ed558d99b16e3e4223aa31e87a3c0dd985cb367fbfb6733205142107ba028e84ce5adb6787a4dc5e39a569345698ab6ba4257ae773e828aa8988903fef7a187dffa478856ad35e3170f5f3617a4d94d003337bc98afc50a317ffd78f17311cc7e39b42585c67f6b7ad70ea379468c9537512f3b90f10ff2d42d757912a2179d9154b162460f6ee20abe2880d14ef3f1df216823d6fcfa38c2c8893c5cd31db91ccaa2a93d4909b7a6db21230a986f2e08a6f37631edc93ecc82d86f52089e67a2f5265571865554485aa1f2d8e306f668ce972964dab328b72e233e4571e84df9cfd000192c963896ccac0ea89232f292b467f82e0a3b4563ea84444859b5c41fbac8f73e2772d3de214dc91259625c0b241ca600036f53736cfc8b870a87d7ec6951c8cdae9cfc3e7edc4cfd5dc064846d84d04725d13068b99e61e9047471b50e321510af23bc5ad1b6593f9257ba8b27b64dabad059737c9407b2bc2830168649cd15a6d62307146c705a39fc59a24eb25fa18c8a98e3f0f0d22593b367f3fabc64064baf4f383ba0ef3d2032c7a412c5a4d74c940b1fd98efd3e4141a387d923240aec8874251660e2be602155e602e61eb1e14dfec18f2bf92f38573c5e9b4fedf4e801d3edb0ebda156a31edeaa3289dd6dd380e68627240bc06f39066f8ae95abfd0001c3374909c5e2a43e001db4ca5c46e5309236ab5a7e4573c28e5c7c0149592ea5fca3c0e9516909063d404f7801d7d9e4758057d551836b96000e506d4a0574dfaa6df6362aac53ef00221a4612e2cf49a91c1c0a097159dc8635ec3020aae9b76081eff374644c4ad7a8e7ea236c1a256386fa04f19b583315a08edaad2068fc6238314d971c2f0c72f8c44e52600713f07f4235703700d4c956c945f9bc1d0ea51b2a43ebc842b8432ab8b2fda22c43500400add03352971b9be3549cb1957aab51a27dfd95922c042b83102841bf11d8071aa48fee769669c3b77465f32176687f4dce4e6550c2156c083835a8e65cd3a87177df4f68093b0468dda4aca89720ffdfe77a83ca0d93cf551d0037da04e6cc88a615843529fa2cf285e2d2453d18fd00013f7b1ba5d450d52361a9af3c24beb66ef0310cd2c3ce8094831424b433880015c7cd453d0a347f8306d9adb7752e1951519c30595dd0cd3de35e7232c928ed50924ad56be46d6671ccb10378d495269b39c877d2bfe8f136538acbb8b97e27b87fbeecd48d49996948d3b7c61cedbea9c7f88beda192ad8314f5ccc7a4edd98bee1571e13218ee06a9020dc49874dc90dfd30e10bf0ff65a93f1a54a8c055e402dc859651ec03bf2661adf67e616e613054338c9e30a084fd5b30974c560a4e1b7ecccec07149eeda9ec0a648037a7c75316e21041aa8602b41d377d38c840a27229559bbcc6cdee7cee2099cecacc839064131852c04f23c12ba79cfa44319a2094acab4b7debf548702915d13ec3b6574dbe085e74c373dc00c2912576823548200d9edb9dd62e260f824e487a9a1045af448d640ed7daec3065674dfc353d990720605ed0dc9af0a82792977c42191955c91035926ebd41101093b6ae53fddb5568201852b299cb7bdc4918f2a43bb1517d96392336c95136a306ec8d9d8355478c7dfd0001844469dd60ff2e7af11e0141885b797f78c9b3487ed5b00cab18b643623b3d718441beaafd35db8864260d21b56078f42a2e2252bd733f60e1dedff75506270f88caf4578937b861ba7124b2a13c31540e63c64d1aa1e1fcb0fbdd89ddfaee5f46c445ad367796e10f6ea3081891da67700b2781ed37c2d6b007b4ba6133d381376b79cef0b406c827f78426c26021a32c5867ba5841c8c02c83fea6802ab9430429d0de9ad43ec2b31bfd1cb6fac562c3091c91d0aab4731bf02f267b0f2ab1fdceac671fc1ea50dc74c11efeb6c73cf2c6fb15dd643f53aaa5c02d38f9877d486c4acc0cd64a73fc47eb3ff5a7ab69cb1c4c56eafe87a45280b2b1fa1a54a32031e10bfd556356ee57b80a7495343c11c0f848895217bcc66374db06e0d9c551fd000173cd1d76d395109e90520e88424d2632fb30a20b99fe66ed018ced219d2d2b04f9414e8d2becd31d22d04b38080e33c5f4740763869a8a4f36d5337efe400693d73eea2f7ad3c16db995623874dd1827137e50873cea1477b0ca7fb6d20dd3c657b9a6539c49102d251c8ff864ceb178d8649ae898ccaa6f102485670de4fbba02fb43fce8fda52b52f787a5bb6827317462b1d4f91068da35bda7a54e2b71861c0f18f13e428bcd7f3ba9692aa1aad3e3fdaff6daba10f2375a4224cfcbff1513668f7f243acdbad3b2e42c79ea777bf13b16b08e963a5d884ea1ce866f4506fb4b3e9335ce1c1ba4e8e6ebfb695ecf687c6c6ebd4347bb075b9c551355d28c200401ec64a5b40750518aa27fdf99d13748548f418127ae264a00a4cc729ada4bfd0001f8e40abe5fdf9c01a306891076592e4dfe48779cab717da1884289bc4e83bb8e43518fdc05791ee54e5beb76770537230f2a8ac088bf7e74f7e5aa5653eaa40014ea9bea78e6ade2036f37c82c74cbb6f9329a5985aea8bf3d29a5e7a1bb499ef9acdd45939f2ebb79b22c7664bfcfcff8f07f5f2c6cfb0cbd298214ca55dcf31707b2c9cd91c21dcafbd305692409766773d2078ce288e90d6afd10d94a8bd46a2574fdd6d36fcabbdbc8ef1f450e44f9df9106b20da791396b2fc3545e3d1d1c0f7c937eb3c747a1c85d51fdd8d4a4abfc975a0b0f99dab0c1a19229f756ab91abc7473d11c6bf45bf65617322407c4b026cffce47c83ccb166acd8398bc9efd0001e2a88a3eaf5a1fda574f722a00b618c46264db25a63a5d328b369b0840884147422eaa83d419c9369a1cd636b3b48520035caa8690a866768ff6ddc3f40759e21b1f6beccc88b26f0389c3a369054668697599d6c83a1197748eab8689be7d3e4c8e825ab3ba9f4895658aaff0c839a0b8fb0433287906e5288e08926e577fc5f8f7e981d814e2cd8ba3bb26a68060b40e2e91876f9a714b9c673fbf838424cad2bce9be762d6e53fb1b56bc7bbf014408dbd4b6c9d2ade1728a727408689287508c7aa59b1c1c4118dcd5307cab6fc7a743e9d8c6878c9d362263d7e743eedf7efae34fcb75ac890f00271bb5f8d3dc2d389865a84447c3b9ba5381c6bcbd83fd00019214fa7106e5240b71919c096b6fe53767da7d908b70359c5475926882ec9db0258784ad6ef61c708dc150094b71c150a1379132800daeea3a298d67b1690a83d99df2915b3e45e9830e37ed9ca6733b63e607e3151c2bf4827f495108cc705ab1e86e5660b77f0d09045ed8a52d6bc4d8ba81f400c18d817168897f10cd4e2cd7eae87c0277e02ddfbd729ccea15229a4385476ca1b3101c395df4c37860e45f8153d5f82f6765e3bca3f8fc712745202ad3f562df5109f16a2fdaa3f5dc0fe159d2253e577d5b832c6e6e7db335ba1e926cc1ab63af03e0f6173bc70b29859fc64ba1d12ba0b909da418d30c2b6488e7c10936725ea7668a0182bc217f508620ed88514c4caadd3fe2e91b4aabd6713f501a830556f9d3d71af166cd1c88c149203cd0a5764a043220ab3c9948d97669f111fbc2c412bf9546504814d43f3cd2722019f8fe458af202a05249309c8c3b71f624fb1b4acecc87392c98b2fbae144573fd00010acb5cd63ab414d905e2284bc169f625c027be14624862b461bbdb220b314cd334c2d83ef59ba6590d5e2bc83084e7621e11b258ccb8f162d2ff4fffd8b02e12e8f1a8ea7564cb697b9ebeb47bf71e47aac86998f16cf94bf4df8b7dd9ee4bdaf425d3528dd6a1ade67e3b9923b6010aa3175a1b785cffbecef0ad4ff7a76c3cde5c51a29883a95e5d0e36cbfc3eb035a160b848531e648e9392ee5d57d00763a8f413a36289c7888e807334d2101da7aeb430075e442c2be25005d1e338801abc23c34af639869aa745c0940d8bf2ce0463a21e5748c3c44a028b7c6ddd5f25dcd3313fbb3f73ae2fcd2e35660750dddff669118248636f77909236b515149d20460532dd4945380037555ec2ab9a8066a493c0faa480730baa8d218a3830f06ffd00019b2aa5050ace16afeb2b7aa10c45d9324606675b77dedf0d29e20635d0186f9fb7ad0af89c640d0ee2470f54bec8d2968728879d892ff5390e60e071cf852b6c93bec0202099d04315e026ca79d626af504c2ea0f024fb30ae87b44e3916f5047eaa8016c8e85d2e37ff292ca4122efa94edd572521703e58af6b85881053a19f56c1b58ab252c6172aa780954096057b00d0086e7aa1702a16d32d67d05f21ff65f824a2ae27a655bf53107a3aa4b8995d10aa76e02a54a73d73f3276489691b6a6f5d641a87c904a445a6b460593ba54ef810abc29788e6973e72bcf62b75815a748273da8f89fe3f9225450d15d24ce964d8a7337c8bb362858f6a4c0d8abfd00010e90eea322b9325f8f0df687e6136d3f3db84cfc0599ca0bc8c9ad3ae2a2629c28b956f8b323c3c0a2f508dcaa3ee31e03a20541069addc0da07b68c0821e08042a9eb86e9a33d30bf5341d12bdc55d4d75d208389266f3ed292cd4bef8b5bcbd0f604f2b9ee6810bce4f604d61fda3b9bac08f87ad48b0c33af7331f837f40cce178ae1ae8f07f6f63047c2a598b28ed9672fa53e530c79883494c73aba52767b9524c82e1d637732bb9064dc1095bf24fafb8c7920566686529539acfaba525b2f1cf9850b29550e3b3c4caf1692e0f11686c919f993b7f10ce7a31521a2e9be97a025c09f2ef2b849cbcdc506b5a2b01608904f5ddfa9e1444970855ad1acfd000168ffbfa84bfe5c4f4b49e1cffe3de7a4329c4710c97de9c72ee9c6412009acfeba45d99317755f4bab02ae8700eba5c6267534139e878422516d47543dc0fe5c8f4b11c6758fd6ce54e51dce503581068e217b4d62e89f115faa0357fa7301b9dd509b1b9d4a8156b6527926c6442eedd8bb50ecf1d63820ddfa72975e7980504e147ca250b61287b400be32fbe3d69a501edc04424f36bc9d37ad10cc394ce8812ac354295b16017bcb6b955efaf86ace0d356f989161c3d957469024fdd6f29d9debe3af295bdc1aa4a40b7e9d19f212c9cdfb272ec8ad9c99aac7a6453c89a087ca127b07eacf62b71d897e2a9b3d7829f9e163c06be5916d18731b41efa5206b559f18768e61d3ec3eea4447343d5d77885bdb810138612d79a4348ec2ae73fd0001237d9e54fd1ab934695d09c877ecf20238aed56c00fa0575de6868d2ddd2a25d5e406f66d5af980834cda2a813a8dd332be7a025d21f862bff45cf738f6faaa2f50ec19ec208ac3f2d097478d21e263db8b365f05429386a812dfca499dd993c29f62c2a1f92e6d77beda1b8a07f04cebfd268a4dba8a2622be5ec2f55c329e9f8c3590f9e12e8b3db79f255f6f37bbbb736d66347cbc3b19940b75dd1c73cc794e6b3231b101e9bb0865eb56dfc15857d1f13dd5c76cd1bcb83f56a5a9905a54541e995e0fbf0dcb8214a79fa72b0f4facc11f94b65a535603c6c33f5ff71537cd071b4c0416e8cdb5dd853a87030efd84fa5cae856b8091c3d85655ec40b9586ed7cfc35212a7ac5458224073857be715a222e147ccd35538e5e03d114dc7ce2bceae5415b756c8704c232a66583a091ccdef84d0a48880f7caa52ab15b06e60f4daf0a28f13bb04046af73894cb4b3524b3dbeb018620af2117f48c0440bc219eaa556c26271eb1559c5f64735dc1ddc1e2fa34d0168e3b0fd2372cdb2d6f22e3ef0a815cf518345fe373dda4d3b2885fff7bfbef16dcdde66851d50e29d8c52e30ba02ac540213f94eb6e5052212bd48275973fb77bc9f3157cb1fd5027cc8e60a2e12e64228a861f1803977380b309cf94ee72960784b0605f41e46a08bfd5ce2ea389620a0f4a50d6a4474989a1b8dc36e6dd16153aa06bca2d229b9e822c029e2b7973ca82885e9dbf299c91afcfd53dffd3dac0d6eacffd1611d59d78873c59ed951f21bd1cb41ad421e229d02fad33bbd3f7b3e1dc81c6045798abcad79a17e3c0cb175fb04a6a1b768eba3e4732175516d40b4eb149fc3a1602a3cab3d19a4b79c45e5d26ccd96ada10b16671d060600a72566215bc4ed79aabb88695a7dd4f374539410acbbe506c250aebee60b33b34ad987013fcdff1cdcbab4912ef8937bbf1f6e5faa91fb6c1a8f55906be6b894b008f84d39f2d469fa5203abc38b787959ed22a59937b8316019ec261456c113bd6886751df401979cd690449608bf8844e2fec4c6d8a0bbf8773e1c572fdf84c8627a20ce71697256b4dc3f138f6a5eb98f6bdc07b7ddf77c0b832ac52c6fc919ce5a294057d5abb90eb87459260aa4a804cad4a262970b7d061e7c46412ffaf649e645df9ff092c271ca1308e7951f103f905b244bd757b8be7f1839d949e23ef3a37199aa32a0d4cb0a5926167ec7ac5a6bfee834ac03c084378c8da3cd91676e3fade2360d620037dcc572882704539144b16c22658b31e92d33a8247e8417dc5a8ab37cac81d679e33ebf6a4fb53c14148025b901b72b90da31a410cd56042f38f5b84e6ea9992f91c268bb093e4c4e334a210bf1a71936489047c13740b4953e3c772b859f89e0c54585c00bb51fa6e1a78100022102a4bcf5e9ec8582f5fddd3589899e51ea3c7503a1ecf47a5f426b9f2e6290a1d9473045022100e1999ec1e8e9119da1c68415d9b75ca1506dfe1a37aeeb56eaeff123dcc6232202202dedc6802eee94793455ee6731ca8ff7bf574d19a8dc3d8b7fec7d880cca185c00"}, - want: []string{"Anonymous c202384fe80300002228f5c8dcb44644b8073a6c25b8ae1edcfde3089ea0b6f654293dc833f10f12a9717e5346a5475a75c080ccc11b099aee5227ccdfb29d32a83e4d9e8edc90132f48dac02f18a1baea6bd2abceb3324b24f25b9b6be5508b25458fb94af8a200876e267fb6496f48cadf0a8122d762717c3e1f6619cf7408d2bbbbcd6da4c3176d378e30c436d7870ad5956e8bcdde63f5334e5b3b56bfafd823ef9dc0dfd5b0710108b0a5168bd1129e95045952c5a714eb9e1342ced93ff89430d3c9243d4fd0564c98d86392b218019ebbcc9042c659eb49007ee6be4a62ca56e70ee0fa8f9eec0d6bf985a52ca0aa6da17521761dd71569d5274316adf3964ea6b1a98efa3707e92b41567edf919beac7cbf300fd0002804b5cf2c39464a465cdb3cf373ceaf5500cc06125173fd874fd9d922ea89c2d7007f44610c80ec66966af89932118e0f5bc5eea4e674cafdf88ce10a928f1e2c9ad318b2a5b0151bd78017862b2fda2d1e21f61c675649d8b0078498cb9809426a1660e0787d6adae6e360045bd865ab15cf49911631f34481695d3d1d4ab79bc5c77eddad60b331a3f5d60226e9d426f0929d1d0d54d0bc985869d3edaf3eec9ed942a79c6e09cf27482f8034633d06430f9f822c5c4139338af5ee5247fbf88872446cb633af06b71f3b601c8c64a1796b690148b4caa78a90602895f98c2e3bc8dffdc338d24c9623260a60a28b758d5a3965b3c7a22c3ba8607a2bd6db3be6602cfaaec57ad0e59792956dd77cdbf782ac9cd57234587154487a6859b6dd51f319a1427eabfed483abde08805d9065b4f05d7ef430d7ba95cd036ebb1452267cab662fe25ee4319b0ab106cbe3602291b918e11e0da9f7d8765a63696e4360012d5e1cf26bd99466677c8e5003a433e43031162f0b6ac13c3d127e9966019f19968a67aa555ef0488cb7eac214f1794b9cfbc2d956d0dc5833bd3d3a5b727eb9376a4b39f2bb87c31acb5574797ff0ee6ca843f95303b0118142ebeb6a3c46a0e3a00d92fb0bf4d99b78c1f2536564e28967bc4094d8221790e42a47b5bac6b5dfebc71c6e3afe459d7ec3174251e4465e9b2e1427159edfa2e9ab9771ffd0002eed970d3b11056d8a3a27326b401f3a5c4dee991a3995346bdf0ebc9cba82fd890c86953f6b3045c6602e5554eeac02ba3b8333627aa5e1a7041dcee385d45b193e5980d5ce006e8399ac7a95f02e840c2606c1fe3e32b80126a3ffac49d4fcba6780a07694c206780551f5c8add1510b952cb5c5d93c81b508cb58b9ccf96df1e340ace3efee1e9374a10d6b1712e6acd3bf9b5885eda1abcf59a4e08877189587961788bc88c1f1ef9e4038ac60343a5fe5d940624754e83a3b29cf78bcdab71cfaa45e20865561337625d1d290cf251648575c108f797c3a83f1e61d4fcc250b688b00be36ea209f85fdcf816b9e280b39b7df141dd8af6b7f828836f4709a8fbaf481dae117e491ac87bbbb88f247506c58f6c41c49d571f535644a37245e234b5f9ef2d20824cfe603d2433b108792dbf718b9b29823bfa007b3adf6a75a3a94536d356b1deaae5d99693070656dc76be36310e55916f80179166660e6b8bc6291e465d83cd5da0c7d075ac197c92dc4eaaed74d10c2b0c33ad232917e04dacc8ff8849d970bef91048d63dbb44786bf22e1e2ac5895f0da9b3a16edcb0e67adcb27b43baac08f719f9f3e2efc22f46cf20eeabef0c8335a56556b38b18b5753c60edfe1180bab243ce61fa3063f598177928b5b880f1da5e503a50d04ca2fe4673edc39d8cc7a624e5589224f0dea47c7a71d3733d44a4a6185f33ce0bfd00022035c0e9e488a791c1d999703d54be5d1edde23c06660fe1b521dc8300ab7c3d8b7ebf9d75c4f677524315980dd423279e2a2f12b9fd4a8e45edc9a984b4f99397782729f9b36a9ed8785df4b75d3456fbf127c5ba7eb604a87d81b4a9a2148b5520b01af46627b385a8f2f2da53560186c66a86198b0a9c1a3c79b83526b7024de93616122db278d7d9982d05d215244ee5ee33fc6309ba153e043960653b3ef7cc0d470835d064eb106bcce984746d9d5f9b5ca89867f6ac333d16eecdb49136582318aab19b34196fe3d687fabce7815fdf7acaf4b27a9d493b06d3bb0f1ca6ed677ee014185fc299c42bb879be37337f39768d5323556a57c3c05ab111ae08a7b5dbfd1830b2ab2d2462527d864d3a6dd1034fabfd6c0cef20121dd521c53fa4e2ba33862324fee8b116ea83a7aaa2fd68f3d7d955ef1cd111473dcfafb535f6d26bdbe53fb62c401e3cae8c90cc50138435afba3083919e41096cc2f870220f03d8c1bcfbc463aa2069e633b334bc89b8f0e98fb18bb5a71c45534428ed25fe2647c229347c5a213c8c78e7db44b80465b929f0eaabbb328579bf5fa433e993810f761b2a26dcc7af781d73939787d346231c342e61eb45329064b8667a1c314cde899575c9a6a88920e3054744feecbf08ac651657f0ac9022d28946062a80ecd69d9503e59307be14316de92a519835157800c2a3c844abe7864be701466dda4c2d96ca711ccc4622fa541edca55cc3de28f476d5d2c10c89f1849e7ed3c836b9daedee0bba6d3d991f03f3815ac16787b736192bcc8ba2e9ae57846c0e2a1f09ea1807460866d88f74c2b1db9a9aaa007c76ae19b01f733e7ef96f0c6e11250c61ee0b4edbf2e3b22f3182775725fe18769a0dc240a531cf78b8de2b8f1499132d5733d6a3bed8fde40246eadc0fc9f746dff33492229deadc6635ced18ef5d37cfc0b35194a7966406856eae562cac3ca9ad76f43835bbc98636c36a89b605cb771b78f95eab172c428c11e554936d609fd010156d24b38e9ede1df44d6dbc1c7c94ba060321e07fcee445adde8a5b0cb493cd1a342c714f5291329005f5b212380e3d2962e47057c7bd002c8757cdd7e5a73206a22b6da4b8d094dc3a752174499deed98dcb0be75f3fc777a4c47c82bbdf0171c84062796f288318438379b26c4a64ec11e953d34fda80d042d5458c8dd9fdb49f367e8deb7fa027df47dfa281bedaf5052be13c7358b83d43b666614211fe22ea48573a480f3e73b9bcad41958d94dc17d5106066d6d2e9bbd035ce53a2ff94ee4709acad5d33a35abfac6081315a9ca9e466374bfe4332b4cc4cd85dff3787809d885aa43aa38a7de5ed74cd9b240451611b3eed9649a19fc840fe5c099bf00fd00011e3c123a51673507bcf4c198d474fb8c085d511c4af370ecb15002b394d4209852b08b72d311b301dd1488131e5e5343bf488e5dfa6848c2a03796a77aa7cf2516942bbb8205c19f7f19ebd6fc9d61729363cdc7548e2d5d3b626a3d83f0886755c0995b19476da34a7b7f162efeb4107780ebcbb244a69eeb62b8c9cc10b04d0551166f1f15079a9ae8f29df771976136fe2685866224d6514780c14226bb56652f821e7153db39c55fa76a45b6bdf99af9f0426290ccf375a1af33d80e98ffd2a5d62c8ec639c25bf4264e62e0401d2b9128b35e2e2eb1bf1cb578f3af6ee3d572acb9fde866cea6bc17d95f7e11150ebe3fcfeea42469c33b3275bd7c602ffd00013bb3f35666fc74df92514b111f50a73273a847381573c11ac963b7ebb949cbc690132a940419af7b40a3fa42a7326540bf4d65c770def96616ef26711f63a7a275d99c7c1e086f5086749539fd1455ba1b21dfa8a8aa3f2350bf3acfd1d177cfbf6d130e04b37e5f54936c800063a3f54b68e58857218e307ebf75177ea8e57ed4ff4f91d1baffe5f8917e0f1c50b43ebdbe7b6624eebb43584ffbbf994e0befbfe6d6d615e6765717aadbd386cc885de5a77e2e41a66afcaa895e67d9d15df23c162e3b9b7f03e598bcf76d9713ade4845f9ad78b21b26d77318a54b981fa06517ef09d3947088de9dfcc416637e07edf466aeb4a3cbfc48c97cb94129d9056fd0001fea89e47922312c9c25ace1474974b1aaafe5266dcb958d6ea28bb62049ec0f67e8187eccf976f478b71ce0020f7b239073eae58adb660d762d4e20b8e77e75db2fcf3ad9bd12dab974fbde61b1cdad592c8553cf0a5e7d790157d423895abef8f9c2f70511e16802ffe02f39dcdd8b22d726d33e2b9a7a6aba5b846fe0827a505215b18dca6180657cc3f8c82923fdc7ed9a3c2b65a51ef40a816597470e0f5cbe026127e9b0571daded399a648efef4ba481d793575c64ded2122ecd1d2e75ad50b4965b27adf86786220d6eead7cd453958eaed01a2d47d66a775ca14c61505f5e41f3f7707a0b563ab987378036869a28101c94fca791ecb8b7df23ca61ca4c9cd49e43afddb43aa4809ff7b9fea42d0f2040b87c1f5b967c20da51bf0f85c6f1f8ebc9bde9e55afb41f85f77d017b4a2a10bb3320e8b33ff28df33d43816555f7d7095802f225de6df290454e68972085b40af312bce41998498719d3f40e746e2293906dcbb73c8e4b56c81c1470577e80c7df58339a30d65f6286719eba17d2ef25214ce6835914ee6d51370f86ff54cc2a737145bdb18d5fd647bdcddfa28fc106fda0016a9d3fe873b6a232c42543f8f491d813f21ed8960d74e847141df16d2e0fdacdd7e2aa9947d923c320e3166a41b508814fb8a616c22a4ad8f1ff605956670eb20fa97f554b82152f0a4ccf2982b13248545e815403c9349faec3f4ebc688a983841597eece75a30081da81744046ca10e4b39b3aab804c220d92e1be90cf5f0de4ef02ddfaa39298f9048304a2a7318ff01d71a8822bbaf7d8e31368073e471e75c3a324d1189a4efc0a9a6d37421edc77d50f77236a96a1032b5cb52fe8a256d714a57b8f4117105041d037fc9480e278ea4d7c480c848d2c8f3140fd51410272772b71b1fb8c2d9c527341d5bb848b189bf1d8c5af29fceeda48765add979b09bf02041ee0be2ca8015b2c045e3658f7dbb149367ab197bcbd753217513275f092bc56ec8f2f9f4e1fb704a413f08dd4b288845fe69ed204eff90872f0f2282d5d24072242f0ffbbff8a9c93ce607b9b2186a2d555134c07ba747ea087238fe605c3de5019d060f1eb55d20b340dadf8f759eac6ab7576ff53f17a7a44e6ee353fa625d37fb3818a3f7ba2afc530c17608ff47af644b8f34d6601a1d8f1682fd2401b2d93d3192f34783085dd953352718f6fdc2628b0bd10f921376ee3e419b7f30e7ba1525d4d5b8624b445359d180681010b60abeadeccc7c43916fdb8f140025b1a3134e6bc5d9abb8360558ae581804a31d3ee0f96f1cb89cec27c17c772d041ef02e6b59a61b53c211b1ee4e9ce516cc052de191833b853ab0cb90e0c6934790ec0e1350fa3e037fc246ce8995ede9c9f0aa468b5a1eda71eeb0a7a9a44dc1671d88719b9512d2b59af8e68105e1a10fdb4b41d28dd1c60f12cef2d5cdfac8ce1727f65f43011a536ff803d386117aac5a2cb21d0af1e26b0208de5e769a46cc26a15b67e53e5f73e78cbed1c6984f7d6f45024f139917c6a2fd4c593f8df69f62729677cefc49d4c086d2d64d4e78b1d3861aa6915e5d80ecedb8be3779ad4ac1901846973b88a34f10db8aded44fde8ffc716bfc0c7ab32adb7c8af7bcf215679621a3edbe2d8939f165ff3125a61440e4255cea25d1725c512e0bd3f235c560c74b016ead88f36c26fd2401920a99652f9d37210c815f8a976839d61d2d8e63e632534be5783d6ffa704bc527415df751821a714f77e1bfee2b0aeef13ae16dfdd0b90c08d528b918ff461e996f1d58e42815690d97ddfa91c4ea249f017413f78770dbf0033bf2f1cc000ca3e31cc5e98e78c4d535c28102d2f0ea65ea8e12e01a307d6734d4517226149d625516a78a083b88190229a2f277ef5b42db74e93535fc07b0338f1c8a87925db3d92ab8a4b08c4c595d75fe2b8a6d73ffc63a605d7336b82f7fd4fe38c583a9d1bd1948b682ae39a86c8330cdde60d21e45c737a9b84f5af35ba291b8a0e2b19ca73c03580ebfd2b0bc81989dc6b316c101a19f401463e49c9635815336dbd3f77b5eb57e9c2795dac191813954ae5d7fba44940f1b50cf8da82dcaa194cea481a447aafd2401810d68e1f0c708da414cabc0befc4beddcf7d6a98e738088b1eba1e631ea128af363086cb776afb2e0d26be6555cac682e4f56f7db041d4b05afb09b0f39a3d967d7a677ba2521dfa9a7f79f3d9c69342d5264faedd3d65586dfbf13163d13b9a17d64c716e78c58d1ba034ea61d16e60efdc21522cf3b2514a29644974f3313366126999c01f3efb61f574970cc84d5e099a294a2f10a639f457931a02f45e6a0336e827da0871560611e56dffbd2e544adb593ab075e153951f5e131bdd401173ab862cc9c3be5078bb72492c42b63aab49920e40620ecaa6c1852225c8b6825841966143f34f700291fffad12f6cebc6cd22c0dddf08d143c701f6d98080c08f8f71a3183a9b8c71efc95bf2365ba3c6a4e960632252c347f5cd03d98776e54c96cb6fda001e426345b922ee1c9a6a7befb7764cf6da83a9422693f6f48e9d8f028f56394e98fa82c0bb21d3a691a49e1efdf1cf13b04a3ae141204f0e2f6c13f0de8922d20122f92ad7c9f2d59a8b19dc0fa86cac0680b44a37476e6bcf8876772f9da916f3050c2169210367a6586e55a439472dc6c056307000bba0f32f1535a28cc056a9c2f9e04f9f6fda9201530e55f2ac00959c893738e9a375220d072d1fe31b85ed904990a2c3fe87a032def61b3f9bb97884c6e7d1c45071ba72f6bd38f987965a3fb6b9cd168864e6d02d56bc08a459ff784aa3a73ba6b787558041bff57eea7e834ba069781e964be2973f20669c52543b142dc87b9e05a6107ac2594db04a80dc4f79fca21f91caa1a278fe39bdb9a7230380d96a92e6ed3cbd09b27f65be82bb5006020edf676db53b4086a249a44072c17f11a7e61b1ec6840943192753c5d3e66e7332a787e3d507660e536dce29d4f32586686e682145eecb3a991225e95e28f9c83879b42e38d4be043cf713484d2b3c7ec9bdf4675621a910b08d7de7efbc51de9c90d67cb5cb4be0732b5c7f1a7a59ab1e246afded4033eb0e6a580614ebf9176247d7199821e51e53d64b5643ce30c0e6c530b5c84bd79680bbb49969efa9e47aae229e13b3110f7685f875e858fe06be50a338df26f0925839fe4e773c246477cc0003dd8685d179fe276230690c35042f80e3dd08450be1f244524372036709b9c956f5a4309753828390bf270c2f59b26bd0bccb61c3f26d9ac9c40444606f9402217a020ee26a48fdd3dcad68729f8b379cc78c3ca5819282e12d690f995ffade91eb9ec3edc41d47574c9f614b8c8047081803df761d880ffd7325b73bd4526880c43613831dc5d3002e8f5b5ad51b667bbf6dfbff34a49e9d62ff198d5f5deea4345f813f408ce19ce07f68654cf8f19932e10064bec9017d6a2cf5ba0d139293d4ba9b71b74d63b6a6763feaecebb4fd65a8e7da10f98137942ed9ebb4963f3907f055950204d50e0fd7363e9814721cd53f3896feca24f5d544ac857e51610a627fb3993c9200d5390612b315d88b24a0eda3acab52028e2f224bd8aeae0f9b985c15da13c5220e0fcb3e8f296090250ffce1a35775a208b305187ca439495a3f21cc38b2c1871203974b08ac4a3be4980739bd9328a67ba15b5b7f216cae3f7e400d498c10d58f52092f5fa30da2bb1f5f192273d966427965437a28529440447bd96a49340c5bcd620bd103e4fe6084eb129c3ebb0c1afe65c099b47c43470d3011bf3e01b6bf6f6c620ca9ea458c131ec536f2f2cbbedaa4787045494e1a283ad4d279ab3eecbee73b020458cd770741aa7cd2c4583a2b484d835700af59ed1401a4bb783cae17a15d43420b9ebee9d6384d21acdbb3fbcefdcb24d1a1ba3c40221597654285d20b72c5c5f206cc3a66f93a0682e95c735ac08cf45a253f306a0d2ea5c35f922ffdcdd3724bc20258f23a294f005df3dc354cc1d3ea7c04b04b0d327f73748982176e45dbb1478209046f36c74dcc4cb7f59ca9b31071d29d790075626b1f2958a82adfcbf7e264b20ce4d42f09479c938378d0987668a704072144f5f8d10d6add28f27c4990305c720e9d84ac067b6c55edb53c9505abab579c11ec4d7125da7c05067cc0b8d7b1d3b2008eebacdb86009be95bd835aa34c7766183906a0c9494a5035b6c5ffc1cd3f3720a8527a09ec0232482d5d54e920c8e5cb270a99b3556d9c2bed9aeb9e7ef77a7820996ce009bd3e61496e7d977fb1fa7f770547415a19af106002ed6e73263a73d22065d7a01777b3f7475d4c197c87e4c54defdf4d9b19bfeee666bb706717d2af9e202486a3adf85ae19cc84e95d7523e056c48d17dc1c7cd52eadca5b16754cf6624205513c1bcf79af11aecb582f959350752dc30b34b6e4aa43fdc975db9474678262007940cd34b485d77b36094f4724a4640b55245edd609dfde35ab05c0ceede02920490d837e6c3ab275a63a2fa1b688985bb5dccfbd8058236d4f7e543d45b898792080304a1ebf6ab0b772a56183468b1ca1800d12af1384822711d626da86771d69202a4e6750bce678bd2d5d32acbb4115d2d62400b478246313559d24e811e068b220901b9cebd3bdeb1917c82581bdc09394ae5ec6b3cbe604a7c55cd88191018ea5206677217c27cea379fd02a893a53b65fa9707583209d6ce7d92acf71191f06f8c20c5aa1a752e45a20ce6ff9514a93eb8e2a3d1c20a2e6da8ead4e08fdb49a820362031d609cf79dd225908cae397fd528a3a1c790219198831da8c0e52cffe410a7320192a2ebafa0829d5160197b2bb1892e56e0712659f03f7c93fcd066727229f4a20b1e057358eac36e054912938c80d92876bf26709e2beef22004596abfa7e931d20efe65db4d0cb0cd83f87ce3de0046b40391436429c75372ffe43e510b33c5a6b206459a7884a1bc3ed6d6ab7e766f2d4abcdfca01f3e93a46e72b36334358077072008e98ce2698e5cf02509ae8a42ecdfd79fd6177c7f94af10adbb991c656d7e5820dc3729cc6773c069abb0f66470512e477cdb7d1bda133cc5fdc2bf251dc620cc2093035c85397af4a528d3bbb93071f48ecc418e8a6b7255cd755c7a2ce77fcb6e207a910d8ff9b0c94f15a6bd41ed879935fa9e5dd45cb0fcca1fd9d3ba02db489a20cfeaf4f8c94ead77ddd5fb022c1f226ef78daeb18d2098141f3bbba103854c412043bf1ebf028e4dcb2c49e180048933ee69e9937c6be45478d1b59deac75728502057763ff89840016abafae0890402f55ec14d72e0659fafcc8df4229669ccfac7205870fa711c94881cf88f10735e8e1fa62f949383e8c13ced1dddbd0ae940cbe9202732db201cc7d170cbe4fea81e5e3c0eb656dce6dac2af43f62517d78d7266352036f92f3315c6259a0eb9b8cf13b71a9f5e08487832c4eee7f28daea302684f022067451ffec357ed9dc203eadd41cb87883426183378b7dff4e0c86cf7d7d79a92203b7aa0f29a3d4633cde3839cda8467836d7d4ef7b7de19b74641a14af09ed0f1208a6a23ad4aeb120e5bd6a68ee0d84bc411e1a0c770ea76f6a427c55a92cadde42071e96930a3933a5f6657dcd7ce9dc56ff6c4fb00ba2b9802b8f0742b93612f7f2041b4413cd3478ed8aaf837f1f860f023c2ceba1fdee135bc6e472ed71b848d8c20f9365774077030d564aaefd9ae880b984d1c76659df81b11bd62b1c78e91fdaa20b74e8eb3b891d3004f1003b9b764be60c5bc6114ef1954091429ee48cfc71d06200ee9313878d9957d60146a71b04290db8e67ddf53451bede60776d92083ecd3120442a24a57b909d440fd8f18ef2c6f07ef428f12efee70f7806c240c098a63e022033480172831beb16e419688753b804662dba87328cad4f082da5ff616795714220314263c8af922af005215fdd11fad0814c17686d2ce3ca081063a8e1eade6da220b7b075ca67ebf96ffbde4738ecb2fc894347ce9bf8797d4a5f63b86ff6f0496e20edcbc228047fa8a7fce8bb344a0e9be16ed0ce27773678324e13e8aca26b02f020de15b6a5fba896b3cc37e2d8f310e32c8436f1e4391dd8a8510ad2e017f7d3f5208ad7c2dbe66cfa78694a91a4c7556790b4921b7dc937bcae2bdcde009de663d020dceaa91228ff54c694169b863a0bf5026930daf1602fee3cb05f19bd5ad4542f20142848e71350ac73b4967a83e7f2b9a2208e75925b5336d61ffe42ff3b2faeb820ac526cfd567af3391c352371b962228c8308a42d2cf0277061f2719f6087dd10200c24f6264353eec32a3b6c43e9be810f42aa2367255e78ddacf0358e741fbb102001d2fa095ccd0bdc88b965d28fbcd7415db9401213f6a0904100888a881a4f7120ed1da95fcd5f935a5cdc33e2342b67ad680ba936f4d3001cd9dfef031a7d6e0e20bcd858d8e0035d3494e5536d590613fef761efb5fb54576b6de4a8f9bda76681202fd843be1bf623f605bdbc853d07541ab05a369db17b728f34e348c828848c7620271c6a68ccfb3cce86cc8b45872959a10048a373a8d7876754f39ab62d9f7edb20aa3d579f878bf9f319e81104f1474974bbdecc1fa2c7664360836ef865495832205abdb9ec5dda9eba3ec8ad4ac142ba38f85653a9ce6be9c400504455c62ad8b420878ffdd3029ee2462e0b05780f57ea745b41a6a7a80f956c249014ec96ad58c220f8be3f7f3acc1a10967f23bcfbd53637e1f761347a514051cf71b6e8c5d125cb208fb516a923bfc188aafd435120ab0f2c466ef7a862015d25f68f1ccdec135d0720aed1bfd9ee3e03da21ffeec3992cc4607a05b11a43a49d3e34c5f9e2c674933620c81782ae7c77bd97e50bf2c1113251b472c20364ea5c05734fb8c931bd963926202b96a9556a015d81c002753c87a812104524a2658c2a449fc5545b31a7f3179020f8dd89e5b4eb611030f4502cf0605c15343abf0eebbab8ba3fcb0b8ab5fb254d20a6e60c472882279a6e3ab845f121881e022289a147bbdfd9b095c43e89b61db320e2b18654e28c65691548f5dc646efe2336a96e43b2b8693925d0a7b93d5d22f82067f2d45fe9c588be9ee0558e2e8b9c155bccc24a0d4a158ae4464508289ad999203b74568c2c4b7aa6a78a0dbc3a3e132d1282077ba77412cab157e83ad1559e0a204b349f5d9f926091404e3d7149d98865d9ac79489836acbaa1489d52c506d0b750fd0001a687e617d1b18cd4e94a5937f1bb532eb1aeba8242891ab98befe3c36e22e843d15a26b0eb1051df6ecf5ea7363e1df3f263648c6693797560269d2e7d0a33eaf50e7ab14f548fdf9553159326ae442b42cf5c5339341287a7d156f80b9c81bd69af340a1d4ba903b7269f542fea24ec921944908db58937823bb7a8d5c37431d442a7df972cc5d7b2b068ddec416a41830922a4080a74a5408e1b9bf00114b91c7e41d204a7917dec0ae1759415a47f79a089d7780d677576cbf524a58055c5d58748505fd1c7ebd909c32bc053751f3d46803167e87ef110cb5dfc482b86c5ca0aa5a2a400398fc192469b5c8a9009acc6fb30ca290eabbba720bb4edb4a9b206fa0fd0b25ef594747ca0c7428da86fcd587ec9e12b9b422ba5aa53c1074471f2036e1e28e0b81a00f2d1ec6aee2043131cc40f1ead26c2e3a1d8ca6d1367bed14fd0001ca8e35fd10a6426b283dd6f9b8ea17fa6c2acea64c19b6b6e6944625a1b55ff49a3a68c314f526d96fe0736a268bf740e47f8e3b737ca1574e2fa4f9f291a539da5a4380aa046511576a2ce94593ff0fe8a2c2019daa49bf507c7ec5c7da7891ebd3328495717463205ce3da032b0aae4c8e753a0a89562d0075bc2e1756eb28c6b47885e0581383b6aa4eebc0baeef16a04560c09e3340f52f2c955af9c91d5fff81f977aad9a5aa23f3fe17f79241ea31f713eff268ba3a8a70da53c1782355968976218814e4fbb4a5c4daf1786b0d0f126f0507f0b1f7c776691bf190a3b53e01982f78c17b8a35f68ac1fc20ab30bde05768964856e9851387f9377039dfd0001f361afb479f6e842e7256bd62c18c0265fd39170ce82a466c2f5687bea0e6862f2ee9934bf53aba75917462c9382b566869e01d4fa17f36c85dca452c755ea56fc0c29a1d097d716353afb2f2a67fd18ae365aff687c61ad30398011f0a40bdcb64570591cb831e8f625873aad27b34254a57759efa69b2b97cc0298f1093889030fb8eae89e6abd9532d93b356eb64f2adeaeecb5df9fa77125a7722be35e2fe489dfb7827537cf0d5522b9fa1820798f1f692750dc49b15f2f232b0e9b33971c02ece0ab630abc2a5eb39fbc6238f6cfe924cc02cd98be21ab4569e2cd0a0ee34bf6b91bad47714621f8ea4b93f40dd59ad1ef1d7c9ed5730366b15bec0484fd0001a655fce93873aa7f42b68fec87234021b1cb94742fa7ad06ba54388ddeea4f50ba8aebe52ff0e0178162a97cf96f3231e8c6ef0b48315eb4eb66b3362c62e7c91ab439645be117c153fa637afe900e12b12c02acdf99064c31d31ac4eb804ae113f12cac634fe93223509ee7a06f6a1ae71bab884f41aabb826cb3518faa22735bca7e7243cfffd1f21a9850ba88d94834f2664d570a082ab487d876192fbceb5f7aa5ce71b1f6e538cf6f04bf5796c3fa27dc4a03d03db2c589324714683189b68fa783cd0183889f0c7ed3e007487e9e8b92fba48f0c53e32eff2ae35c13328d7c796a516a068b6b8f4042f754fdceb6774dd04120c4f085e91c8f69af2daafd0001ca4df47e35326f7fce35ca8e6e9d519bb72921d4a14c2ffccacd7b4533d9edef1e940105afb6bd8534c93ce0522274382e4b486e35351464aa26e0d7b22d15f8b8123d070e1dd0d004c423ff298dbb049d425d604db5c0d18700fcbbf92fea8658fe04f8c4616ac72b8dae8984d7b69f6385bc70f44b7f93b28b6f010e2aceee60a04d4339aa6c3048ccaf8ed2850580526ddb784d8bb45051ab5ac72dd6cdd74986ab6711530a9ebdb9b5b6fd72dacf1499707fc6a5b5d9576a9743d16b9c7e0520057d5572a12cc7b20c520620f5447cf08138fcbbbabb5f32b99f29ae4893094da51b70f413d94ef4a8ff62f7b6663207e7b64ac666eae16e36841bcef09320f810956be8c599a0f1fa848ee8b9b8bc69013ff3eb5331247be70868bc62dc152027e0692b2c33fa8d5af172dcfbffd1641048d08ec04c7441ae090d769b352546fd000158c2d184c848f5bf9ba09b98ad9231a36151482940e21df83757a22c320fb96844f3eff321d4013803e0740b5ab96835e01dcc44a6859aa5c1bc082c26136a04b7847dac32c32e3463ff79908b97072f772056e20dd8224ed76c8b22f8dc346e02969a8db8bcf1a6dc4b0f0fe13f5e73a4c639639903df6f787aa8aadcad0f174a331be6fc31bf57b0350db3ea20bd2712ea1a423bf78aca4f576725c70073addc3ee56d877fc87e49955c9f3f9464098c8e093688dfde5d82b19da0a3ad9028e94ddede491cfb5f6ad71f9ba8c690385241d4cfa1f3c794de20b43d90d05f70e75a590f32950c6c58d16205c6942f7291646a2912db66cec7dbe1ffda9a5aa120cfec6b50a4d0fbf3c1223abbfbb89e803ba3e87aeafee62644dd9ae04d32bd102031b94c908321fe8eeba6b63abba917f8296f8e6363859d62ea6101772ec7542bfd000143a25f39122bc2ead5a4073aeb14fd23d3829d7a67bce0639c2b38f654e4bb883979a68ec0c5797fa149623bae4c06593aac99d1717925424d8a0a96f919beca3b930ded09024a3fa2daa2412f1fff41545820b99a41b142e870e0077f4aa16547333f0a9900b56d8c4311ff8868a2b90e7febfcf398fbe1747ae3fb866271d41d8eefd128ea6abb21c2c5738ae342c3bede37ee29bb9ef0d667631b48476c0ff5fe0bd336000f34c5c0c1ed0e42b81676293ba34481654d769f5d425bad13a41c7c3aaa386b49deb93fa83c2b9aaa0f391466efc87ae566e4d8172a49e1d2b33b8b0b9cb13416dbd669c69af63ce205a678b0dead0a870fb5d46ac4459ee882204365ac01efa220b04664f6cdc3ac6e3b2edfb562040d6000a20c4a9b48466864204dc22a8795977aae9aa962b9a901cc91a009c03328ee50f63a91b62b7e574b20208b91e6507b7eb89ce06cfaaac01b7555f481d1f3bfb63ca18ce7b3c62f28081efd0001d43f1c8e7394655dc27f068b41a266bebc9fd42289a4e2870852dc1db8cea80784f0a1ac8fd976e5a55e773682170dffeddb5d0514c1500f2b51976bee8ff0848bd8fa8d7d7a96f1f378498810ce8b59c3deeb0d740d41a013d55e97d1b7cb84f239b692cad6b4310c3afb7ddb651efe5ad937e968e7593951ba3d0c826060cf52e0f485b08300fcd951cdc8509897270ec7acbd0302fad9ce422856f87c73575e873ba44e4aee2053f73f0005ad238ff77d027a1a7e90835e5dff600d0049c08edd5119b79fff6eabd0543d2e556bda29e8fa3ac75399dbe522763fa280db1e4e470ed9bc7ac2cd8bb482ea6a8016b6e2df8de14b01fbe703cc1dd30956c495fd00018bb5b36278890a8d0fb92ac2d50c96558e22e3d08a428b0d8147ac30c574b7349e906a366f99b46dfcdb531812ca39f3895ee79f544835df37d391624b90f8439a3309a2fdbb055709d98a123cdc1f3f4db7b78f88a1d90b5ca672e9596df720f4ba699b07069821939d1488a510ebff155ec650a5922f6162b5df1391fecaf72c426721a96c6c6824c8cd860d5dc8c4d398187c54a08f50247c4cbabfcef4f954aaae440198034fc9673735926caa350d72ef32655c4a90907a7ce384852a531bd86a23aa3fc9188b3580a9c8ed8b1145be49bef1803286fb93762504f2bd9a3f29b37bae6fdfb3023cb05d9bccd2176e5440c35b95e410fa8d9b23967c109b20f15d92c7a723e9b727b0d69d44aba678a21eeb1203c3e00a7e99b94b575daa0c205769c237ee4ce5af24cf73281e16d041c7443c6bfb9061b1068731e3c29f306a203b64851b6906fc8eba9da2cb74beee0d0cc60dcec5dbd041d0d6c72944498e2e20528d14f87b3fa9bd16a8ef7e91cd3f1eb3321ac28237a18f785a9f5ea82aa271200d5f6ef8f14356f1f6716a779a432cd7b479c92abd0449c5fd0aed6dadb3b30afd00016ef333f8b546d81aa73b4d1a05a732b9b639f81e963dd2444e16e7ff5164fb7bd7a0b091505e069d4ca151aaf338d7ce3598b1aeedcbe6b4f681bafb425298c3585cb64236aca41f03b37ac179136a8033efc4f35a64d33e3bcad7860fcf473fdc6827e6f0fe0bfd3a89ec46466abc639fe12dde5327ded795cbd8b95122ee3402838d3882d080f8bc34ba11eac7acf41094d6ab57d966f8cdb1a33c8a35646dcb70894aa20cc0c3ec2abefa3d88bd5d0c4b41be77e67aca9e5cd54daa7dcf21e5bf52bbf1bdf7c3d5d9532fe5a0d08fffcdebdaa9bce5bde773afef8872c5b68db73dac3ebf34f15cbecec7ee34421c529dd0f6bdb6eec3b84dba6eee50b4a7fd00012974b63c73e269d7e59b5c6dee2fca79047179d61fd94d52e9e48045fff0ff9960eabdaa9b862acf54b2acefe8d39c58ce89966149eb8e3685089602df1361c07560339ff97eb271bdb0348a9c14f38a59b5d9e7ea11ee57da0354a404b6e2735b90387886c62b5c725ba53ff6d121aedf4e705d76999116407750959f7a9e28b28716d766aabe7e995e98fcdbeb140064870f9008a724556ed650d0e873bb4825b9346c00d4bba3f34aead63bcea1369dd819696a43486166b6a72976622b6f5584b91c979b66a89560eb0d07fffc08a35bdc4e3b6bb324382f86aa98ff583ac6930ddfc94288532ebdf691177004cec59b06a675ada0c25aeb666bc927cd84fd0001a7f2d70da64170ffda3d6a6c9521bf27c7c9d02d65de034cae0d7770fae453ddcfdea640a9bc7a4373c9da605c87eb7d8ad7131d6961d437f28c583b6c623d9f787fb7811989eb0397b1673e127ff2b6c2ac0f890ec600490744839cc385f8566088100712d9daead9545335295951617027d1847ec01b1547b17c44d2a1040667ac1d1be0bbb607ccbf9fba327b0c2f1c01c6797e2b4b534e794602f880cf695921f1a80f20f898c6dd6e1b62863a585dfc0e0ffc87e06280196b1858d10339944def0671c3d635bfbd631ceecbf483909829f3e04790647f9dae9c211097339e2b522c230f9b864e622471f5cf75d3cdb52ab80fcb04d8fa175c2723faeb8820decc7d8b16575215d1de5275fe990e5ae6d7ec47ae3267364faffe6de401a74220e91af0d0967de3336e4073069eadc657ebc56be2bf2cd2be2e37e87d0e635f682088d515ffe2c67832a6e9a615c1b16d3bcf612795e3c78d1e83fea2fa2eda374820f01e9b8a6b3fd67b610b9c625fca4d52007b1a4a9d4985488c84bf42a1cdb23420677ca02ef419ace61931dc3548f9445446290bd0e4f82ca5e96269a367d1897b20f6be50cc1461e0c6e5dc996bf527a82d23016e763442d741e6a1f126bf25942f20bb54ca990aa006c35d9e8b0add99c09ef95f74933128006f75f295938f098330fd00013764585b0bec6afc184fa6df6189753ef4d10a4d2a216aa50df077d8f7b4f8a1027b79a01cb2e68be9cde59c1d46ec6feb498b3a71b14986c4d9ffce5091876ac9d39b2c63a36359e220d7ffc5a4a0e8a04aef343f60eef31043a942e7f892c5dc152eeea6f22a9c59b6a21871fa8d6bc378c6c7d063aa53b9d13dd2c70dea96533e566534f2f156e9ec37dfd7f1122ebc4514f4d576bc3a0b9f72fbb685b4847090b96fda03fcb9901b9d24f1d91676b9682242eb634a0eed4b5fc2e98ecbc046bf1294cea1c13425be8cd48ef55700aef0843c99ecc5910890e65a40143fc0c52a31ba3a89f5796d607fd4c6dc592e22cc5e93192a936686707fdbaf0429ab20ff89d0f299307041cfc42c566e3da810f3f0f84c741217e899a5459bf6ddad1afd0001be741507c20310671681902f1f66d4251b47150ab8e7deed2d7df69db163b0181058b958d24271059fd29c2315250ec33d6340686734df274dd8caf8aac2cf28d1d395a49c484ba80a3d936dd81fbc4534f05dd3d5ac17690ee5b63941dda6b10d4101c87411afe468c04f43903bac5e3186781ef3dc8a9bde596ae2edd0b35a55dd04d02a7f48fabf5480c142122ee1a29f82bc0447e46ea70badc8dc1c169df50c0c24c2c578c9753b096ae0633ffbba5aba614b5853e42865ed18bee1f228b2a6db9c78303ee368f82d71eee0c0d77ee39c0dd99a6e958681af78cba904b90da03fb72d2f80e60fbef27d2fadd4a1894a4769c2704afc9c18c5374f21f080202c555dce0965572b82cebfb3c7d258c0acdd99b3958fd4f2d03e4c9e4c675c4d200508f57efc9ecbe332248b0d9fd7eea86acf68a5fe4078c52239acf0fba87346fd00017e12cebb21a6202fcb32ecd17a403ac5db6778a1f057f03fadd7747a25f2ee0a5da0fbee74396bec77d581fed976972bb910148f2afca54b97b163159732e46ff07908c97b2cd1fee5e7b3d3a2b7934106a4557f3b8147f3ed78f1d888d279cbdb035f28a8902cbd1922ee02000d226e86497592d801fcd40ec6ab1a169a5fbd0492262124e3f41209bc0ce3b9fa92c6033ad735a323df276ac583ec501c89af0c757f5953d7988a3c402f3a94b8ea25ca2d6cceefec0aa501d3311063913beafbb86bcc1ad2a68961a229cb17392600c6286ef0bb522bb689bfe77d50f14fda162c449fc80518b03939637c5a0c41d2dc21c111f88723400610028aa62350a7fd000148786792a75ef64a1268913ffdd300911c0f4b39d420d458234246b9e3919fccff5b2671df6b0a76c7bcd354f2758832e66c4f8a4f2fe9f52d738045cf06cf56dc68723cf5f55918fb80cf286dfbc4f064ebda5fcb7c8ab2d16e6bd71f28a4a29da026cbb218e6ef7ea76597cb79c878b88caa4ec0d637a182103620a0ef3c1188b0b34a97cdf61ffc46213b75be3283e66b6782c6bcee7e15cc83d22e8a40adba5527ee3a5a9c2242a5e7f82fd5397d7274f02e2d97ce96be82ba85694e4250b88ed410d506b16bd56b7fdf0d1a597d83cc2822f7faee3ca65ba4bdf0a1def515351adb491b7cbbeb48e1c78dfeaa1e13418b22f470547131912b799d6a378b20f908c82f16ea82ad2bdf548e10de39e1e09fc275ae9fbf476ff36dbfa8927270fd0001c42f2f8f9ad16ee8955782bdc6b09ea17afb32930038a52bc654e1b6f3242419393334aff0008a0ce235e50c06caf165f3c7de392049ef298c602ffe62be068de8b0c917393b5cc665607288ddda1cd3183a963ec44c8141542fd571bb557add8e7da81fbca77891f8ba6e1e43ac537a673a51e636fe4a6fcdac29e6204af7eeb48e3c1cbe5ef1b9a4ae6f649d2632b6e94898573e54cfc28d70ee5eb3d18ff483cbcf1c729f157f896a3775b141719970edf54fa4b18885c6dfe0b62c5b0bf05f4d183b6be34a7922f556e1fd03c7ef638db02fad4c60dad47650124d50c5e90efd5c9c65297612d5085560c7acbc83ebd6d05aab8f891e134eb5db2605608bfd000111642d8116c35784064c512f158d953e95d2e7c097f63e7c6da2fa8753a3c0232d85bb09ff4ab6626714ad9f20b7c34b8ff0f6393289238b2d90b16cbe05d7f7bfa9ad4515d8fd99a124b9936e93b101642a658343baf903b384781d63d743cc8721579c87b8f90b0a861c763ab4313c462e53067c424d093a627db1390783a4d6df01a85e84084a00f372e274f803f6978939f3f06158780c33f596d230990911c04e97af07c956e4f51801faff6f9dfb6c8f7abd16f08e016cddff306fc43fff737b6b40715869edb51013bdb24120d91cc7d0a99c3f177e499f2874917f445c87d480e188703246fe64dae343287ccd69c98c777423ecf82529f08d4c928efd00010a3c1c5a140480e608ccc1e8c79f4e0a624e3a2ea79868505b7c73023ee753f4f0bfd06373eaa2a30193f9aaf61804492e3a0bab77e12ceab87dc8e9a99d12074847dda8c92fc704ebc919f94d21e3bdcd23cb905878ee34fb95122667ab96d26a17b96e55eed06324064b60c6574a8af7f7fc149e2e9d71a38f8f998143cf7115ac418b7e28821e09f0b47fb1e313a280b4c07c6f9fcbec5c01203a532269137476a2871776a34321c54ee022c1bbc064e50afea87e73c4328d343a8a9f4e3a706e6aae714ea36dfa3cb3465b10245bb20c2a132615d231b3fe4da12afc44e8d8bfbf283ca73ef5e7e26a87b5c9dd2abfe91eb84d922ba1a2bf6a0ee2ea569afd00017a899d2febda3d75671964171367092d0eaf1b65d4b8a39eab62c8f3891fbd5de7cdaf706aadb99aed924d21e8bd3b2abbf3000aa6aac7cd7f5ce18359f5d8c4a6229b5f93411b22753fc753e708b3886edc5aeb71fa4b32c1b2631cfd26c0912c1fba36fd45fb9bc6c851d0a1b1d6626eb572db66d51a5a91b556f419c90a2ad58b71ecef054301c8c123e03de93ff8f280e802ca29bd3b5a6fa8b990eddecc0fabd71c3b683ef0083b43f9fe8c4a06dbb5340a8928d977ac729fce780806a0ecb84a16e0d17e59879c4d1d2f935ca947b0bd467b4d91767620394e4fbfe5376d9a3b4c601b6b9c122cb8a30ae642763c251d75f12cb377df4595ee993b2a8720dfe7d0722ebe9e3d4540e1a3bee257d90e83e13fb6fac49d32287fc93ee8dc7ffd000123500cf302259899b47f0702a2f52efc1294fa81d307c144440268b6732cc28715be22d150f6302141ae646d98b93f6034de28af910b94e4b136416cba12847554f5cb2d47a31d4835d3f07ebfa2d94ed710a367c818394eb04e803571a8f91e9c73dd29b7045a7f70480a57aa513f8bf667fdd216c8735c0c4647f847cb21f5a12952c23626cfe81aba94311193547584ace27f5760093e1f822d89d1a32dc486ebdf08fb280e87e8381659182dff48403d5f75605d9525ba3eca2bf5542edbaf66fab3979bafcae2d749acf065d29d1bf9e96e29e40388a1da1537a978a7dd47a4c8a44a9b9416015a23ab2abc895ff9a1cd7255a1b90422a544cce7ec689dfd0001e0c30337549c24af89de0971fe2fe6e2dab86ff992ebc79cead8eeb4de25fba47426531499dd49ec980b009c9c5f3a21e21ed49301731360b6eed3445a96c915ef0b23f3e9290083adb69cbb6f026835d7817568d453583facd664b800bb5ecf2912ffcd1d83dd67a1474f83d5f3d9c60248d798ee22c2316f699c6b8b68e886c1f0006d413d78783ca146ec356293f01d48d8c14fa2d411cdc237a8d37bd4cc913f1470c4de2231766f0592da2bfb0da8388e5147e3afd46ae9a39bf0dc042feaa697d631df24c3ba54ad231f486001e5d09cc06bb4e6a11191c0c4bca1b5410dfdaa85efe27fda8c1a67af50f696a9361ca60a7aad16119497066f64adaa80fd0001ffab70ddb0591ee64d92be44e65f01c8a405bd2b57d5f10738e43f5a1fbe9065b2beffcda8896102f13240875a1006281f0fbba79ce4f2e243ebbfb9f973177e09de0215e2d23d31061479367d83a7fcb4a970a0d6d660b24ae2167361167f88f93c81a48e9f9fbb8535ddacfd66f1d25eff079968107bb43d336c5b2f758c446fe05d2cc3876cbdf79ea0059041a29d31dd8c961546e453a6f8d92d20485391587d4ca1cfa69e94a491f8d9ad38c8063f39dd27fe89d6b44822becd57d37d825785da30b0c11e15bc44724ef8cd8b26ed5ae1010566d5a3d1242ed38bfa2cbe357e68bd59ddf21630a7d167da7e99f12519d04ede69e7686783ab2565a61399202714923a3aa83f036043d9ffd5bc4407db3458473cccee4870916d0f9639c85cfd0001a95bec721b247e84d5c2f836c33bed244dd7f73a5b91d2816f14d80e4678cff79c2053c89d50fae9b6a76d5127d2f43fc26f3bae21d34fe009d8c925bf762a10f16d37317702d113cd68b59bb2d2c3128c868c4d85939f1948981400b0cec49de82749c7f8b56fc60610d6663e779d6b4c28bccafa57f7cbe258c7d1b2dbd5c0e8901b3ccb4e8ce31bf5fd1474912e961d665a07a11ea57cb44ccdf2efe1f49d2a372cdb61236c4e7e67e8c5505b0de69fedf00ba3de16d4f4ccf71dcdfd31394c38d2f3f700a7ca196c61c40a98c94c476092ea05e7b27990d4e8a640362b9a7fc15b8a1a903517675b221ec028bea3e4028de65d05a96a92a96fb7e7cef083203d924d1a42f993fa47b19d304e561bf75130e7861225364212fdd7b374c7cb53fd00011293fc9f97b27c312f6339d186df32788a57eec1fe30e13673a9101f9aa4a027a2654bad71de73065ce703ef501f4b177ce940559fd75903ac6ac5b477f022d00ed7a2e638cfcd06556699e24564f983a89057131e5bef5d30c55eb4204470348790bcc3b2bd9909825586c67ea49f6b595731a0f2855ba32d394b44c53e7182124e7bb8a25df7b09406e9b341e537e14851a23deef49caf3a246c63363b61efaca126c384273d631729d63acb2392e1e6ccec7da38e715642d9c4672c99df285ad1bb65216159b7d8d9a0f0ab30f7ee95d1924ae365321357596996a47e8259b52f3f8f6255dfd9b5037920d1d23e8bdce6096130d28d11eebcfc6bb7036990203c359af1064ea2d9c7ce76b3a103c381d8b45710690d246ecc3a7889ed43f35afd0001fb69de86c76493d67c655b3fd10190e9be97a002e3afad7a613c0bf73be252ed558d99b16e3e4223aa31e87a3c0dd985cb367fbfb6733205142107ba028e84ce5adb6787a4dc5e39a569345698ab6ba4257ae773e828aa8988903fef7a187dffa478856ad35e3170f5f3617a4d94d003337bc98afc50a317ffd78f17311cc7e39b42585c67f6b7ad70ea379468c9537512f3b90f10ff2d42d757912a2179d9154b162460f6ee20abe2880d14ef3f1df216823d6fcfa38c2c8893c5cd31db91ccaa2a93d4909b7a6db21230a986f2e08a6f37631edc93ecc82d86f52089e67a2f5265571865554485aa1f2d8e306f668ce972964dab328b72e233e4571e84df9cfd000192c963896ccac0ea89232f292b467f82e0a3b4563ea84444859b5c41fbac8f73e2772d3de214dc91259625c0b241ca600036f53736cfc8b870a87d7ec6951c8cdae9cfc3e7edc4cfd5dc064846d84d04725d13068b99e61e9047471b50e321510af23bc5ad1b6593f9257ba8b27b64dabad059737c9407b2bc2830168649cd15a6d62307146c705a39fc59a24eb25fa18c8a98e3f0f0d22593b367f3fabc64064baf4f383ba0ef3d2032c7a412c5a4d74c940b1fd98efd3e4141a387d923240aec8874251660e2be602155e602e61eb1e14dfec18f2bf92f38573c5e9b4fedf4e801d3edb0ebda156a31edeaa3289dd6dd380e68627240bc06f39066f8ae95abfd0001c3374909c5e2a43e001db4ca5c46e5309236ab5a7e4573c28e5c7c0149592ea5fca3c0e9516909063d404f7801d7d9e4758057d551836b96000e506d4a0574dfaa6df6362aac53ef00221a4612e2cf49a91c1c0a097159dc8635ec3020aae9b76081eff374644c4ad7a8e7ea236c1a256386fa04f19b583315a08edaad2068fc6238314d971c2f0c72f8c44e52600713f07f4235703700d4c956c945f9bc1d0ea51b2a43ebc842b8432ab8b2fda22c43500400add03352971b9be3549cb1957aab51a27dfd95922c042b83102841bf11d8071aa48fee769669c3b77465f32176687f4dce4e6550c2156c083835a8e65cd3a87177df4f68093b0468dda4aca89720ffdfe77a83ca0d93cf551d0037da04e6cc88a615843529fa2cf285e2d2453d18fd00013f7b1ba5d450d52361a9af3c24beb66ef0310cd2c3ce8094831424b433880015c7cd453d0a347f8306d9adb7752e1951519c30595dd0cd3de35e7232c928ed50924ad56be46d6671ccb10378d495269b39c877d2bfe8f136538acbb8b97e27b87fbeecd48d49996948d3b7c61cedbea9c7f88beda192ad8314f5ccc7a4edd98bee1571e13218ee06a9020dc49874dc90dfd30e10bf0ff65a93f1a54a8c055e402dc859651ec03bf2661adf67e616e613054338c9e30a084fd5b30974c560a4e1b7ecccec07149eeda9ec0a648037a7c75316e21041aa8602b41d377d38c840a27229559bbcc6cdee7cee2099cecacc839064131852c04f23c12ba79cfa44319a2094acab4b7debf548702915d13ec3b6574dbe085e74c373dc00c2912576823548200d9edb9dd62e260f824e487a9a1045af448d640ed7daec3065674dfc353d990720605ed0dc9af0a82792977c42191955c91035926ebd41101093b6ae53fddb5568201852b299cb7bdc4918f2a43bb1517d96392336c95136a306ec8d9d8355478c7dfd0001844469dd60ff2e7af11e0141885b797f78c9b3487ed5b00cab18b643623b3d718441beaafd35db8864260d21b56078f42a2e2252bd733f60e1dedff75506270f88caf4578937b861ba7124b2a13c31540e63c64d1aa1e1fcb0fbdd89ddfaee5f46c445ad367796e10f6ea3081891da67700b2781ed37c2d6b007b4ba6133d381376b79cef0b406c827f78426c26021a32c5867ba5841c8c02c83fea6802ab9430429d0de9ad43ec2b31bfd1cb6fac562c3091c91d0aab4731bf02f267b0f2ab1fdceac671fc1ea50dc74c11efeb6c73cf2c6fb15dd643f53aaa5c02d38f9877d486c4acc0cd64a73fc47eb3ff5a7ab69cb1c4c56eafe87a45280b2b1fa1a54a32031e10bfd556356ee57b80a7495343c11c0f848895217bcc66374db06e0d9c551fd000173cd1d76d395109e90520e88424d2632fb30a20b99fe66ed018ced219d2d2b04f9414e8d2becd31d22d04b38080e33c5f4740763869a8a4f36d5337efe400693d73eea2f7ad3c16db995623874dd1827137e50873cea1477b0ca7fb6d20dd3c657b9a6539c49102d251c8ff864ceb178d8649ae898ccaa6f102485670de4fbba02fb43fce8fda52b52f787a5bb6827317462b1d4f91068da35bda7a54e2b71861c0f18f13e428bcd7f3ba9692aa1aad3e3fdaff6daba10f2375a4224cfcbff1513668f7f243acdbad3b2e42c79ea777bf13b16b08e963a5d884ea1ce866f4506fb4b3e9335ce1c1ba4e8e6ebfb695ecf687c6c6ebd4347bb075b9c551355d28c200401ec64a5b40750518aa27fdf99d13748548f418127ae264a00a4cc729ada4bfd0001f8e40abe5fdf9c01a306891076592e4dfe48779cab717da1884289bc4e83bb8e43518fdc05791ee54e5beb76770537230f2a8ac088bf7e74f7e5aa5653eaa40014ea9bea78e6ade2036f37c82c74cbb6f9329a5985aea8bf3d29a5e7a1bb499ef9acdd45939f2ebb79b22c7664bfcfcff8f07f5f2c6cfb0cbd298214ca55dcf31707b2c9cd91c21dcafbd305692409766773d2078ce288e90d6afd10d94a8bd46a2574fdd6d36fcabbdbc8ef1f450e44f9df9106b20da791396b2fc3545e3d1d1c0f7c937eb3c747a1c85d51fdd8d4a4abfc975a0b0f99dab0c1a19229f756ab91abc7473d11c6bf45bf65617322407c4b026cffce47c83ccb166acd8398bc9efd0001e2a88a3eaf5a1fda574f722a00b618c46264db25a63a5d328b369b0840884147422eaa83d419c9369a1cd636b3b48520035caa8690a866768ff6ddc3f40759e21b1f6beccc88b26f0389c3a369054668697599d6c83a1197748eab8689be7d3e4c8e825ab3ba9f4895658aaff0c839a0b8fb0433287906e5288e08926e577fc5f8f7e981d814e2cd8ba3bb26a68060b40e2e91876f9a714b9c673fbf838424cad2bce9be762d6e53fb1b56bc7bbf014408dbd4b6c9d2ade1728a727408689287508c7aa59b1c1c4118dcd5307cab6fc7a743e9d8c6878c9d362263d7e743eedf7efae34fcb75ac890f00271bb5f8d3dc2d389865a84447c3b9ba5381c6bcbd83fd00019214fa7106e5240b71919c096b6fe53767da7d908b70359c5475926882ec9db0258784ad6ef61c708dc150094b71c150a1379132800daeea3a298d67b1690a83d99df2915b3e45e9830e37ed9ca6733b63e607e3151c2bf4827f495108cc705ab1e86e5660b77f0d09045ed8a52d6bc4d8ba81f400c18d817168897f10cd4e2cd7eae87c0277e02ddfbd729ccea15229a4385476ca1b3101c395df4c37860e45f8153d5f82f6765e3bca3f8fc712745202ad3f562df5109f16a2fdaa3f5dc0fe159d2253e577d5b832c6e6e7db335ba1e926cc1ab63af03e0f6173bc70b29859fc64ba1d12ba0b909da418d30c2b6488e7c10936725ea7668a0182bc217f508620ed88514c4caadd3fe2e91b4aabd6713f501a830556f9d3d71af166cd1c88c149203cd0a5764a043220ab3c9948d97669f111fbc2c412bf9546504814d43f3cd2722019f8fe458af202a05249309c8c3b71f624fb1b4acecc87392c98b2fbae144573fd00010acb5cd63ab414d905e2284bc169f625c027be14624862b461bbdb220b314cd334c2d83ef59ba6590d5e2bc83084e7621e11b258ccb8f162d2ff4fffd8b02e12e8f1a8ea7564cb697b9ebeb47bf71e47aac86998f16cf94bf4df8b7dd9ee4bdaf425d3528dd6a1ade67e3b9923b6010aa3175a1b785cffbecef0ad4ff7a76c3cde5c51a29883a95e5d0e36cbfc3eb035a160b848531e648e9392ee5d57d00763a8f413a36289c7888e807334d2101da7aeb430075e442c2be25005d1e338801abc23c34af639869aa745c0940d8bf2ce0463a21e5748c3c44a028b7c6ddd5f25dcd3313fbb3f73ae2fcd2e35660750dddff669118248636f77909236b515149d20460532dd4945380037555ec2ab9a8066a493c0faa480730baa8d218a3830f06ffd00019b2aa5050ace16afeb2b7aa10c45d9324606675b77dedf0d29e20635d0186f9fb7ad0af89c640d0ee2470f54bec8d2968728879d892ff5390e60e071cf852b6c93bec0202099d04315e026ca79d626af504c2ea0f024fb30ae87b44e3916f5047eaa8016c8e85d2e37ff292ca4122efa94edd572521703e58af6b85881053a19f56c1b58ab252c6172aa780954096057b00d0086e7aa1702a16d32d67d05f21ff65f824a2ae27a655bf53107a3aa4b8995d10aa76e02a54a73d73f3276489691b6a6f5d641a87c904a445a6b460593ba54ef810abc29788e6973e72bcf62b75815a748273da8f89fe3f9225450d15d24ce964d8a7337c8bb362858f6a4c0d8abfd00010e90eea322b9325f8f0df687e6136d3f3db84cfc0599ca0bc8c9ad3ae2a2629c28b956f8b323c3c0a2f508dcaa3ee31e03a20541069addc0da07b68c0821e08042a9eb86e9a33d30bf5341d12bdc55d4d75d208389266f3ed292cd4bef8b5bcbd0f604f2b9ee6810bce4f604d61fda3b9bac08f87ad48b0c33af7331f837f40cce178ae1ae8f07f6f63047c2a598b28ed9672fa53e530c79883494c73aba52767b9524c82e1d637732bb9064dc1095bf24fafb8c7920566686529539acfaba525b2f1cf9850b29550e3b3c4caf1692e0f11686c919f993b7f10ce7a31521a2e9be97a025c09f2ef2b849cbcdc506b5a2b01608904f5ddfa9e1444970855ad1acfd000168ffbfa84bfe5c4f4b49e1cffe3de7a4329c4710c97de9c72ee9c6412009acfeba45d99317755f4bab02ae8700eba5c6267534139e878422516d47543dc0fe5c8f4b11c6758fd6ce54e51dce503581068e217b4d62e89f115faa0357fa7301b9dd509b1b9d4a8156b6527926c6442eedd8bb50ecf1d63820ddfa72975e7980504e147ca250b61287b400be32fbe3d69a501edc04424f36bc9d37ad10cc394ce8812ac354295b16017bcb6b955efaf86ace0d356f989161c3d957469024fdd6f29d9debe3af295bdc1aa4a40b7e9d19f212c9cdfb272ec8ad9c99aac7a6453c89a087ca127b07eacf62b71d897e2a9b3d7829f9e163c06be5916d18731b41efa5206b559f18768e61d3ec3eea4447343d5d77885bdb810138612d79a4348ec2ae73fd0001237d9e54fd1ab934695d09c877ecf20238aed56c00fa0575de6868d2ddd2a25d5e406f66d5af980834cda2a813a8dd332be7a025d21f862bff45cf738f6faaa2f50ec19ec208ac3f2d097478d21e263db8b365f05429386a812dfca499dd993c29f62c2a1f92e6d77beda1b8a07f04cebfd268a4dba8a2622be5ec2f55c329e9f8c3590f9e12e8b3db79f255f6f37bbbb736d66347cbc3b19940b75dd1c73cc794e6b3231b101e9bb0865eb56dfc15857d1f13dd5c76cd1bcb83f56a5a9905a54541e995e0fbf0dcb8214a79fa72b0f4facc11f94b65a535603c6c33f5ff71537cd071b4c0416e8cdb5dd853a87030efd84fa5cae856b8091c3d85655ec40b9586ed7cfc35212a7ac5458224073857be715a222e147ccd35538e5e03d114dc7ce2bceae5415b756c8704c232a66583a091ccdef84d0a48880f7caa52ab15b06e60f4daf0a28f13bb04046af73894cb4b3524b3dbeb018620af2117f48c0440bc219eaa556c26271eb1559c5f64735dc1ddc1e2fa34d0168e3b0fd2372cdb2d6f22e3ef0a815cf518345fe373dda4d3b2885fff7bfbef16dcdde66851d50e29d8c52e30ba02ac540213f94eb6e5052212bd48275973fb77bc9f3157cb1fd5027cc8e60a2e12e64228a861f1803977380b309cf94ee72960784b0605f41e46a08bfd5ce2ea389620a0f4a50d6a4474989a1b8dc36e6dd16153aa06bca2d229b9e822c029e2b7973ca82885e9dbf299c91afcfd53dffd3dac0d6eacffd1611d59d78873c59ed951f21bd1cb41ad421e229d02fad33bbd3f7b3e1dc81c6045798abcad79a17e3c0cb175fb04a6a1b768eba3e4732175516d40b4eb149fc3a1602a3cab3d19a4b79c45e5d26ccd96ada10b16671d060600a72566215bc4ed79aabb88695a7dd4f374539410acbbe506c250aebee60b33b34ad987013fcdff1cdcbab4912ef8937bbf1f6e5faa91fb6c1a8f55906be6b894b008f84d39f2d469fa5203abc38b787959ed22a59937b8316019ec261456c113bd6886751df401979cd690449608bf8844e2fec4c6d8a0bbf8773e1c572fdf84c8627a20ce71697256b4dc3f138f6a5eb98f6bdc07b7ddf77c0b832ac52c6fc919ce5a294057d5abb90eb87459260aa4a804cad4a262970b7d061e7c46412ffaf649e645df9ff092c271ca1308e7951f103f905b244bd757b8be7f1839d949e23ef3a37199aa32a0d4cb0a5926167ec7ac5a6bfee834ac03c084378c8da3cd91676e3fade2360d620037dcc572882704539144b16c22658b31e92d33a8247e8417dc5a8ab37cac81d679e33ebf6a4fb53c14148025b901b72b90da31a410cd56042f38f5b84e6ea9992f91c268bb093e4c4e334a210bf1a71936489047c13740b4953e3c772b859f89e0c54585c00bb51fa6e1a78100022102a4bcf5e9ec8582f5fddd3589899e51ea3c7503a1ecf47a5f426b9f2e6290a1d9473045022100e1999ec1e8e9119da1c68415d9b75ca1506dfe1a37aeeb56eaeff123dcc6232202202dedc6802eee94793455ee6731ca8ff7bf574d19a8dc3d8b7fec7d880cca185c00"}, + want: []string{"Zerocoin Spend"}, want2: false, wantErr: false, }, { name: "zerocoinmint", args: args{script: "c10281004c81c92ce491443c7c4fb4794c83c459353002cec18382098392ecd43d62519f9db08151e0176c864794723c22851580de24f24183dbb44a7cc91ceb1a34524680c42a10b0f1a1f846f740d1bf16940636b1bd7cdfe28834d8b4b312a13442f01ed4b9ed20aae6ed0a4c39aa9697ab6eb4aea90013aee86cc10862490390ba53b7d100"}, - want: []string{"Anonymous c10281004c81c92ce491443c7c4fb4794c83c459353002cec18382098392ecd43d62519f9db08151e0176c864794723c22851580de24f24183dbb44a7cc91ceb1a34524680c42a10b0f1a1f846f740d1bf16940636b1bd7cdfe28834d8b4b312a13442f01ed4b9ed20aae6ed0a4c39aa9697ab6eb4aea90013aee86cc10862490390ba53b7d100"}, + want: []string{"Zerocoin Mint"}, want2: false, wantErr: false, }, diff --git a/bchain/coins/pivx/pivxrpc.go b/bchain/coins/pivx/pivxrpc.go index 447955f..8979ee4 100644 --- a/bchain/coins/pivx/pivxrpc.go +++ b/bchain/coins/pivx/pivxrpc.go @@ -43,8 +43,14 @@ func (b *PivXRPC) Initialize() error { // always create parser b.Parser = NewPivXParser(params, b.ChainConfig) - b.Testnet = false - b.Network = "livenet" + // parameters for getInfo request + if params.Net == MainnetMagic { + b.Testnet = false + b.Network = "livenet" + } else { + b.Testnet = true + b.Network = "testnet" + } glog.Info("rpc: block chain ", params.Name) diff --git a/configs/coins/pivx_testnet.json b/configs/coins/pivx_testnet.json new file mode 100644 index 0000000..3db4d64 --- /dev/null +++ b/configs/coins/pivx_testnet.json @@ -0,0 +1,63 @@ +{ + "coin": { + "name": "PIVX Testnet", + "shortcut": "tPIV", + "label": "PIVX Testnet", + "alias": "pivx_testnet" + }, + "ports": { + "backend_rpc": 18049, + "backend_message_queue": 48349, + "blockbook_internal": 19049, + "blockbook_public": 19149 + }, + "ipc": { + "rpc_url_template": "http://127.0.0.1:{{.Ports.BackendRPC}}", + "rpc_user": "rpc", + "rpc_pass": "pivxrpc", + "rpc_timeout": 25, + "message_queue_binding_template": "tcp://127.0.0.1:{{.Ports.BackendMessageQueue}}" + }, + "backend": { + "package_name": "backend-pivx", + "package_revision": "satoshilabs-1", + "system_user": "pivx", + "version": "3.1.1", + "binary_url": "https://github.com/PIVX-Project/PIVX/releases/download/v3.1.1/pivx-3.1.1-x86_64-linux-gnu.tar.gz", + "verification_type": "sha256", + "verification_source": "aac5b13beb9ff96b0ce62d2258d54166c756c8336672a67c7aae6b73a76b0c03", + "extract_command": "tar -C backend --strip 1 -xf", + "exclude_files": ["bin/pivx-qt"], + "exec_command_template": "{{.Env.BackendInstallPath}}/{{.Coin.Alias}}/bin/pivxd -datadir={{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend -conf={{.Env.BackendInstallPath}}/{{.Coin.Alias}}/{{.Coin.Alias}}.conf -pid=/run/{{.Coin.Alias}}/{{.Coin.Alias}}.pid", + "logrotate_files_template": "{{.Env.BackendDataPath}}/{{.Coin.Alias}}/backend/*.log", + "postinst_script_template": "", + "service_type": "forking", + "service_additional_params_template": "", + "protect_memory": true, + "mainnet": false, + "server_config_file": "bitcoin_like.conf", + "client_config_file": "bitcoin_like_client.conf", + "additional_params": { + "whitelist": "127.0.0.1" + } + }, + "blockbook": { + "package_name": "blockbook-pivx-testnet", + "system_user": "blockbook-pivx", + "internal_binding_template": ":{{.Ports.BlockbookInternal}}", + "public_binding_template": ":{{.Ports.BlockbookPublic}}", + "explorer_url": "", + "additional_params": "", + "block_chain": { + "parse": true, + "mempool_workers": 8, + "mempool_sub_workers": 2, + "block_addresses_to_keep": 300, + "additional_params": {} + } + }, + "meta": { + "package_maintainer": "PIVX team", + "package_maintainer_email": "random.zebra@protonmail.com" + } +}